/ Hex Artifact Content
Login

Artifact 1ecf68522356a90471b07178e186277090d0b027:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t.h"../*.** This
02f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
0300: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 53 51  ed when a new SQ
0310: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 62  L statement is b
0320: 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62  eginning to.** b
0330: 65 20 70 61 72 73 65 64 2e 20 20 49 6e 69 74 69  e parsed.  Initi
0340: 61 6c 69 7a 65 20 74 68 65 20 70 50 61 72 73 65  alize the pParse
0350: 20 73 74 72 75 63 74 75 72 65 20 61 73 20 6e 65   structure as ne
0360: 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eded..*/.void sq
0370: 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28  lite3BeginParse(
0380: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
0390: 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29 7b  nt explainFlag){
03a0: 0a 20 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  .  pParse->expla
03b0: 69 6e 20 3d 20 28 75 38 29 65 78 70 6c 61 69 6e  in = (u8)explain
03c0: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
03d0: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  nVar = 0;.}..#if
03e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
03f0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0400: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f 63  .** The TableLoc
0410: 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  k structure is o
0420: 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
0430: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0440: 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54 61  () and.** codeTa
0450: 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63 74  bleLocks() funct
0460: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ions..*/.struct 
0470: 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  TableLock {.  in
0480: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
0490: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
04a0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
04b0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f  e table to be lo
04c0: 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  cked */.  int iT
04d0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab;            /
04e0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
04f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0500: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
0510: 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20  8 isWriteLock;  
0520: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
0530: 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c  write lock.  Fal
0540: 73 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f  se for a read lo
0550: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
0560: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
0570: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
0580: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  e */.};../*.** R
0590: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
05a0: 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6c  hat we want to l
05b0: 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20 72  ock a table at r
05c0: 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a 2a  un-time.  .**.**
05d0: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   The table to be
05e0: 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f 74   locked has root
05f0: 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20 69   page iTab and i
0600: 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61 62  s found in datab
0610: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72 65  ase iDb..** A re
0620: 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c 6f  ad or a write lo
0630: 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e 20  ck can be taken 
0640: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73 57  depending on isW
0650: 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ritelock..**.** 
0660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
0670: 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66 61  t records the fa
0680: 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ct that the lock
0690: 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54 68   is desired.  Th
06a0: 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61 6b  e.** code to mak
06b0: 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72  e the lock occur
06c0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
06d0: 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74 6f   a later call to
06e0: 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  .** codeTableLoc
06f0: 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75 72  ks() which occur
0700: 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  s during sqlite3
0710: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
0720: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
0730: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72 73  ableLock(.  Pars
0740: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
0750: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0760: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
0770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0780: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
0790: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
07a0: 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 20  e table to lock 
07b0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
07c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
07d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
07e0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
07f0: 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 73  ocked */.  u8 is
0800: 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f 2a  WriteLock,    /*
0810: 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69 74   True for a writ
0820: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  e lock */.  cons
0830: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 2f  t char *zName  /
0840: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
0850: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
0860: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
0870: 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
0880: 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
0890: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
08a0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 3b  i;.  int nBytes;
08b0: 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b  .  TableLock *p;
08c0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
08d0: 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  0 );..  for(i=0;
08e0: 20 69 3c 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54   i<pToplevel->nT
08f0: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0900: 20 20 20 20 70 20 3d 20 26 70 54 6f 70 6c 65 76      p = &pToplev
0910: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69  el->aTableLock[i
0920: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44  ];.    if( p->iD
0930: 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e 69 54 61  b==iDb && p->iTa
0940: 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20 20 20 20  b==iTab ){.     
0950: 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20   p->isWriteLock 
0960: 3d 20 28 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63  = (p->isWriteLoc
0970: 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b  k || isWriteLock
0980: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
0990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42  .    }.  }..  nB
09a0: 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 54 61  ytes = sizeof(Ta
09b0: 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70 54 6f 70  bleLock) * (pTop
09c0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
09d0: 6b 2b 31 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  k+1);.  pTopleve
09e0: 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 0a  l->aTableLock =.
09f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
0a00: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 54 6f  eallocOrFree(pTo
0a10: 70 6c 65 76 65 6c 2d 3e 64 62 2c 20 70 54 6f 70  plevel->db, pTop
0a20: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
0a30: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a40: 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61  ( pToplevel->aTa
0a50: 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  bleLock ){.    p
0a60: 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61   = &pToplevel->a
0a70: 54 61 62 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c 65  TableLock[pTople
0a80: 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b  vel->nTableLock+
0a90: 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d  +];.    p->iDb =
0aa0: 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61   iDb;.    p->iTa
0ab0: 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d  b = iTab;.    p-
0ac0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69  >isWriteLock = i
0ad0: 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20  sWriteLock;.    
0ae0: 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  p->zName = zName
0af0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
0b00: 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65  Toplevel->nTable
0b10: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70 54  Lock = 0;.    pT
0b20: 6f 70 6c 65 76 65 6c 2d 3e 64 62 2d 3e 6d 61 6c  oplevel->db->mal
0b30: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
0b40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
0b50: 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b   an OP_TableLock
0b60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
0b70: 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b   each table lock
0b80: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61  ed by the.** sta
0b90: 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72  tement (configur
0ba0: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
0bb0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
0bc0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ))..*/.static vo
0bd0: 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  id codeTableLock
0be0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  s(Parse *pParse)
0bf0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0c00: 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56  e *pVdbe; ..  pV
0c10: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dbe = sqlite3Get
0c20: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0c30: 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30  assert( pVdbe!=0
0c40: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65   ); /* sqlite3Ge
0c50: 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69  tVdbe cannot fai
0c60: 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  l: VDBE already 
0c70: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
0c80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
0c90: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69  e->nTableLock; i
0ca0: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f  ++){.    TableLo
0cb0: 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  ck *p = &pParse-
0cc0: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
0cd0: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e      int p1 = p->
0ce0: 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
0cf0: 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65  VdbeAddOp4(pVdbe
0d00: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0d10: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0d20: 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20  isWriteLock,.   
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f     p->zName, P4_
0d50: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
0d60: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63  else.  #define c
0d70: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29  odeTableLocks(x)
0d80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0d90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0da0: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0db0: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0dc0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0dd0: 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45  arsed and a VDBE
0de0: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0df0: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
0e00: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0e10: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
0e20: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
0e30: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
0e40: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
0e50: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0e60: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0e70: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0e80: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0e90: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0ea0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0eb0: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0ec0: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0ed0: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0ee0: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0ef0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
0f00: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
0f10: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
0f20: 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
0f30: 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *v;..  assert( 
0f40: 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65  pParse->pTopleve
0f50: 6c 3d 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  l==0 );.  db = p
0f60: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0f70: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
0f80: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
0f90: 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  ( pParse->nested
0fa0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
0fb0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
0fc0: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65  return;..  /* Be
0fd0: 67 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e  gin by generatin
0fe0: 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69  g some terminati
0ff0: 6f 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20 65  on code at the e
1000: 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76  nd of the.  ** v
1010: 64 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f  dbe program.  */
1020: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1030: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1040: 20 61 73 73 65 72 74 28 20 21 70 50 61 72 73 65   assert( !pParse
1050: 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a  ->isMultiWrite .
1060: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
1070: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
1080: 6f 72 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d  ort(v, pParse->m
1090: 61 79 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28  ayAbort));.  if(
10a0: 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
10b0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
10c0: 50 5f 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f 2a  P_Halt);..    /*
10d0: 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b   The cookie mask
10e0: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69   contains one bi
10f0: 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62  t for each datab
1100: 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20  ase file open.. 
1110: 20 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20     ** (Bit 0 is 
1120: 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20  for main, bit 1 
1130: 69 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64  is for temp, and
1140: 20 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74   so forth.)  Bit
1150: 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74  s are.    ** set
1160: 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61   for each databa
1170: 73 65 20 74 68 61 74 20 69 73 20 75 73 65 64 2e  se that is used.
1180: 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20    Generate code 
1190: 74 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a  to start a.    *
11a0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  * transaction on
11b0: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
11c0: 61 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66  ase and to verif
11d0: 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
11e0: 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61  kie.    ** on ea
11f0: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
1200: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1210: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1220: 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 79  oto>0 ){.      y
1230: 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 20  DbMask mask;.   
1240: 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
1250: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1260: 70 48 65 72 65 28 76 2c 20 70 50 61 72 73 65 2d  pHere(v, pParse-
1270: 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a  >cookieGoto-1);.
1280: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30 2c        for(iDb=0,
1290: 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64 62 2d   mask=1; iDb<db-
12a0: 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20  >nDb; mask<<=1, 
12b0: 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  iDb++){.        
12c0: 69 66 28 20 28 6d 61 73 6b 20 26 20 70 50 61 72  if( (mask & pPar
12d0: 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d  se->cookieMask)=
12e0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
12f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1300: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
1310: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
1320: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1330: 2c 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c  ,OP_Transaction,
1340: 20 69 44 62 2c 20 28 6d 61 73 6b 20 26 20 70 50   iDb, (mask & pP
1350: 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29  arse->writeMask)
1360: 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  !=0);.        if
1370: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
1380: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1390: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
13a0: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
13b0: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
13c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
13e0: 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 0a 20 20  VerifyCookie,.  
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1400: 20 20 20 20 20 20 20 20 20 20 69 44 62 2c 20 70            iDb, p
1410: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c  Parse->cookieVal
1420: 75 65 5b 69 44 62 5d 2c 0a 20 20 20 20 20 20 20  ue[iDb],.       
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
1450: 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65  ].pSchema->iGene
1460: 72 61 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20  ration);.       
1470: 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64   }.      }.#ifnd
1480: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1490: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
14a0: 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20    {.        int 
14b0: 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
14c0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56  =0; i<pParse->nV
14d0: 74 61 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20  tabLock; i++){. 
14e0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 76           char *v
14f0: 74 61 62 20 3d 20 28 63 68 61 72 20 2a 29 73 71  tab = (char *)sq
1500: 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
1510: 62 2c 20 70 50 61 72 73 65 2d 3e 61 70 56 74 61  b, pParse->apVta
1520: 62 4c 6f 63 6b 5b 69 5d 29 3b 0a 20 20 20 20 20  bLock[i]);.     
1530: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1540: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65  AddOp4(v, OP_VBe
1550: 67 69 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74  gin, 0, 0, 0, vt
1560: 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20  ab, P4_VTAB);.  
1570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1580: 70 50 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63  pParse->nVtabLoc
1590: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  k = 0;.      }.#
15a0: 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20  endif..      /* 
15b0: 4f 6e 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f  Once all the coo
15c0: 6b 69 65 73 20 68 61 76 65 20 62 65 65 6e 20 76  kies have been v
15d0: 65 72 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e  erified and tran
15e0: 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c  sactions opened,
15f0: 20 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69   .      ** obtai
1600: 6e 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  n the required t
1610: 61 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73  able-locks. This
1620: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65   is a no-op unle
1630: 73 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ss the .      **
1640: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65   shared-cache fe
1650: 61 74 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64  ature is enabled
1660: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1670: 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28   codeTableLocks(
1680: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1690: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  /* Initialize an
16a0: 79 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  y AUTOINCREMENT 
16b0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
16c0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20  required..      
16d0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
16e0: 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67  AutoincrementBeg
16f0: 69 6e 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20  in(pParse);..   
1700: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1710: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1720: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1730: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1740: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1750: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1760: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72  OP_Goto, 0, pPar
1770: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29 3b  se->cookieGoto);
1780: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
1790: 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20 70  * Get the VDBE p
17a0: 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72  rogram ready for
17b0: 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a   execution.  */.
17c0: 20 20 69 66 28 20 76 20 26 26 20 41 4c 57 41 59    if( v && ALWAY
17d0: 53 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  S(pParse->nErr==
17e0: 30 29 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  0) && !db->mallo
17f0: 63 46 61 69 6c 65 64 20 29 7b 0a 23 69 66 64 65  cFailed ){.#ifde
1800: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1810: 20 20 20 46 49 4c 45 20 2a 74 72 61 63 65 20 3d     FILE *trace =
1820: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
1830: 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 29 21  LITE_VdbeTrace)!
1840: 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b  =0 ? stdout : 0;
1850: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1860: 54 72 61 63 65 28 76 2c 20 74 72 61 63 65 29 3b  Trace(v, trace);
1870: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
1880: 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63  rt( pParse->iCac
1890: 68 65 4c 65 76 65 6c 3d 3d 30 20 29 3b 20 20 2f  heLevel==0 );  /
18a0: 2a 20 44 69 73 61 62 6c 65 73 20 61 6e 64 20 72  * Disables and r
18b0: 65 2d 65 6e 61 62 6c 65 73 20 6d 61 74 63 68 20  e-enables match 
18c0: 2a 2f 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e 69  */.    /* A mini
18d0: 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73 6f  mum of one curso
18e0: 72 20 69 73 20 72 65 71 75 69 72 65 64 20 69 66  r is required if
18f0: 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 69   autoincrement i
1900: 73 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53 65  s used.    *  Se
1910: 65 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33 37  e ticket [a69637
1920: 39 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20 20  9c1f08866] */.  
1930: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 41    if( pParse->pA
1940: 69 6e 63 21 3d 30 20 26 26 20 70 50 61 72 73 65  inc!=0 && pParse
1950: 2d 3e 6e 54 61 62 3d 3d 30 20 29 20 70 50 61 72  ->nTab==0 ) pPar
1960: 73 65 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20  se->nTab = 1;.  
1970: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b    sqlite3VdbeMak
1980: 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73 65  eReady(v, pParse
1990: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  );.    pParse->r
19a0: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
19b0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c  .    pParse->col
19c0: 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20  NamesSet = 0;.  
19d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73  }else{.    pPars
19e0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
19f0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72  RROR;.  }.  pPar
1a00: 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20  se->nTab = 0;.  
1a10: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30  pParse->nMem = 0
1a20: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74  ;.  pParse->nSet
1a30: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
1a40: 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72  nVar = 0;.  pPar
1a50: 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d  se->cookieMask =
1a60: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f   0;.  pParse->co
1a70: 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a  okieGoto = 0;.}.
1a80: 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70  ./*.** Run the p
1a90: 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67  arser and code g
1aa0: 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73 69  enerator recursi
1ab0: 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  vely in order to
1ac0: 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64   generate.** cod
1ad0: 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74  e for the SQL st
1ae0: 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e  atement given on
1af0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1b00: 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74  e pParse context
1b10: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
1b20: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1b30: 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72 73  .  When the pars
1b40: 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72 73  er is run recurs
1b50: 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61  ively.** this wa
1b60: 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f  y, the final OP_
1b70: 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65  Halt is not appe
1b80: 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69  nded and other i
1b90: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a  nitialization.**
1ba0: 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f   and finalizatio
1bb0: 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74  n steps are omit
1bc0: 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f 73  ted because thos
1bd0: 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62  e are handling b
1be0: 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f  y the.** outermo
1bf0: 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a  st parser..**.**
1c00: 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20   Not everything 
1c10: 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68  is nestable.  Th
1c20: 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 64  is facility is d
1c30: 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69  esigned to permi
1c40: 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44  t.** INSERT, UPD
1c50: 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20  ATE, and DELETE 
1c60: 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e  operations again
1c70: 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  st SQLITE_MASTER
1c80: 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69  .  Use.** care i
1c90: 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20  f you decide to 
1ca0: 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73 20  try to use this 
1cb0: 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65  routine for some
1cc0: 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e   other purposes.
1cd0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ce0: 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72 73  NestedParse(Pars
1cf0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
1d00: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
1d10: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
1d20: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  ap;.  char *zSql
1d30: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
1d40: 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  g = 0;.  sqlite3
1d50: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1d60: 62 3b 0a 23 20 64 65 66 69 6e 65 20 53 41 56 45  b;.# define SAVE
1d70: 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28 50 61 72  _SZ  (sizeof(Par
1d80: 73 65 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 50  se) - offsetof(P
1d90: 61 72 73 65 2c 6e 56 61 72 29 29 0a 20 20 63 68  arse,nVar)).  ch
1da0: 61 72 20 73 61 76 65 42 75 66 5b 53 41 56 45 5f  ar saveBuf[SAVE_
1db0: 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  SZ];..  if( pPar
1dc0: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
1dd0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  n;.  assert( pPa
1de0: 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29  rse->nested<10 )
1df0: 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68  ;  /* Nesting sh
1e00: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20  ould only be of 
1e10: 6c 69 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f  limited depth */
1e20: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
1e30: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c  zFormat);.  zSql
1e40: 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e   = sqlite3VMPrin
1e50: 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20  tf(db, zFormat, 
1e60: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
1e70: 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
1e80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20   ){.    return; 
1e90: 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75    /* A malloc mu
1ea0: 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a  st have failed *
1eb0: 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  /.  }.  pParse->
1ec0: 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63  nested++;.  memc
1ed0: 70 79 28 73 61 76 65 42 75 66 2c 20 26 70 50 61  py(saveBuf, &pPa
1ee0: 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f  rse->nVar, SAVE_
1ef0: 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  SZ);.  memset(&p
1f00: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20  Parse->nVar, 0, 
1f10: 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73 71 6c 69  SAVE_SZ);.  sqli
1f20: 74 65 33 52 75 6e 50 61 72 73 65 72 28 70 50 61  te3RunParser(pPa
1f30: 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72  rse, zSql, &zErr
1f40: 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Msg);.  sqlite3D
1f50: 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73  bFree(db, zErrMs
1f60: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
1f70: 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20  ree(db, zSql);. 
1f80: 20 6d 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d   memcpy(&pParse-
1f90: 3e 6e 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20  >nVar, saveBuf, 
1fa0: 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72  SAVE_SZ);.  pPar
1fb0: 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a  se->nested--;.}.
1fc0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
1fd0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
1fe0: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
1ff0: 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61  ibes a particula
2000: 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61  r database.** ta
2010: 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61  ble given the na
2020: 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65  me of that table
2030: 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79   and (optionally
2040: 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  ) the name of th
2050: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  e.** database co
2060: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
2070: 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  le.  Return NULL
2080: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
2090: 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73  *.** If zDatabas
20a0: 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61  e is 0, all data
20b0: 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68  bases are search
20c0: 65 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ed for the table
20d0: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73   and the.** firs
20e0: 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65  t matching table
20f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28   is returned.  (
2100: 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  No checking for 
2110: 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a  duplicate table.
2120: 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65  ** names is done
2130: 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f  .)  The search o
2140: 72 64 65 72 20 69 73 20 54 45 4d 50 20 66 69 72  rder is TEMP fir
2150: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
2160: 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c  hen any.** auxil
2170: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61  iary databases a
2180: 64 64 65 64 20 75 73 69 6e 67 20 74 68 65 20 41  dded using the A
2190: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
21a0: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
21b0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
21c0: 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ()..*/.Table *sq
21d0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73  lite3FindTable(s
21e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
21f0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63  t char *zName, c
2200: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61  onst char *zData
2210: 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  base){.  Table *
2220: 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  p = 0;.  int i;.
2230: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 61    int nName;.  a
2240: 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20  ssert( zName!=0 
2250: 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c  );.  nName = sql
2260: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
2270: 6d 65 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75  me);.  /* All mu
2280: 74 65 78 65 73 20 61 72 65 20 72 65 71 75 69 72  texes are requir
2290: 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63  ed for schema ac
22a0: 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65  cess.  Make sure
22b0: 20 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a   we hold them. *
22c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 44 61 74  /.  assert( zDat
22d0: 61 62 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69  abase!=0 || sqli
22e0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c  te3BtreeHoldsAll
22f0: 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20  Mutexes(db) );. 
2300: 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50   for(i=OMIT_TEMP
2310: 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  DB; i<db->nDb; i
2320: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  ++){.    int j =
2330: 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69   (i<2) ? i^1 : i
2340: 3b 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  ;   /* Search TE
2350: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
2360: 2f 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62  /.    if( zDatab
2370: 61 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65  ase!=0 && sqlite
2380: 33 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61  3StrICmp(zDataba
2390: 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a  se, db->aDb[j].z
23a0: 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  Name) ) continue
23b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
23c0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
23d0: 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29  Held(db, j, 0) )
23e0: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
23f0: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
2400: 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  Db[j].pSchema->t
2410: 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e  blHash, zName, n
2420: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Name);.    if( p
2430: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
2440: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
2450: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
2460: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
2470: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
2480: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
2490: 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20  tabase.** table 
24a0: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
24b0: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
24c0: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
24d0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
24e0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
24f0: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
2500: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
2510: 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f  not found.  Also
2520: 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72   leave an.** err
2530: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
2540: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
2550: 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
2560: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
2570: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c   routine and sql
2580: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20  ite3FindTable() 
2590: 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
25a0: 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61  routine leaves a
25b0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
25c0: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
25d0: 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69  sg where.** sqli
25e0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64  te3FindTable() d
25f0: 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c  oes not..*/.Tabl
2600: 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  e *sqlite3Locate
2610: 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
2620: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2630: 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68  /* context in wh
2640: 69 63 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72  ich to report er
2650: 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73  rors */.  int is
2660: 56 69 65 77 2c 20 20 20 20 20 20 20 20 20 20 20  View,           
2670: 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b   /* True if look
2680: 69 6e 67 20 66 6f 72 20 61 20 56 49 45 57 20 72  ing for a VIEW r
2690: 61 74 68 65 72 20 74 68 61 6e 20 61 20 54 41 42  ather than a TAB
26a0: 4c 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  LE */.  const ch
26b0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f  ar *zName,     /
26c0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
26d0: 62 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  ble we are looki
26e0: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  ng for */.  cons
26f0: 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20  t char *zDbase  
2700: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2710: 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67  e database.  Mig
2720: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
2730: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20  .  Table *p;..  
2740: 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
2750: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
2760: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2770: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
2780: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
2790: 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
27a0: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
27b0: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
27c0: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
27d0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
27e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
27f0: 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74    }..  p = sqlit
2800: 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
2810: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  se->db, zName, z
2820: 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  Dbase);.  if( p=
2830: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
2840: 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56  char *zMsg = isV
2850: 69 65 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76  iew ? "no such v
2860: 69 65 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20  iew" : "no such 
2870: 74 61 62 6c 65 22 3b 0a 20 20 20 20 69 66 28 20  table";.    if( 
2880: 7a 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  zDbase ){.      
2890: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
28a0: 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e  pParse, "%s: %s.
28b0: 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73  %s", zMsg, zDbas
28c0: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, zName);.    }
28d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
28e0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
28f0: 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d  se, "%s: %s", zM
2900: 73 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  sg, zName);.    
2910: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  }.    pParse->ch
2920: 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
2930: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
2940: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
2950: 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66  he table identif
2960: 69 65 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a  ied by *p..**.**
2970: 20 54 68 69 73 20 69 73 20 61 20 77 72 61 70 70   This is a wrapp
2980: 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
2990: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 20  3LocateTable(). 
29a0: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
29b0: 65 74 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65  etween.** sqlite
29c0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 20 61  3LocateTable() a
29d0: 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
29e0: 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75   is that this fu
29f0: 6e 63 74 69 6f 6e 20 72 65 73 74 72 69 63 74 73  nction restricts
2a00: 0a 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20 74  .** the search t
2a10: 6f 20 73 63 68 65 6d 61 20 28 70 2d 3e 70 53 63  o schema (p->pSc
2a20: 68 65 6d 61 29 20 69 66 20 69 74 20 69 73 20 6e  hema) if it is n
2a30: 6f 74 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68  ot NULL. p->pSch
2a40: 65 6d 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f  ema may be.** no
2a50: 6e 2d 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 20  n-NULL if it is 
2a60: 70 61 72 74 20 6f 66 20 61 20 76 69 65 77 20 6f  part of a view o
2a70: 72 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  r trigger progra
2a80: 6d 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65  m definition. Se
2a90: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53  e.** sqlite3FixS
2aa0: 72 63 4c 69 73 74 28 29 20 66 6f 72 20 64 65 74  rcList() for det
2ab0: 61 69 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  ails..*/.Table *
2ac0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
2ad0: 6c 65 49 74 65 6d 28 0a 20 20 50 61 72 73 65 20  leItem(.  Parse 
2ae0: 2a 70 50 61 72 73 65 2c 20 0a 20 20 69 6e 74 20  *pParse, .  int 
2af0: 69 73 56 69 65 77 2c 20 0a 20 20 73 74 72 75 63  isView, .  struc
2b00: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2b10: 70 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  p.){.  const cha
2b20: 72 20 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72 74  r *zDb;.  assert
2b30: 28 20 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20  ( p->pSchema==0 
2b40: 7c 7c 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d  || p->zDatabase=
2b50: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
2b60: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e  Schema ){.    in
2b70: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
2b80: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
2b90: 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68  rse->db, p->pSch
2ba0: 65 6d 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20  ema);.    zDb = 
2bb0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
2bc0: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 65  iDb].zName;.  }e
2bd0: 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70  lse{.    zDb = p
2be0: 2d 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7d  ->zDatabase;.  }
2bf0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2c00: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
2c10: 72 73 65 2c 20 69 73 56 69 65 77 2c 20 70 2d 3e  rse, isView, p->
2c20: 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a  zName, zDb);.}..
2c30: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
2c40: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
2c50: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
2c60: 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63  bes .** a partic
2c70: 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e  ular index given
2c80: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
2c90: 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  t index.** and t
2ca0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
2cb0: 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e  atabase that con
2cc0: 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e  tains the index.
2cd0: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
2ce0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
2cf0: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
2d00: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
2d10: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
2d20: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62  d for the.** tab
2d30: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  le and the first
2d40: 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20   matching index 
2d50: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
2d60: 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f  o checking.** fo
2d70: 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65  r duplicate inde
2d80: 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  x names is done.
2d90: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
2da0: 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66  der is.** TEMP f
2db0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2dc0: 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69   then any auxili
2dd0: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
2de0: 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ded.** using the
2df0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
2e00: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
2e10: 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69  e3FindIndex(sqli
2e20: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
2e30: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
2e40: 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
2e50: 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20  Index *p = 0;.  
2e60: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61  int i;.  int nNa
2e70: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2e80: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 2f  en30(zName);.  /
2e90: 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72  * All mutexes ar
2ea0: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  e required for s
2eb0: 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d  chema access.  M
2ec0: 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64  ake sure we hold
2ed0: 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65   them. */.  asse
2ee0: 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71  rt( zDb!=0 || sq
2ef0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
2f00: 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
2f10: 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45  .  for(i=OMIT_TE
2f20: 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  MPDB; i<db->nDb;
2f30: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
2f40: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
2f50: 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54   i;  /* Search T
2f60: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
2f70: 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  */.    Schema *p
2f80: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
2f90: 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [j].pSchema;.   
2fa0: 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61   assert( pSchema
2fb0: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20   );.    if( zDb 
2fc0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2fd0: 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a  p(zDb, db->aDb[j
2fe0: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
2ff0: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
3000: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3010: 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30  texHeld(db, j, 0
3020: 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  ) );.    p = sql
3030: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 53  ite3HashFind(&pS
3040: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
3050: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
3060: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
3070: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3080: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61  ;.}../*.** Recla
3090: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73  im the memory us
30a0: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a  ed by an index.*
30b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
30c0: 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  eeIndex(sqlite3 
30d0: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a  *db, Index *p){.
30e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
30f0: 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71  MIT_ANALYZE.  sq
3100: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
3110: 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a  Samples(db, p);.
3120: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
3130: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 43  DbFree(db, p->zC
3140: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
3150: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
3160: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  }../*.** For the
3170: 20 69 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49   index called zI
3180: 64 78 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20  dxName which is 
3190: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74  found in the dat
31a0: 61 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e  abase iDb,.** un
31b0: 6c 69 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20  like that index 
31c0: 66 72 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74  from its Table t
31d0: 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69  hen remove the i
31e0: 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  ndex from.** the
31f0: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
3200: 65 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d  e and free all m
3210: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
3220: 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
3230: 69 74 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ith the index..*
3240: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
3250: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
3260: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
3270: 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63  int iDb, const c
3280: 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a  har *zIdxName){.
3290: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
32a0: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 48 61  .  int len;.  Ha
32b0: 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73  sh *pHash;..  as
32c0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
32d0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
32e0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48   iDb, 0) );.  pH
32f0: 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  ash = &db->aDb[i
3300: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db].pSchema->idx
3310: 48 61 73 68 3b 0a 20 20 6c 65 6e 20 3d 20 73 71  Hash;.  len = sq
3320: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49  lite3Strlen30(zI
3330: 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65  dxName);.  pInde
3340: 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  x = sqlite3HashI
3350: 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64  nsert(pHash, zId
3360: 78 4e 61 6d 65 2c 20 6c 65 6e 2c 20 30 29 3b 0a  xName, len, 0);.
3370: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e    if( ALWAYS(pIn
3380: 64 65 78 29 20 29 7b 0a 20 20 20 20 69 66 28 20  dex) ){.    if( 
3390: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
33a0: 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29  pIndex==pIndex )
33b0: 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
33c0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
33d0: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
33e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33f0: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20   Index *p;.     
3400: 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f   /* Justificatio
3410: 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3b 20 20  n of ALWAYS();  
3420: 54 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62  The index must b
3430: 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  e on the list of
3440: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 65  .      ** indice
3450: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 20 3d 20  s. */.      p = 
3460: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
3470: 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68  pIndex;.      wh
3480: 69 6c 65 28 20 41 4c 57 41 59 53 28 70 29 20 26  ile( ALWAYS(p) &
3490: 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64  & p->pNext!=pInd
34a0: 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  ex ){ p = p->pNe
34b0: 78 74 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  xt; }.      if( 
34c0: 41 4c 57 41 59 53 28 70 20 26 26 20 70 2d 3e 70  ALWAYS(p && p->p
34d0: 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29 20 29 7b  Next==pIndex) ){
34e0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  .        p->pNex
34f0: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
3500: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
3510: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64  .    freeIndex(d
3520: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
3530: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
3540: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
3550: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  ges;.}../*.** Lo
3560: 6f 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c  ok through the l
3570: 69 73 74 20 6f 66 20 6f 70 65 6e 20 64 61 74 61  ist of open data
3580: 62 61 73 65 20 66 69 6c 65 73 20 69 6e 20 64 62  base files in db
3590: 2d 3e 61 44 62 5b 5d 20 61 6e 64 20 69 66 0a 2a  ->aDb[] and if.*
35a0: 2a 20 61 6e 79 20 68 61 76 65 20 62 65 65 6e 20  * any have been 
35b0: 63 6c 6f 73 65 64 2c 20 72 65 6d 6f 76 65 20 74  closed, remove t
35c0: 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 6c 69 73  hem from the lis
35d0: 74 2e 20 20 52 65 61 6c 6c 6f 63 61 74 65 20 74  t.  Reallocate t
35e0: 68 65 0a 2a 2a 20 64 62 2d 3e 61 44 62 5b 5d 20  he.** db->aDb[] 
35f0: 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 20 73  structure to a s
3600: 6d 61 6c 6c 65 72 20 73 69 7a 65 2c 20 69 66 20  maller size, if 
3610: 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  possible..**.** 
3620: 45 6e 74 72 79 20 30 20 28 74 68 65 20 22 6d 61  Entry 0 (the "ma
3630: 69 6e 22 20 64 61 74 61 62 61 73 65 29 20 61 6e  in" database) an
3640: 64 20 65 6e 74 72 79 20 31 20 28 74 68 65 20 22  d entry 1 (the "
3650: 74 65 6d 70 22 20 64 61 74 61 62 61 73 65 29 0a  temp" database).
3660: 2a 2a 20 61 72 65 20 6e 65 76 65 72 20 63 61 6e  ** are never can
3670: 64 69 64 61 74 65 73 20 66 6f 72 20 62 65 69 6e  didates for bein
3680: 67 20 63 6f 6c 6c 61 70 73 65 64 2e 0a 2a 2f 0a  g collapsed..*/.
3690: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 6c  void sqlite3Coll
36a0: 61 70 73 65 44 61 74 61 62 61 73 65 41 72 72 61  apseDatabaseArra
36b0: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  y(sqlite3 *db){.
36c0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f    int i, j;.  fo
36d0: 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e  r(i=j=2; i<db->n
36e0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  Db; i++){.    st
36f0: 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26  ruct Db *pDb = &
3700: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
3710: 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20  if( pDb->pBt==0 
3720: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3730: 44 62 46 72 65 65 28 64 62 2c 20 70 44 62 2d 3e  DbFree(db, pDb->
3740: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44  zName);.      pD
3750: 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  b->zName = 0;.  
3760: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
3770: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20    }.    if( j<i 
3780: 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ){.      db->aDb
3790: 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  [j] = db->aDb[i]
37a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b  ;.    }.    j++;
37b0: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64  .  }.  memset(&d
37c0: 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64  b->aDb[j], 0, (d
37d0: 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66  b->nDb-j)*sizeof
37e0: 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20  (db->aDb[j]));. 
37f0: 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20   db->nDb = j;.  
3800: 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26  if( db->nDb<=2 &
3810: 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61  & db->aDb!=db->a
3820: 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20  DbStatic ){.    
3830: 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74  memcpy(db->aDbSt
3840: 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32  atic, db->aDb, 2
3850: 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b  *sizeof(db->aDb[
3860: 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  0]));.    sqlite
3870: 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e  3DbFree(db, db->
3880: 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44  aDb);.    db->aD
3890: 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69  b = db->aDbStati
38a0: 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c;.  }.}../*.** 
38b0: 52 65 73 65 74 20 74 68 65 20 73 63 68 65 6d 61  Reset the schema
38c0: 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
38d0: 65 20 61 74 20 69 6e 64 65 78 20 69 44 62 2e 20  e at index iDb. 
38e0: 20 41 6c 73 6f 20 72 65 73 65 74 20 74 68 65 0a   Also reset the.
38f0: 2a 2a 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 0a  ** TEMP schema..
3900: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
3910: 65 73 65 74 4f 6e 65 53 63 68 65 6d 61 28 73 71  esetOneSchema(sq
3920: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
3930: 44 62 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 0a  Db){.  Db *pDb;.
3940: 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62    assert( iDb<db
3950: 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 43  ->nDb );..  /* C
3960: 61 73 65 20 31 3a 20 20 52 65 73 65 74 20 74 68  ase 1:  Reset th
3970: 65 20 73 69 6e 67 6c 65 20 73 63 68 65 6d 61 20  e single schema 
3980: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 69 44  identified by iD
3990: 62 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62  b */.  pDb = &db
39a0: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 61 73  ->aDb[iDb];.  as
39b0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
39c0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
39d0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 61 73   iDb, 0) );.  as
39e0: 73 65 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65  sert( pDb->pSche
39f0: 6d 61 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  ma!=0 );.  sqlit
3a00: 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44  e3SchemaClear(pD
3a10: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 20 20  b->pSchema);..  
3a20: 2f 2a 20 49 66 20 61 6e 79 20 64 61 74 61 62 61  /* If any databa
3a30: 73 65 20 6f 74 68 65 72 20 74 68 61 6e 20 54 45  se other than TE
3a40: 4d 50 20 69 73 20 72 65 73 65 74 2c 20 74 68 65  MP is reset, the
3a50: 6e 20 61 6c 73 6f 20 72 65 73 65 74 20 54 45 4d  n also reset TEM
3a60: 50 0a 20 20 2a 2a 20 73 69 6e 63 65 20 54 45 4d  P.  ** since TEM
3a70: 50 20 6d 69 67 68 74 20 62 65 20 68 6f 6c 64 69  P might be holdi
3a80: 6e 67 20 74 72 69 67 67 65 72 73 20 74 68 61 74  ng triggers that
3a90: 20 72 65 66 65 72 65 6e 63 65 20 74 61 62 6c 65   reference table
3aa0: 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74  s in the.  ** ot
3ab0: 68 65 72 20 64 61 74 61 62 61 73 65 2e 0a 20 20  her database..  
3ac0: 2a 2f 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20  */.  if( iDb!=1 
3ad0: 29 7b 0a 20 20 20 20 70 44 62 20 3d 20 26 64 62  ){.    pDb = &db
3ae0: 2d 3e 61 44 62 5b 31 5d 3b 0a 20 20 20 20 61 73  ->aDb[1];.    as
3af0: 73 65 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65  sert( pDb->pSche
3b00: 6d 61 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  ma!=0 );.    sql
3b10: 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28  ite3SchemaClear(
3b20: 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pDb->pSchema);. 
3b30: 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a   }.  return;.}..
3b40: 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20  /*.** Erase all 
3b50: 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69  schema informati
3b60: 6f 6e 20 66 72 6f 6d 20 61 6c 6c 20 61 74 74 61  on from all atta
3b70: 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 28  ched databases (
3b80: 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 22 6d 61  including.** "ma
3b90: 69 6e 22 20 61 6e 64 20 22 74 65 6d 70 22 29 20  in" and "temp") 
3ba0: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
3bb0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
3bc0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3bd0: 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73  3ResetAllSchemas
3be0: 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 73 71 6c  OfConnection(sql
3bf0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
3c00: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   i;.  sqlite3Btr
3c10: 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
3c20: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
3c30: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
3c40: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
3c50: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
3c60: 44 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Db->pSchema ){. 
3c70: 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65       sqlite3Sche
3c80: 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63  maClear(pDb->pSc
3c90: 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  hema);.    }.  }
3ca0: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
3cb0: 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  ~SQLITE_InternCh
3cc0: 61 6e 67 65 73 3b 0a 20 20 73 71 6c 69 74 65 33  anges;.  sqlite3
3cd0: 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64  VtabUnlockList(d
3ce0: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  b);.  sqlite3Btr
3cf0: 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
3d00: 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73    sqlite3Collaps
3d10: 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28 64  eDatabaseArray(d
3d20: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  b);.}../*.** Thi
3d30: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
3d40: 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69  led when a commi
3d50: 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69  t occurs..*/.voi
3d60: 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49  d sqlite3CommitI
3d70: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73  nternalChanges(s
3d80: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64  qlite3 *db){.  d
3d90: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
3da0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
3db0: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  s;.}../*.** Dele
3dc0: 74 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  te memory alloca
3dd0: 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ted for the colu
3de0: 6d 6e 20 6e 61 6d 65 73 20 6f 66 20 61 20 74 61  mn names of a ta
3df0: 62 6c 65 20 6f 72 20 76 69 65 77 20 28 74 68 65  ble or view (the
3e00: 0a 2a 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d  .** Table.aCol[]
3e10: 20 61 72 72 61 79 29 2e 0a 2a 2f 0a 73 74 61 74   array)..*/.stat
3e20: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65  ic void sqliteDe
3e30: 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  leteColumnNames(
3e40: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
3e50: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69  le *pTable){.  i
3e60: 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  nt i;.  Column *
3e70: 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  pCol;.  assert( 
3e80: 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69  pTable!=0 );.  i
3e90: 66 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c  f( (pCol = pTabl
3ea0: 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20  e->aCol)!=0 ){. 
3eb0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
3ec0: 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c  able->nCol; i++,
3ed0: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
3ee0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3ef0: 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCol->zName);.
3f00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
3f10: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  rDelete(db, pCol
3f20: 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->pDflt);.      
3f30: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3f40: 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a  , pCol->zDflt);.
3f50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
3f60: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54  ree(db, pCol->zT
3f70: 79 70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ype);.      sqli
3f80: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
3f90: 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  ol->zColl);.    
3fa0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
3fb0: 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  ree(db, pTable->
3fc0: 61 43 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aCol);.  }.}../*
3fd0: 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d  .** Remove the m
3fe0: 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63  emory data struc
3ff0: 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64  tures associated
4000: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a   with the given.
4010: 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68  ** Table.  No ch
4020: 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
4030: 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72  o disk by this r
4040: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
4050: 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20  is routine just 
4060: 64 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61  deletes the data
4070: 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20   structure.  It 
4080: 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a  does not unlink.
4090: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74  ** the table dat
40a0: 61 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  a structure from
40b0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
40c0: 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64 65    But it does de
40d0: 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20  stroy.** memory 
40e0: 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74 68  structures of th
40f0: 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f  e indices and fo
4100: 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63  reign keys assoc
4110: 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74  iated with .** t
4120: 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
4130: 54 68 65 20 64 62 20 70 61 72 61 6d 65 74 65 72  The db parameter
4140: 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49   is optional.  I
4150: 74 20 69 73 20 6e 65 65 64 65 64 20 69 66 20 74  t is needed if t
4160: 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  he Table object 
4170: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f  .** contains loo
4180: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 20 20  kaside memory.  
4190: 28 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 69  (Table objects i
41a0: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 64 6f 20  n the schema do 
41b0: 6e 6f 74 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61  not use.** looka
41c0: 73 69 64 65 20 6d 65 6d 6f 72 79 2c 20 62 75 74  side memory, but
41d0: 20 73 6f 6d 65 20 65 70 68 65 6d 65 72 61 6c 20   some ephemeral 
41e0: 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 64 6f  Table objects do
41f0: 2e 29 20 20 4f 72 20 74 68 65 0a 2a 2a 20 64 62  .)  Or the.** db
4200: 20 70 61 72 61 6d 65 74 65 72 20 63 61 6e 20 62   parameter can b
4210: 65 20 75 73 65 64 20 77 69 74 68 20 64 62 2d 3e  e used with db->
4220: 70 6e 42 79 74 65 73 46 72 65 65 64 20 74 6f 20  pnBytesFreed to 
4230: 6d 65 61 73 75 72 65 20 74 68 65 20 6d 65 6d 6f  measure the memo
4240: 72 79 0a 2a 2a 20 75 73 65 64 20 62 79 20 74 68  ry.** used by th
4250: 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a  e Table object..
4260: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
4270: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
4280: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
4290: 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20  Table){.  Index 
42a0: 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b  *pIndex, *pNext;
42b0: 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74  .  TESTONLY( int
42c0: 20 6e 4c 6f 6f 6b 61 73 69 64 65 3b 20 29 20 2f   nLookaside; ) /
42d0: 2a 20 55 73 65 64 20 74 6f 20 76 65 72 69 66 79  * Used to verify
42e0: 20 6c 6f 6f 6b 61 73 69 64 65 20 6e 6f 74 20 75   lookaside not u
42f0: 73 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 2a  sed for schema *
4300: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 54  /..  assert( !pT
4310: 61 62 6c 65 20 7c 7c 20 70 54 61 62 6c 65 2d 3e  able || pTable->
4320: 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  nRef>0 );..  /* 
4330: 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
4340: 65 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68  e table until th
4350: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
4360: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20  t reaches zero. 
4370: 2a 2f 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65  */.  if( !pTable
4380: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
4390: 20 28 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e   ((!db || db->pn
43a0: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26  BytesFreed==0) &
43b0: 26 20 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 52 65  & (--pTable->nRe
43c0: 66 29 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  f)>0) ) return;.
43d0: 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65  .  /* Record the
43e0: 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74   number of outst
43f0: 61 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65  anding lookaside
4400: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 20   allocations in 
4410: 73 63 68 65 6d 61 20 54 61 62 6c 65 73 0a 20 20  schema Tables.  
4420: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e  ** prior to doin
4430: 67 20 61 6e 79 20 66 72 65 65 28 29 20 6f 70 65  g any free() ope
4440: 72 61 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65 20  rations.  Since 
4450: 73 63 68 65 6d 61 20 54 61 62 6c 65 73 20 64 6f  schema Tables do
4460: 20 6e 6f 74 20 75 73 65 0a 20 20 2a 2a 20 6c 6f   not use.  ** lo
4470: 6f 6b 61 73 69 64 65 2c 20 74 68 69 73 20 6e 75  okaside, this nu
4480: 6d 62 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20  mber should not 
4490: 63 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 54 45 53  change. */.  TES
44a0: 54 4f 4e 4c 59 28 20 6e 4c 6f 6f 6b 61 73 69 64  TONLY( nLookasid
44b0: 65 20 3d 20 28 64 62 20 26 26 20 28 70 54 61 62  e = (db && (pTab
44c0: 6c 65 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  le->tabFlags & T
44d0: 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 29  F_Ephemeral)==0)
44e0: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
4500: 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 3a  lookaside.nOut :
4510: 20 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65   0 );..  /* Dele
4520: 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61  te all indices a
4530: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
4540: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
4550: 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61  for(pIndex = pTa
4560: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e  ble->pIndex; pIn
4570: 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78  dex; pIndex=pNex
4580: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
4590: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
45a0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65     assert( pInde
45b0: 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
45c0: 6c 65 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  le->pSchema );. 
45d0: 20 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62     if( !db || db
45e0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
45f0: 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  0 ){.      char 
4600: 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d  *zName = pIndex-
4610: 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20 54  >zName; .      T
4620: 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20  ESTONLY ( Index 
4630: 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74 65  *pOld = ) sqlite
4640: 33 48 61 73 68 49 6e 73 65 72 74 28 0a 20 20 20  3HashInsert(.   
4650: 20 20 20 20 20 20 26 70 49 6e 64 65 78 2d 3e 70        &pIndex->p
4660: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
4670: 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53   zName, sqlite3S
4680: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 2c 20  trlen30(zName), 
4690: 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  0.      );.     
46a0: 20 61 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c   assert( db==0 |
46b0: 7c 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  | sqlite3SchemaM
46c0: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20  utexHeld(db, 0, 
46d0: 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
46e0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
46f0: 28 20 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20 7c  ( pOld==pIndex |
4700: 7c 20 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20 20  | pOld==0 );.   
4710: 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78   }.    freeIndex
4720: 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  (db, pIndex);.  
4730: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  }..  /* Delete a
4740: 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  ny foreign keys 
4750: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 69 73  attached to this
4760: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c   table. */.  sql
4770: 69 74 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c  ite3FkDelete(db,
4780: 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20   pTable);..  /* 
4790: 44 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65  Delete the Table
47a0: 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c   structure itsel
47b0: 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  f..  */.  sqlite
47c0: 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  DeleteColumnName
47d0: 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20  s(db, pTable);. 
47e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
47f0: 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  b, pTable->zName
4800: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
4810: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a  ee(db, pTable->z
4820: 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74  ColAff);.  sqlit
4830: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
4840: 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  b, pTable->pSele
4850: 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ct);.#ifndef SQL
4860: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
4870: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4880: 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c  Delete(db, pTabl
4890: 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 65 6e 64  e->pCheck);.#end
48a0: 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
48b0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
48c0: 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61  BLE.  sqlite3Vta
48d0: 62 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c  bClear(db, pTabl
48e0: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  e);.#endif.  sql
48f0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4900: 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65  Table);..  /* Ve
4910: 72 69 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f  rify that no loo
4920: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61  kaside memory wa
4930: 73 20 75 73 65 64 20 62 79 20 73 63 68 65 6d 61  s used by schema
4940: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73   tables */.  ass
4950: 65 72 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d  ert( nLookaside=
4960: 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65  =0 || nLookaside
4970: 3d 3d 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ==db->lookaside.
4980: 6e 4f 75 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nOut );.}../*.**
4990: 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65   Unlink the give
49a0: 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  n table from the
49b0: 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64   hash tables and
49c0: 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a   the delete the.
49d0: 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  ** table structu
49e0: 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20  re with all its 
49f0: 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65  indices and fore
4a00: 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69  ign keys..*/.voi
4a10: 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41  d sqlite3UnlinkA
4a20: 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71  ndDeleteTable(sq
4a30: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
4a40: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
4a50: 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62  zTabName){.  Tab
4a60: 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62  le *p;.  Db *pDb
4a70: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  ;..  assert( db!
4a80: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
4a90: 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
4aa0: 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
4ab0: 74 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20  t( zTabName );. 
4ac0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
4ad0: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
4ae0: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
4af0: 20 74 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e   testcase( zTabN
4b00: 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a  ame[0]==0 );  /*
4b10: 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62   Zero-length tab
4b20: 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c  le names are all
4b30: 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20  owed */.  pDb = 
4b40: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
4b50: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
4b60: 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63  Insert(&pDb->pSc
4b70: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a  hema->tblHash, z
4b80: 54 61 62 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  TabName,.       
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ba0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
4bb0: 28 7a 54 61 62 4e 61 6d 65 29 2c 30 29 3b 0a 20  (zTabName),0);. 
4bc0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
4bd0: 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62  ble(db, p);.  db
4be0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
4bf0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
4c00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
4c10: 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20  a token, return 
4c20: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f  a string that co
4c30: 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65  nsists of the te
4c40: 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f  xt of that.** to
4c50: 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68  ken.  Space to h
4c60: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
4c70: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62   string.** is ob
4c80: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
4c90: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
4ca0: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
4cb0: 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  the calling.** f
4cc0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  unction..**.** A
4cd0: 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72  ny quotation mar
4ce0: 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c  ks (ex:  "name",
4cf0: 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c   'name', [name],
4d00: 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74   or `name`) that
4d10: 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65  .** surround the
4d20: 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b   body of the tok
4d30: 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a  en are removed..
4d40: 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65  **.** Tokens are
4d50: 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e   often just poin
4d60: 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72  ters into the or
4d70: 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20  iginal SQL text 
4d80: 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f  and so.** are no
4d90: 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  t \000 terminate
4da0: 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65  d and are not pe
4db0: 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72  rsistent.  The r
4dc0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a  eturned string.*
4dd0: 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e  * is \000 termin
4de0: 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73  ated and is pers
4df0: 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20  istent..*/.char 
4e00: 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d  *sqlite3NameFrom
4e10: 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64  Token(sqlite3 *d
4e20: 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  b, Token *pName)
4e30: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
4e40: 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
4e50: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
4e60: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
4e70: 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a   (char*)pName->z
4e80: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20  , pName->n);.   
4e90: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
4ea0: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  zName);.  }else{
4eb0: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a  .    zName = 0;.
4ec0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61    }.  return zNa
4ed0: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  me;.}../*.** Ope
4ee0: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
4ef0: 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64  ter table stored
4f00: 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d   in database num
4f10: 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77  ber iDb for.** w
4f20: 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c  riting. The tabl
4f30: 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e  e is opened usin
4f40: 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76  g cursor 0..*/.v
4f50: 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d  oid sqlite3OpenM
4f60: 61 73 74 65 72 54 61 62 6c 65 28 50 61 72 73 65  asterTable(Parse
4f70: 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20   *p, int iDb){. 
4f80: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
4f90: 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20  e3GetVdbe(p);.  
4fa0: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
4fb0: 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f  (p, iDb, MASTER_
4fc0: 52 4f 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f  ROOT, 1, SCHEMA_
4fd0: 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 73  TABLE(iDb));.  s
4fe0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
4ff0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
5000: 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  , 0, MASTER_ROOT
5010: 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , iDb);.  sqlite
5020: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
5030: 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 35 2c 20   -1, (char *)5, 
5040: 50 34 5f 49 4e 54 33 32 29 3b 20 20 2f 2a 20 35  P4_INT32);  /* 5
5050: 20 63 6f 6c 75 6d 6e 20 74 61 62 6c 65 20 2a 2f   column table */
5060: 0a 20 20 69 66 28 20 70 2d 3e 6e 54 61 62 3d 3d  .  if( p->nTab==
5070: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 54 61 62  0 ){.    p->nTab
5080: 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
5090: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4e 61  ** Parameter zNa
50a0: 6d 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e  me points to a n
50b0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 62 75  ul-terminated bu
50c0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
50d0: 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61  the name.** of a
50e0: 20 64 61 74 61 62 61 73 65 20 28 22 6d 61 69 6e   database ("main
50f0: 22 2c 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65  ", "temp" or the
5100: 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61   name of an atta
5110: 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 0a 2a  ched db). This.*
5120: 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
5130: 6e 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  ns the index of 
5140: 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61  the named databa
5150: 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c  se in db->aDb[],
5160: 20 6f 72 0a 2a 2a 20 2d 31 20 69 66 20 74 68 65   or.** -1 if the
5170: 20 6e 61 6d 65 64 20 64 62 20 63 61 6e 6e 6f 74   named db cannot
5180: 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e   be found..*/.in
5190: 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  t sqlite3FindDbN
51a0: 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ame(sqlite3 *db,
51b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
51c0: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d  me){.  int i = -
51d0: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  1;         /* Da
51e0: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f  tabase number */
51f0: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a  .  if( zName ){.
5200: 20 20 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 20      Db *pDb;.   
5210: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
5220: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
5230: 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e  .    for(i=(db->
5240: 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d  nDb-1), pDb=&db-
5250: 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69  >aDb[i]; i>=0; i
5260: 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20  --, pDb--){.    
5270: 20 20 69 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d    if( (!OMIT_TEM
5280: 50 44 42 20 7c 7c 20 69 21 3d 31 20 29 20 26 26  PDB || i!=1 ) &&
5290: 20 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65   n==sqlite3Strle
52a0: 6e 33 30 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20  n30(pDb->zName) 
52b0: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d  && .          0=
52c0: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
52d0: 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  pDb->zName, zNam
52e0: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  e) ){.        br
52f0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
5300: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5310: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  i;.}../*.** The 
5320: 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e  token *pName con
5330: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f  tains the name o
5340: 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69  f a database (ei
5350: 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a  ther "main" or.*
5360: 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  * "temp" or the 
5370: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
5380: 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f  hed db). This ro
5390: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
53a0: 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68  e.** index of th
53b0: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  e named database
53c0: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f   in db->aDb[], o
53d0: 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  r -1 if the name
53e0: 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f  d db .** does no
53f0: 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20  t exist..*/.int 
5400: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71  sqlite3FindDb(sq
5410: 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e  lite3 *db, Token
5420: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *pName){.  int 
5430: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
5440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5450: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
5460: 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ber */.  char *z
5470: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
5480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5490: 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61   Name we are sea
54a0: 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  rching for */.  
54b0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
54c0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
54d0: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73   pName);.  i = s
54e0: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
54f0: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73  (db, zName);.  s
5500: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5510: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
5520: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74  n i;.}../* The t
5530: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20  able or view or 
5540: 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20  trigger name is 
5550: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
5560: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
5570: 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20  s.** pName1 and 
5580: 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74  pName2. If the t
5590: 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75  able name was fu
55a0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66  lly qualified, f
55b0: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
55c0: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
55d0: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a  xx.yyy (...);.**
55e0: 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31   .** Then pName1
55f0: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
5600: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
5610: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
5620: 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74  hand if.** the t
5630: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
5640: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
5650: 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52  , i.e.:.**.** CR
5660: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
5670: 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ..);.**.** Then 
5680: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
5690: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
56a0: 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54  2 is ""..**.** T
56b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
56c0: 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70   the *ppUnqual p
56d0: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
56e0: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
56f0: 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65  ame1 or.** pName
5700: 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74  2) that stores t
5710: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74  he unqualified t
5720: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20  able name.  The 
5730: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
5740: 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69  database "xxx" i
5750: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
5760: 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  nt sqlite3TwoPar
5770: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
5780: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
5790: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
57a0: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
57b0: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
57c0: 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20  pName1,      /* 
57d0: 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65  The "xxx" in the
57e0: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
57f0: 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f  or "xxx" */.  To
5800: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
5810: 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69    /* The "yyy" i
5820: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
5830: 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  yyy" */.  Token 
5840: 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a  **pUnqual     /*
5850: 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61   Write the unqua
5860: 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61  lified object na
5870: 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  me here */.){.  
5880: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
5890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
58a0: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
58b0: 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  the object */.  
58c0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
58d0: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
58e0: 20 41 4c 57 41 59 53 28 70 4e 61 6d 65 32 21 3d   ALWAYS(pName2!=
58f0: 30 29 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e  0) && pName2->n>
5900: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  0 ){.    if( db-
5910: 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20  >init.busy ) {. 
5920: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
5930: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f  rMsg(pParse, "co
5940: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 22 29  rrupt database")
5950: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
5960: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65  nErr++;.      re
5970: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
5980: 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e     *pUnqual = pN
5990: 61 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20  ame2;.    iDb = 
59a0: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62  sqlite3FindDb(db
59b0: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69  , pName1);.    i
59c0: 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20  f( iDb<0 ){.    
59d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
59e0: 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f  g(pParse, "unkno
59f0: 77 6e 20 64 61 74 61 62 61 73 65 20 25 54 22 2c  wn database %T",
5a00: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20   pName1);.      
5a10: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
5a20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
5a30: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
5a40: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
5a50: 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64  init.iDb==0 || d
5a60: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a  b->init.busy );.
5a70: 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e      iDb = db->in
5a80: 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e  it.iDb;.    *pUn
5a90: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20  qual = pName1;. 
5aa0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b   }.  return iDb;
5ab0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
5ac0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
5ad0: 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 55  o check if the U
5ae0: 54 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d  TF-8 string zNam
5af0: 65 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20  e is a legal.** 
5b00: 75 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  unqualified name
5b10: 20 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d   for a new schem
5b20: 61 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c  a object (table,
5b30: 20 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a   index, view or.
5b40: 2a 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c  ** trigger). All
5b50: 20 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c   names are legal
5b60: 20 65 78 63 65 70 74 20 74 68 6f 73 65 20 74 68   except those th
5b70: 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 74 68  at begin with th
5b80: 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c  e string.** "sql
5b90: 69 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c  ite_" (in upper,
5ba0: 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20   lower or mixed 
5bb0: 63 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74  case). This port
5bc0: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73  ion of the names
5bd0: 70 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72  pace.** is reser
5be0: 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  ved for internal
5bf0: 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   use..*/.int sql
5c00: 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
5c10: 61 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ame(Parse *pPars
5c20: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
5c30: 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50  Name){.  if( !pP
5c40: 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  arse->db->init.b
5c50: 75 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  usy && pParse->n
5c60: 65 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20  ested==0 .      
5c70: 20 20 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e      && (pParse->
5c80: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
5c90: 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d  TE_WriteSchema)=
5ca0: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  =0.          && 
5cb0: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43  0==sqlite3StrNIC
5cc0: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
5cd0: 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73  e_", 7) ){.    s
5ce0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5cf0: 50 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e  Parse, "object n
5d00: 61 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72  ame reserved for
5d10: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25   internal use: %
5d20: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
5d30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
5d40: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
5d50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
5d60: 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73  /*.** Begin cons
5d70: 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74  tructing a new t
5d80: 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74  able representat
5d90: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  ion in memory.  
5da0: 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66  This is.** the f
5db0: 69 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20  irst of several 
5dc0: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
5dd0: 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20  that get called 
5de0: 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74  in response.** t
5df0: 6f 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  o a CREATE TABLE
5e00: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20   statement.  In 
5e10: 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73  particular, this
5e20: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
5e30: 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69  ed.** after seei
5e40: 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54  ng tokens "CREAT
5e50: 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61  E" and "TABLE" a
5e60: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  nd the table nam
5e70: 65 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a  e. The isTemp.**
5e80: 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66   flag is true if
5e90: 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c   the table shoul
5ea0: 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  d be stored in t
5eb0: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
5ec0: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e  abase.** file in
5ed0: 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20  stead of in the 
5ee0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
5ef0: 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  le.  This is nor
5f00: 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a  mally the case.*
5f10: 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50  * when the "TEMP
5f20: 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22  " or "TEMPORARY"
5f30: 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20   keyword occurs 
5f40: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52  in between.** CR
5f50: 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a  EATE and TABLE..
5f60: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61  **.** The new ta
5f70: 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e  ble record is in
5f80: 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75  itialized and pu
5f90: 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65  t in pParse->pNe
5fa0: 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f  wTable..** As mo
5fb0: 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  re of the CREATE
5fc0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
5fd0: 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69   is parsed, addi
5fe0: 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a  tional action.**
5ff0: 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62   routines will b
6000: 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20  e called to add 
6010: 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  more information
6020: 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e   to this record.
6030: 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
6040: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
6050: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  LE statement, th
6060: 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
6070: 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  e() routine.** i
6080: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70  s called to comp
6090: 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75  lete the constru
60a0: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77  ction of the new
60b0: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a   table record..*
60c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74  /.void sqlite3St
60d0: 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73  artTable(.  Pars
60e0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
60f0: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
6100: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
6110: 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61  1,   /* First pa
6120: 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f  rt of the name o
6130: 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  f the table or v
6140: 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  iew */.  Token *
6150: 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63  pName2,   /* Sec
6160: 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ond part of the 
6170: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
6180: 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69  e or view */.  i
6190: 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20  nt isTemp,      
61a0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
61b0: 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20  is a TEMP table 
61c0: 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c  */.  int isView,
61d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
61e0: 20 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20   this is a VIEW 
61f0: 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75  */.  int isVirtu
6200: 61 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66  al,   /* True if
6210: 20 74 68 69 73 20 69 73 20 61 20 56 49 52 54 55   this is a VIRTU
6220: 41 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  AL table */.  in
6230: 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f  t noErr        /
6240: 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20  * Do nothing if 
6250: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78  table already ex
6260: 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ists */.){.  Tab
6270: 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68  le *pTable;.  ch
6280: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f  ar *zName = 0; /
6290: 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * The name of th
62a0: 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20  e new table */. 
62b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
62c0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
62d0: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b  e *v;.  int iDb;
62e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
62f0: 62 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63  base number to c
6300: 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  reate the table 
6310: 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  in */.  Token *p
6320: 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75  Name;    /* Unqu
6330: 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
6340: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65  the table to cre
6350: 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ate */..  /* The
6360: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
6370: 61 6d 65 20 74 6f 20 63 72 65 61 74 65 20 69 73  ame to create is
6380: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
6390: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65  routine via toke
63a0: 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61  ns.  ** pName1 a
63b0: 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68  nd pName2. If th
63c0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73  e table name was
63d0: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
63e0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20  , for example:. 
63f0: 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20   **.  ** CREATE 
6400: 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e  TABLE xxx.yyy (.
6410: 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ..);.  ** .  ** 
6420: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
6430: 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20  et to "xxx" and 
6440: 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e  pName2 "yyy". On
6450: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
6460: 69 66 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  if.  ** the tabl
6470: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
6480: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
6490: 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  .e.:.  **.  ** C
64a0: 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28  REATE TABLE yyy(
64b0: 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ...);.  **.  ** 
64c0: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
64d0: 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20  et to "yyy" and 
64e0: 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20  pName2 is ""..  
64f0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  **.  ** The call
6500: 20 62 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20   below sets the 
6510: 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f  pName pointer to
6520: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f   point at the to
6530: 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20  ken (pName1 or. 
6540: 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74   ** pName2) that
6550: 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75   stores the unqu
6560: 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61  alified table na
6570: 6d 65 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65  me. The variable
6580: 20 69 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74   iDb is.  ** set
6590: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
65a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
65b0: 61 74 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  at the table or 
65c0: 76 69 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20  view is to be.  
65d0: 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20  ** created in.. 
65e0: 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69   */.  iDb = sqli
65f0: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
6600: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
6610: 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
6620: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
6630: 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d 49  turn;.  if( !OMI
6640: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
6650: 6d 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e  mp && pName2->n>
6660: 30 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20  0 && iDb!=1 ){. 
6670: 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e     /* If creatin
6680: 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20  g a temp table, 
6690: 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74  the name may not
66a0: 20 62 65 20 71 75 61 6c 69 66 69 65 64 2e 20 55   be qualified. U
66b0: 6e 6c 65 73 73 20 0a 20 20 20 20 2a 2a 20 74 68  nless .    ** th
66c0: 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
66d0: 69 73 20 22 74 65 6d 70 22 20 61 6e 79 77 61 79  is "temp" anyway
66e0: 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  .  */.    sqlite
66f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6700: 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62  , "temporary tab
6710: 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  le name must be 
6720: 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20  unqualified");. 
6730: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
6740: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
6750: 42 20 26 26 20 69 73 54 65 6d 70 20 29 20 69 44  B && isTemp ) iD
6760: 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65  b = 1;..  pParse
6770: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a  ->sNameToken = *
6780: 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d  pName;.  zName =
6790: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
67a0: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
67b0: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
67c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
67d0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
67e0: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
67f0: 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  me(pParse, zName
6800: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65  ) ){.    goto be
6810: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6820: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69  .  }.  if( db->i
6830: 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54  nit.iDb==1 ) isT
6840: 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  emp = 1;.#ifndef
6850: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
6860: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73  HORIZATION.  ass
6870: 65 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31  ert( (isTemp & 1
6880: 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b  )==isTemp );.  {
6890: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
68a0: 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64     char *zDb = d
68b0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
68c0: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
68d0: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
68e0: 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
68f0: 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
6900: 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29  isTemp), 0, zDb)
6910: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
6920: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
6930: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6940: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
6950: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
6960: 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20   && isTemp ){.  
6970: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
6980: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
6990: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  VIEW;.      }els
69a0: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
69b0: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
69c0: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20  VIEW;.      }.  
69d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
69e0: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
69f0: 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  && isTemp ){.   
6a00: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
6a10: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
6a20: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
6a30: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
6a40: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
6a50: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20  TABLE;.      }. 
6a60: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73     }.    if( !is
6a70: 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74  Virtual && sqlit
6a80: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
6a90: 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c  se, code, zName,
6aa0: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
6ab0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
6ac0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
6ad0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
6ae0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e   Make sure the n
6af0: 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f  ew table name do
6b00: 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77  es not collide w
6b10: 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  ith an existing.
6b20: 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
6b30: 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  ble name in the 
6b40: 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20  same database.  
6b50: 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d  Issue an error m
6b60: 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69  essage if.  ** i
6b70: 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65  t does. The exce
6b80: 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20  ption is if the 
6b90: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
6ba0: 70 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65  parsed was passe
6bb0: 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c  d.  ** to an sql
6bc0: 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
6bd0: 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61  b() call. In tha
6be0: 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20  t case only the 
6bf0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a  column names.  *
6c00: 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c  * and types will
6c10: 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65   be used, so the
6c20: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
6c30: 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70   test for namesp
6c40: 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69  ace.  ** collisi
6c50: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
6c60: 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42  !IN_DECLARE_VTAB
6c70: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44   ){.    char *zD
6c80: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
6c90: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
6ca0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
6cb0: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
6cc0: 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  rse) ){.      go
6cd0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
6ce0: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
6cf0: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  pTable = sqlite3
6d00: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
6d10: 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69  ame, zDb);.    i
6d20: 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  f( pTable ){.   
6d30: 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b     if( !noErr ){
6d40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6d50: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6d60: 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61   "table %T alrea
6d70: 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d  dy exists", pNam
6d80: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
6d90: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6da0: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
6db0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
6dc0: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
6dd0: 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
6de0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
6df0: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
6e00: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
6e10: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
6e20: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
6e30: 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20   zDb)!=0 ){.    
6e40: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
6e50: 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
6e60: 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69   is already an i
6e70: 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20  ndex named %s", 
6e80: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
6e90: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
6ea0: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
6eb0: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
6ec0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
6ed0: 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
6ee0: 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  ));.  if( pTable
6ef0: 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  ==0 ){.    db->m
6f00: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
6f10: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
6f20: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
6f30: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
6f40: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67  ++;.    goto beg
6f50: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
6f60: 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e    }.  pTable->zN
6f70: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70  ame = zName;.  p
6f80: 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d  Table->iPKey = -
6f90: 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63  1;.  pTable->pSc
6fa0: 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69  hema = db->aDb[i
6fb0: 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70  Db].pSchema;.  p
6fc0: 54 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b  Table->nRef = 1;
6fd0: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 45  .  pTable->nRowE
6fe0: 73 74 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20  st = 1000000;.  
6ff0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
7000: 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  pNewTable==0 );.
7010: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
7020: 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20  ble = pTable;.. 
7030: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
7040: 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f  he magic sqlite_
7050: 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75  sequence table u
7060: 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65  sed by autoincre
7070: 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  ment,.  ** then 
7080: 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72  record a pointer
7090: 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69   to this table i
70a0: 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
70b0: 61 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  ase structure.  
70c0: 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52  ** so that INSER
70d0: 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74  T can find the t
70e0: 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a  able easily..  *
70f0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
7100: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
7110: 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72 73  ENT.  if( !pPars
7120: 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72  e->nested && str
7130: 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  cmp(zName, "sqli
7140: 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30  te_sequence")==0
7150: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
7160: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
7170: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
7180: 30 29 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65  0) );.    pTable
7190: 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54  ->pSchema->pSeqT
71a0: 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d  ab = pTable;.  }
71b0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65  .#endif..  /* Be
71c0: 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74  gin generating t
71d0: 68 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  he code that wil
71e0: 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62  l insert the tab
71f0: 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20  le record into. 
7200: 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   ** the SQLITE_M
7210: 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f  ASTER table.  No
7220: 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72  te in particular
7230: 20 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f   that we must go
7240: 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20   ahead.  ** and 
7250: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63  allocate the rec
7260: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
7270: 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e  he table entry n
7280: 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a  ow.  Before any.
7290: 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59    ** PRIMARY KEY
72a0: 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f   or UNIQUE keywo
72b0: 72 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20  rds are parsed. 
72c0: 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20   Those keywords 
72d0: 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20  will cause.  ** 
72e0: 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72  indices to be cr
72f0: 65 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61  eated and the ta
7300: 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20  ble record must 
7310: 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20  come before the 
7320: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20  .  ** indices.  
7330: 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72  Hence, the recor
7340: 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  d number for the
7350: 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61   table must be a
7360: 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f  llocated.  ** no
7370: 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  w..  */.  if( !d
7380: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
7390: 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  (v = sqlite3GetV
73a0: 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20  dbe(pParse))!=0 
73b0: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20  ){.    int j1;. 
73c0: 20 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61     int fileForma
73d0: 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c  t;.    int reg1,
73e0: 20 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20   reg2, reg3;.   
73f0: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
7400: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
7410: 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 23 69  se, 0, iDb);..#i
7420: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7430: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
7440: 20 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c     if( isVirtual
7450: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7460: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
7470: 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d  P_VBegin);.    }
7480: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
7490: 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d  If the file form
74a0: 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20  at and encoding 
74b0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
74c0: 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65  have not been se
74d0: 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74  t, .    ** set t
74e0: 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a  hem now..    */.
74f0: 20 20 20 20 72 65 67 31 20 3d 20 70 50 61 72 73      reg1 = pPars
7500: 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b  e->regRowid = ++
7510: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
7520: 20 20 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d    reg2 = pParse-
7530: 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61  >regRoot = ++pPa
7540: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
7550: 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  eg3 = ++pParse->
7560: 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
7570: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
7580: 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44  P_ReadCookie, iD
7590: 62 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46  b, reg3, BTREE_F
75a0: 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20  ILE_FORMAT);.   
75b0: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
75c0: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
75d0: 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
75e0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
75f0: 49 66 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 66  If, reg3);.    f
7600: 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d  ileFormat = (db-
7610: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
7620: 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d  LegacyFileFmt)!=
7630: 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  0 ?.            
7640: 20 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45        1 : SQLITE
7650: 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  _MAX_FILE_FORMAT
7660: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7670: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
7680: 74 65 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61  teger, fileForma
7690: 74 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71  t, reg3);.    sq
76a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
76b0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
76c0: 20 69 44 62 2c 20 42 54 52 45 45 5f 46 49 4c 45   iDb, BTREE_FILE
76d0: 5f 46 4f 52 4d 41 54 2c 20 72 65 67 33 29 3b 0a  _FORMAT, reg3);.
76e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
76f0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
7700: 67 65 72 2c 20 45 4e 43 28 64 62 29 2c 20 72 65  ger, ENC(db), re
7710: 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g3);.    sqlite3
7720: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7730: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
7740: 20 42 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f   BTREE_TEXT_ENCO
7750: 44 49 4e 47 2c 20 72 65 67 33 29 3b 0a 20 20 20  DING, reg3);.   
7760: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
7770: 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20  Here(v, j1);..  
7780: 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63    /* This just c
7790: 72 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68  reates a place-h
77a0: 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20  older record in 
77b0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
77c0: 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  r table..    ** 
77d0: 54 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74  The record creat
77e0: 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  ed does not cont
77f0: 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74  ain anything yet
7800: 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65  .  It will be re
7810: 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79  placed.    ** by
7820: 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20   the real entry 
7830: 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  in code generate
7840: 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54  d at sqlite3EndT
7850: 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  able()..    **. 
7860: 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20     ** The rowid 
7870: 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72  for the new entr
7880: 79 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  y is left in reg
7890: 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65  ister pParse->re
78a0: 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54  gRowid..    ** T
78b0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
78c0: 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ber of the new t
78d0: 61 62 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20  able is left in 
78e0: 72 65 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52  reg pParse->regR
78f0: 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  oot..    ** The 
7900: 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70  rowid and root p
7910: 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65  age number value
7920: 73 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  s are needed by 
7930: 74 68 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20  the code that.  
7940: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54    ** sqlite3EndT
7950: 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61  able will genera
7960: 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21  te..    */.#if !
7970: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7980: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
7990: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
79a0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
79b0: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 7c      if( isView |
79c0: 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20  | isVirtual ){. 
79d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
79e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
79f0: 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a  eger, 0, reg2);.
7a00: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
7a10: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c  .    {.      sql
7a20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7a30: 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65  , OP_CreateTable
7a40: 2c 20 69 44 62 2c 20 72 65 67 32 29 3b 0a 20 20  , iDb, reg2);.  
7a50: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
7a60: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70  penMasterTable(p
7a70: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
7a80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7a90: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
7aa0: 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20  d, 0, reg1);.   
7ab0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7ac0: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
7ad0: 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c  , reg3);.    sql
7ae0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7af0: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20  , OP_Insert, 0, 
7b00: 72 65 67 33 2c 20 72 65 67 31 29 3b 0a 20 20 20  reg3, reg1);.   
7b10: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7b20: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
7b30: 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69  PPEND);.    sqli
7b40: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
7b50: 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a   OP_Close);.  }.
7b60: 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f  .  /* Normal (no
7b70: 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e  n-error) return.
7b80: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20   */.  return;.. 
7b90: 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
7ba0: 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20  occurs, we jump 
7bb0: 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61  here */.begin_ta
7bc0: 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c  ble_error:.  sql
7bd0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
7be0: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Name);.  return;
7bf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d  .}../*.** This m
7c00: 61 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20  acro is used to 
7c10: 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 72 69  compare two stri
7c20: 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d 69 6e  ngs in a case-in
7c30: 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65 72  sensitive manner
7c40: 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69 67 68  ..** It is sligh
7c50: 74 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e 20  tly faster than 
7c60: 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 53  calling sqlite3S
7c70: 74 72 49 43 6d 70 28 29 20 64 69 72 65 63 74 6c  trICmp() directl
7c80: 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63  y, but.** produc
7c90: 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a  es larger code..
7ca0: 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54  **.** WARNING: T
7cb0: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74  his macro is not
7cc0: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
7cd0: 20 74 68 65 20 73 74 72 63 6d 70 28 29 20 66 61   the strcmp() fa
7ce0: 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75  mily. It.** retu
7cf0: 72 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 20  rns true if the 
7d00: 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72 65 20  two strings are 
7d10: 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69 73 65  equal, otherwise
7d20: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69   false..*/.#defi
7d30: 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20 79 29  ne STRICMP(x, y)
7d40: 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72   (\.sqlite3Upper
7d50: 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e  ToLower[*(unsign
7d60: 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d  ed char *)(x)]==
7d70: 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70 70 65     \.sqlite3Uppe
7d80: 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67  rToLower[*(unsig
7d90: 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29 5d 20  ned char *)(y)] 
7da0: 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74 65 33      \.&& sqlite3
7db0: 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c 28 79  StrICmp((x)+1,(y
7dc0: 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a  )+1)==0 )../*.**
7dd0: 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d   Add a new colum
7de0: 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  n to the table c
7df0: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
7e00: 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a  onstructed..**.*
7e10: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
7e20: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
7e30: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f  once for each co
7e40: 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  lumn declaration
7e50: 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20  .** in a CREATE 
7e60: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
7e70: 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
7e80: 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65  ble() gets calle
7e90: 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65  d.** first to ge
7ea0: 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20  t things going. 
7eb0: 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   Then this routi
7ec0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
7ed0: 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e   each.** column.
7ee0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7ef0: 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20  AddColumn(Parse 
7f00: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
7f10: 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  pName){.  Table 
7f20: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
7f30: 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e  har *z;.  Column
7f40: 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65   *pCol;.  sqlite
7f50: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
7f60: 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70  db;.  if( (p = p
7f70: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
7f80: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23  )==0 ) return;.#
7f90: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
7fa0: 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 6e 43  LUMN.  if( p->nC
7fb0: 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  ol+1>db->aLimit[
7fc0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
7fd0: 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  UMN] ){.    sqli
7fe0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
7ff0: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
8000: 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d  lumns on %s", p-
8010: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
8020: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
8030: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d    z = sqlite3Nam
8040: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
8050: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  Name);.  if( z==
8060: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
8070: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
8080: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
8090: 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43  STRICMP(z, p->aC
80a0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a  ol[i].zName) ){.
80b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
80c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64  orMsg(pParse, "d
80d0: 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20  uplicate column 
80e0: 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20  name: %s", z);. 
80f0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
8100: 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20  ee(db, z);.     
8110: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
8120: 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f   }.  if( (p->nCo
8130: 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20  l & 0x7)==0 ){. 
8140: 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b     Column *aNew;
8150: 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69  .    aNew = sqli
8160: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
8170: 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c  p->aCol,(p->nCol
8180: 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43  +8)*sizeof(p->aC
8190: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  ol[0]));.    if(
81a0: 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
81b0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
81c0: 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65  db, z);.      re
81d0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
81e0: 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a  p->aCol = aNew;.
81f0: 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d    }.  pCol = &p-
8200: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a  >aCol[p->nCol];.
8210: 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30    memset(pCol, 0
8220: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  , sizeof(p->aCol
8230: 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a  [0]));.  pCol->z
8240: 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a  Name = z;. .  /*
8250: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
8260: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
8270: 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65  columns have the
8280: 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74   default affinit
8290: 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49  y.  ** 'NONE'. I
82a0: 66 20 74 68 65 72 65 20 69 73 20 61 20 74 79 70  f there is a typ
82b0: 65 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65  e specified, the
82c0: 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  n sqlite3AddColu
82d0: 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20  mnType() will.  
82e0: 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78  ** be called nex
82f0: 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61  t to set pCol->a
8300: 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c  ffinity correctl
8310: 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e  y..  */.  pCol->
8320: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
8330: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d  E_AFF_NONE;.  p-
8340: 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nCol++;.}../*.*
8350: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8360: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
8370: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
8380: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
8390: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
83a0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
83b0: 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22  t.  A "NOT NULL"
83c0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a   constraint has.
83d0: 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20  ** been seen on 
83e0: 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20  a column.  This 
83f0: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
8400: 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e   notNull flag on
8410: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  .** the column c
8420: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
8430: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  onstruction..*/.
8440: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e  void sqlite3AddN
8450: 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50  otNull(Parse *pP
8460: 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f  arse, int onErro
8470: 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  r){.  Table *p;.
8480: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
8490: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
84a0: 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e  ==0 || NEVER(p->
84b0: 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74 75 72 6e  nCol<1) ) return
84c0: 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e  ;.  p->aCol[p->n
84d0: 43 6f 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d  Col-1].notNull =
84e0: 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 7d 0a   (u8)onError;.}.
84f0: 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20  ./*.** Scan the 
8500: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65  column type name
8510: 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e   zType (length n
8520: 54 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e  Type) and return
8530: 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   the.** associat
8540: 65 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65  ed affinity type
8550: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
8560: 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65  tine does a case
8570: 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61  -independent sea
8580: 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72  rch of zType for
8590: 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69   the .** substri
85a0: 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ngs in the follo
85b0: 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f  wing table. If o
85c0: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
85d0: 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64  ings is.** found
85e0: 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
85f0: 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20  ing affinity is 
8600: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79  returned. If zTy
8610: 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d  pe contains.** m
8620: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20  ore than one of 
8630: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20  the substrings, 
8640: 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74  entries toward t
8650: 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68  he top of .** th
8660: 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69  e table take pri
8670: 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70  ority. For examp
8680: 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20  le, if zType is 
8690: 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53  'BLOBINT', .** S
86a0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
86b0: 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  R is returned..*
86c0: 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20  *.** Substring  
86d0: 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a     | Affinity.**
86e0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
86f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8700: 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20  -.** 'INT'      
8710: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
8720: 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52  INTEGER.** 'CHAR
8730: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
8740: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43  E_AFF_TEXT.** 'C
8750: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
8760: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
8770: 20 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c   'TEXT'        |
8780: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
8790: 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20  .** 'BLOB'      
87a0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e    | SQLITE_AFF_N
87b0: 4f 4e 45 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20  ONE.** 'REAL'   
87c0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
87d0: 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27  F_REAL.** 'FLOA'
87e0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
87f0: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f  _AFF_REAL.** 'DO
8800: 55 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  UB'        | SQL
8810: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a  ITE_AFF_REAL.**.
8820: 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  ** If none of th
8830: 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20  e substrings in 
8840: 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20  the above table 
8850: 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51  are found,.** SQ
8860: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
8870: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
8880: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66  .char sqlite3Aff
8890: 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20  inityType(const 
88a0: 63 68 61 72 20 2a 7a 49 6e 29 7b 0a 20 20 75 33  char *zIn){.  u3
88b0: 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  2 h = 0;.  char 
88c0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
88d0: 5f 4e 55 4d 45 52 49 43 3b 0a 0a 20 20 69 66 28  _NUMERIC;..  if(
88e0: 20 7a 49 6e 20 29 20 77 68 69 6c 65 28 20 7a 49   zIn ) while( zI
88f0: 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20  n[0] ){.    h = 
8900: 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33  (h<<8) + sqlite3
8910: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a  UpperToLower[(*z
8920: 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a  In)&0xff];.    z
8930: 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d  In++;.    if( h=
8940: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27  =(('c'<<24)+('h'
8950: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
8960: 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20  r') ){          
8970: 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20     /* CHAR */.  
8980: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
8990: 5f 41 46 46 5f 54 45 58 54 3b 20 0a 20 20 20 20  _AFF_TEXT; .    
89a0: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
89b0: 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  c'<<24)+('l'<<16
89c0: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20  )+('o'<<8)+'b') 
89d0: 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42  ){       /* CLOB
89e0: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
89f0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
8a00: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
8a10: 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65  ==(('t'<<24)+('e
8a20: 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b  '<<16)+('x'<<8)+
8a30: 27 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a  't') ){       /*
8a40: 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61   TEXT */.      a
8a50: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
8a60: 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20  TEXT;.    }else 
8a70: 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34  if( h==(('b'<<24
8a80: 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27  )+('l'<<16)+('o'
8a90: 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20  <<8)+'b')       
8aa0: 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20     /* BLOB */.  
8ab0: 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53        && (aff==S
8ac0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
8ad0: 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  C || aff==SQLITE
8ae0: 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20  _AFF_REAL) ){.  
8af0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
8b00: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66 6e 64  _AFF_NONE;.#ifnd
8b10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
8b20: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
8b30: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
8b40: 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c  ('r'<<24)+('e'<<
8b50: 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27  16)+('a'<<8)+'l'
8b60: 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45  )          /* RE
8b70: 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26  AL */.        &&
8b80: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
8b90: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
8ba0: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
8bb0: 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c  FF_REAL;.    }el
8bc0: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c  se if( h==(('f'<
8bd0: 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28  <24)+('l'<<16)+(
8be0: 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20  'o'<<8)+'a')    
8bf0: 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f        /* FLOA */
8c00: 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d  .        && aff=
8c10: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
8c20: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66  RIC ){.      aff
8c30: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   = SQLITE_AFF_RE
8c40: 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  AL;.    }else if
8c50: 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b  ( h==(('d'<<24)+
8c60: 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c  ('o'<<16)+('u'<<
8c70: 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20  8)+'b')         
8c80: 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20   /* DOUB */.    
8c90: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
8ca0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
8cb0: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
8cc0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23  LITE_AFF_REAL;.#
8cd0: 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20  endif.    }else 
8ce0: 69 66 28 20 28 68 26 30 78 30 30 46 46 46 46 46  if( (h&0x00FFFFF
8cf0: 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28  F)==(('i'<<16)+(
8d00: 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20  'n'<<8)+'t') ){ 
8d10: 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20     /* INT */.   
8d20: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8d30: 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  AFF_INTEGER;.   
8d40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8d50: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 66    }..  return af
8d60: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  f;.}../*.** This
8d70: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
8d80: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
8d90: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
8da0: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
8db0: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
8dc0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  E statement.  Th
8dd0: 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69  e pFirst token i
8de0: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74  s the first.** t
8df0: 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75  oken in the sequ
8e00: 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74  ence of tokens t
8e10: 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65  hat describe the
8e20: 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20   type of the.** 
8e30: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
8e40: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
8e50: 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20  ion.   pLast is 
8e60: 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a  the last token.*
8e70: 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63  * in the sequenc
8e80: 65 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e 66  e.  Use this inf
8e90: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73  ormation to cons
8ea0: 74 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a  truct a string.*
8eb0: 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  * that contains 
8ec0: 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20  the typename of 
8ed0: 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73  the column and s
8ee0: 74 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e 67  tore that string
8ef0: 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f  .** in zType..*/
8f00: 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64   .void sqlite3Ad
8f10: 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73  dColumnType(Pars
8f20: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
8f30: 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c   *pType){.  Tabl
8f40: 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  e *p;.  Column *
8f50: 70 43 6f 6c 3b 0a 0a 20 20 70 20 3d 20 70 50 61  pCol;..  p = pPa
8f60: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
8f70: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45    if( p==0 || NE
8f80: 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29  VER(p->nCol<1) )
8f90: 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20   return;.  pCol 
8fa0: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43  = &p->aCol[p->nC
8fb0: 6f 6c 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ol-1];.  assert(
8fc0: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20   pCol->zType==0 
8fd0: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  );.  pCol->zType
8fe0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
8ff0: 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
9000: 64 62 2c 20 70 54 79 70 65 29 3b 0a 20 20 70 43  db, pType);.  pC
9010: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
9020: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
9030: 70 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b  pe(pCol->zType);
9040: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78  .}../*.** The ex
9050: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
9060: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
9070: 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
9080: 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e  tly added column
9090: 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65  .** of the table
90a0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
90b0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
90c0: 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c  *.** Default val
90d0: 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d  ue expressions m
90e0: 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e  ust be constant.
90f0: 20 20 52 61 69 73 65 20 61 6e 20 65 78 63 65 70    Raise an excep
9100: 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20  tion if this.** 
9110: 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e  is not the case.
9120: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9130: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
9140: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
9150: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
9160: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
9170: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
9180: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
9190: 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c  sqlite3AddDefaul
91a0: 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50  tValue(Parse *pP
91b0: 61 72 73 65 2c 20 45 78 70 72 53 70 61 6e 20 2a  arse, ExprSpan *
91c0: 70 53 70 61 6e 29 7b 0a 20 20 54 61 62 6c 65 20  pSpan){.  Table 
91d0: 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *p;.  Column *pC
91e0: 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ol;.  sqlite3 *d
91f0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9200: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
9210: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
9220: 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20  !=0 ){.    pCol 
9230: 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e  = &(p->aCol[p->n
9240: 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28  Col-1]);.    if(
9250: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
9260: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
9270: 6e 28 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 20  n(pSpan->pExpr) 
9280: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9290: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
92a0: 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20   "default value 
92b0: 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69  of column [%s] i
92c0: 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c  s not constant",
92d0: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d  .          pCol-
92e0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  >zName);.    }el
92f0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63  se{.      /* A c
9300: 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69 73 20  opy of pExpr is 
9310: 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  used instead of 
9320: 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73  the original, as
9330: 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a   pExpr contains.
9340: 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20        ** tokens 
9350: 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f  that point to vo
9360: 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 20 54  latile memory. T
9370: 68 65 20 27 73 70 61 6e 27 20 6f 66 20 74 68 65  he 'span' of the
9380: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
9390: 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
93a0: 20 62 79 20 70 72 61 67 6d 61 20 74 61 62 6c 65   by pragma table
93b0: 5f 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a  _info..      */.
93c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
93d0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  rDelete(db, pCol
93e0: 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->pDflt);.      
93f0: 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71  pCol->pDflt = sq
9400: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
9410: 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c 20 45   pSpan->pExpr, E
9420: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
9430: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
9440: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44  ree(db, pCol->zD
9450: 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c  flt);.      pCol
9460: 2d 3e 7a 44 66 6c 74 20 3d 20 73 71 6c 69 74 65  ->zDflt = sqlite
9470: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28  3DbStrNDup(db, (
9480: 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74  char*)pSpan->zSt
9490: 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  art,.           
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94b0: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
94c0: 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53  pSpan->zEnd - pS
94d0: 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20  pan->zStart));. 
94e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
94f0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
9500: 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 3b 0a   pSpan->pExpr);.
9510: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61  }../*.** Designa
9520: 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  te the PRIMARY K
9530: 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  EY for the table
9540: 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  .  pList is a li
9550: 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20  st of names .** 
9560: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
9570: 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79  form the primary
9580: 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20   key.  If pList 
9590: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
95a0: 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74  e.** most recent
95b0: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20  ly added column 
95c0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
95d0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
95e0: 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63  .**.** A table c
95f0: 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  an have at most 
9600: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  one primary key.
9610: 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61    If the table a
9620: 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20  lready has.** a 
9630: 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64  primary key (and
9640: 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63   this is the sec
9650: 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29  ond primary key)
9660: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a   then create an.
9670: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
9680: 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  If the PRIMARY K
9690: 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c  EY is on a singl
96a0: 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64  e column whose d
96b0: 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47  atatype is INTEG
96c0: 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77  ER,.** then we w
96d0: 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74  ill try to use t
96e0: 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  hat column as th
96f0: 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68  e rowid.  Set th
9700: 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a  e Table.iPKey.**
9710: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61   field of the ta
9720: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
9730: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65  uction to be the
9740: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
9750: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
9760: 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61   KEY column.  Ta
9770: 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74  ble.iPKey is set
9780: 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20   to -1 if there 
9790: 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52  is.** no INTEGER
97a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a   PRIMARY KEY..**
97b0: 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69  .** If the key i
97c0: 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52  s not an INTEGER
97d0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68   PRIMARY KEY, th
97e0: 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  en create a uniq
97f0: 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20  ue.** index for 
9800: 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64  the key.  No ind
9810: 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f  ex is created fo
9820: 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  r INTEGER PRIMAR
9830: 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20  Y KEYs..*/.void 
9840: 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72  sqlite3AddPrimar
9850: 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  yKey(.  Parse *p
9860: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
9870: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
9880: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
9890: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66  t,  /* List of f
98a0: 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65  ield names to be
98b0: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
98c0: 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
98d0: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
98e0: 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20  th a uniqueness 
98f0: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e  conflict */.  in
9900: 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20  t autoInc,      
9910: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41  /* True if the A
9920: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79  UTOINCREMENT key
9930: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
9940: 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
9950: 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  er     /* SQLITE
9960: 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54  _SO_ASC or SQLIT
9970: 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a  E_SO_DESC */.){.
9980: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
9990: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
99a0: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65  e;.  char *zType
99b0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c   = 0;.  int iCol
99c0: 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20   = -1, i;.  if( 
99d0: 70 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45  pTab==0 || IN_DE
99e0: 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74  CLARE_VTAB ) got
99f0: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
9a00: 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  it;.  if( pTab->
9a10: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61  tabFlags & TF_Ha
9a20: 73 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20  sPrimaryKey ){. 
9a30: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
9a40: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
9a50: 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20    "table \"%s\" 
9a60: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
9a70: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20  e primary key", 
9a80: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
9a90: 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b    goto primary_k
9aa0: 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70  ey_exit;.  }.  p
9ab0: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
9ac0: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
9ad0: 79 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  y;.  if( pList==
9ae0: 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  0 ){.    iCol = 
9af0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a  pTab->nCol - 1;.
9b00: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
9b10: 43 6f 6c 5d 2e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col].colFlags |=
9b20: 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
9b30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
9b40: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
9b50: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
9b60: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
9b70: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
9b80: 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
9b90: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
9ba0: 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
9bb0: 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43  .zName, pTab->aC
9bc0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d  ol[iCol].zName)=
9bd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
9be0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
9bf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9c00: 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  f( iCol<pTab->nC
9c10: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  ol ){.        pT
9c20: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63  ab->aCol[iCol].c
9c30: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
9c40: 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20  AG_PRIMKEY;.    
9c50: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
9c60: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31  ( pList->nExpr>1
9c70: 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20   ) iCol = -1;.  
9c80: 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20  }.  if( iCol>=0 
9c90: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
9ca0: 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  ol ){.    zType 
9cb0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
9cc0: 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20  l].zType;.  }.  
9cd0: 69 66 28 20 7a 54 79 70 65 20 26 26 20 73 71 6c  if( zType && sql
9ce0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79 70  ite3StrICmp(zTyp
9cf0: 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30  e, "INTEGER")==0
9d00: 0a 20 20 20 20 20 20 20 20 26 26 20 73 6f 72 74  .        && sort
9d10: 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f  Order==SQLITE_SO
9d20: 5f 41 53 43 20 29 7b 0a 20 20 20 20 70 54 61 62  _ASC ){.    pTab
9d30: 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a  ->iPKey = iCol;.
9d40: 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e      pTab->keyCon
9d50: 66 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b  f = (u8)onError;
9d60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 75 74  .    assert( aut
9d70: 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f 49  oInc==0 || autoI
9d80: 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61  nc==1 );.    pTa
9d90: 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 61  b->tabFlags |= a
9da0: 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69 6e  utoInc*TF_Autoin
9db0: 63 72 65 6d 65 6e 74 3b 0a 20 20 7d 65 6c 73 65  crement;.  }else
9dc0: 20 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a   if( autoInc ){.
9dd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9de0: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
9df0: 54 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  T.    sqlite3Err
9e00: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41  orMsg(pParse, "A
9e10: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20  UTOINCREMENT is 
9e20: 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20  only allowed on 
9e30: 61 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54  an ".       "INT
9e40: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
9e50: 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  ");.#endif.  }el
9e60: 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  se{.    Index *p
9e70: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
9e80: 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61  3CreateIndex(pPa
9e90: 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c  rse, 0, 0, 0, pL
9ea0: 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c  ist, onError, 0,
9eb0: 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30   0, sortOrder, 0
9ec0: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
9ed0: 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 49 6e 64        p->autoInd
9ee0: 65 78 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20  ex = 2;.    }.  
9ef0: 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d    pList = 0;.  }
9f00: 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  ..primary_key_ex
9f10: 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70  it:.  sqlite3Exp
9f20: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
9f30: 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a  se->db, pList);.
9f40: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
9f50: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43 48 45  ** Add a new CHE
9f60: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f  CK constraint to
9f70: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
9f80: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
9f90: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
9fa0: 20 73 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b   sqlite3AddCheck
9fb0: 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61  Constraint(.  Pa
9fc0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
9fd0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
9fe0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43  xt */.  Expr *pC
9ff0: 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65  heckExpr  /* The
a000: 20 63 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f   check expressio
a010: 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20  n */.){.#ifndef 
a020: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
a030: 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  K.  Table *pTab 
a040: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
a050: 62 6c 65 3b 0a 20 20 69 66 28 20 70 54 61 62 20  ble;.  if( pTab 
a060: 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56  && !IN_DECLARE_V
a070: 54 41 42 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  TAB ){.    pTab-
a080: 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65  >pCheck = sqlite
a090: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
a0a0: 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43  pParse, pTab->pC
a0b0: 68 65 63 6b 2c 20 70 43 68 65 63 6b 45 78 70 72  heck, pCheckExpr
a0c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  );.    if( pPars
a0d0: 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d  e->constraintNam
a0e0: 65 2e 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  e.n ){.      sql
a0f0: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
a100: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ame(pParse, pTab
a110: 2d 3e 70 43 68 65 63 6b 2c 20 26 70 50 61 72 73  ->pCheck, &pPars
a120: 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d  e->constraintNam
a130: 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, 1);.    }.  }
a140: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a  else.#endif.  {.
a150: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
a160: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
a170: 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20  , pCheckExpr);. 
a180: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
a190: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  the collation fu
a1a0: 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nction of the mo
a1b0: 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73  st recently pars
a1c0: 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a  ed table column.
a1d0: 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65  ** to the CollSe
a1e0: 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64  q given..*/.void
a1f0: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61   sqlite3AddColla
a200: 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  teType(Parse *pP
a210: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  arse, Token *pTo
a220: 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ken){.  Table *p
a230: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
a240: 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20  r *zColl;       
a250: 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74         /* Dequot
a260: 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61  ed name of colla
a270: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f  tion sequence */
a280: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
a290: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
a2a0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
a2b0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
a2c0: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64  = p->nCol-1;.  d
a2d0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
a2e0: 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    zColl = sqlite
a2f0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
a300: 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66  b, pToken);.  if
a310: 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72  ( !zColl ) retur
a320: 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  n;..  if( sqlite
a330: 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
a340: 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  Parse, zColl) ){
a350: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
a360: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
a370: 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b  ree(db, p->aCol[
a380: 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 70  i].zColl);.    p
a390: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20  ->aCol[i].zColl 
a3a0: 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20  = zColl;.  .    
a3b0: 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
a3c0: 20 69 73 20 64 65 63 6c 61 72 65 64 20 61 73 20   is declared as 
a3d0: 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20  "<name> PRIMARY 
a3e0: 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70  KEY COLLATE <typ
a3f0: 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  e>",.    ** then
a400: 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61   an index may ha
a410: 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  ve been created 
a420: 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62  on this column b
a430: 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  efore the.    **
a440: 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20   collation type 
a450: 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65  was added. Corre
a460: 63 74 20 74 68 69 73 20 69 66 20 69 74 20 69 73  ct this if it is
a470: 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a   the case..    *
a480: 2f 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  /.    for(pIdx=p
a490: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
a4a0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
a4b0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
a4c0: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d   pIdx->nColumn==
a4d0: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
a4e0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
a4f0: 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==i ){.        p
a500: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d  Idx->azColl[0] =
a510: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
a520: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
a530: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
a540: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
a550: 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  zColl);.  }.}../
a560: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
a570: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 63  on returns the c
a580: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
a590: 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e  e for database n
a5a0: 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e  ative text.** en
a5b0: 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65  coding identifie
a5c0: 64 20 62 79 20 74 68 65 20 73 74 72 69 6e 67 20  d by the string 
a5d0: 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e  zName, length nN
a5e0: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ame..**.** If th
a5f0: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
a600: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69  ation sequence i
a610: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c  s not available,
a620: 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   or not availabl
a630: 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61  e.** in the data
a640: 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f  base native enco
a650: 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74  ding, the collat
a660: 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69  ion factory is i
a670: 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71  nvoked to.** req
a680: 75 65 73 74 20 69 74 2e 20 49 66 20 74 68 65 20  uest it. If the 
a690: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
a6a0: 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c  y does not suppl
a6b0: 79 20 73 75 63 68 20 61 20 73 65 71 75 65 6e 63  y such a sequenc
a6c0: 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65  e,.** and the se
a6d0: 71 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61  quence is availa
a6e0: 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74  ble in another t
a6f0: 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ext encoding, th
a700: 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65  en that is.** re
a710: 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a  turned instead..
a720: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73  **.** If no vers
a730: 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75  ions of the requ
a740: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  ested collations
a750: 20 73 65 71 75 65 6e 63 65 20 61 72 65 20 61 76   sequence are av
a760: 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61  ailable, or.** a
a770: 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63  nother error occ
a780: 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
a790: 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72  urned and an err
a7a0: 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69 74 74  or message writt
a7b0: 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73  en into.** pPars
a7c0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
a7d0: 75 74 69 6e 65 20 69 73 20 61 20 77 72 61 70 70  utine is a wrapp
a7e0: 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
a7f0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20  3FindCollSeq(). 
a800: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
a810: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c   invokes the col
a820: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69  lation factory i
a830: 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c  f the named coll
a840: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
a850: 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e  found.** and gen
a860: 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20  erates an error 
a870: 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53  message..**.** S
a880: 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33  ee also: sqlite3
a890: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73  FindCollSeq(), s
a8a0: 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71  qlite3GetCollSeq
a8b0: 28 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73  ().*/.CollSeq *s
a8c0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
a8d0: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
a8e0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
a8f0: 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Name){.  sqlite3
a900: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
a910: 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e  b;.  u8 enc = EN
a920: 43 28 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74  C(db);.  u8 init
a930: 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  busy = db->init.
a940: 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  busy;.  CollSeq 
a950: 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c  *pColl;..  pColl
a960: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
a970: 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a  llSeq(db, enc, z
a980: 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b  Name, initbusy);
a990: 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79  .  if( !initbusy
a9a0: 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21   && (!pColl || !
a9b0: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a  pColl->xCmp) ){.
a9c0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
a9d0: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50  te3GetCollSeq(pP
a9e0: 61 72 73 65 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c  arse, enc, pColl
a9f0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20  , zName);.  }.. 
aa00: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
aa10: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
aa20: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
aa30: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73   increment the s
aa40: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a  chema cookie..**
aa50: 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63  .** The schema c
aa60: 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f  ookie is used to
aa70: 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20   determine when 
aa80: 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74  the schema for t
aa90: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
aaa0: 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65  hanges.  After e
aab0: 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ach schema chang
aac0: 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61  e, the cookie va
aad0: 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  lue.** changes. 
aae0: 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   When a process 
aaf0: 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20  first reads the 
ab00: 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64  schema it record
ab10: 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e  s the.** cookie.
ab20: 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68    Thereafter, wh
ab30: 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74  enever it goes t
ab40: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
ab50: 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65  abase,.** it che
ab60: 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  cks the cookie t
ab70: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
ab80: 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63  schema has not c
ab90: 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20  hanged.** since 
aba0: 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64  it was last read
abb0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61  ..**.** This pla
abc0: 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  n is not complet
abd0: 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66  ely bullet-proof
abe0: 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  .  It is possibl
abf0: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68  e for.** the sch
ac00: 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75  ema to change mu
ac10: 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64  ltiple times and
ac20: 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20   for the cookie 
ac30: 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63  to be.** set bac
ac40: 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65  k to prior value
ac50: 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68  .  But schema ch
ac60: 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71  anges are infreq
ac70: 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20  uent.** and the 
ac80: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68  probability of h
ac90: 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20  itting the same 
aca0: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20  cookie value is 
acb0: 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65  only.** 1 chance
acc0: 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65   in 2^32.  So we
acd0: 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e  're safe enough.
ace0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
acf0: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72  ChangeCookie(Par
ad00: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
ad10: 69 44 62 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d  iDb){.  int r1 =
ad20: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
ad30: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
ad40: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
ad50: 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
ad60: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
ad70: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
ad80: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
ad90: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
ada0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
adb0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
adc0: 65 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69 44  eger, db->aDb[iD
add0: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  b].pSchema->sche
ade0: 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 72 31 29  ma_cookie+1, r1)
adf0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
ae00: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
ae10: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45  ookie, iDb, BTRE
ae20: 45 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e  E_SCHEMA_VERSION
ae30: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
ae40: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
ae50: 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f  Parse, r1);.}../
ae60: 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65  *.** Measure the
ae70: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   number of chara
ae80: 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20  cters needed to 
ae90: 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  output the given
aea0: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20  .** identifier. 
aeb0: 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75   The number retu
aec0: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e  rned includes an
aed0: 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a  y quotes used.**
aee0: 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e   but does not in
aef0: 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74  clude the null t
af00: 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  erminator..**.**
af10: 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69 73   The estimate is
af20: 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20   conservative.  
af30: 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67  It might be larg
af40: 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73 0a  er that what is.
af50: 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64  ** really needed
af60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
af70: 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73  identLength(cons
af80: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
af90: 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20  t n;.  for(n=0; 
afa0: 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20  *z; n++, z++){. 
afb0: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29     if( *z=='"' )
afc0: 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72  { n++; }.  }.  r
afd0: 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a  eturn n + 2;.}..
afe0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
aff0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
b000: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75 74  ointer to an out
b010: 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 65 20  put buffer. The 
b020: 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d  second .** param
b030: 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
b040: 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  r to an integer 
b050: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
b060: 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20 77  e offset at.** w
b070: 68 69 63 68 20 74 6f 20 77 72 69 74 65 20 69 6e  hich to write in
b080: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  to the output bu
b090: 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74  ffer. This funct
b0a0: 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65 0a 2a  ion copies the.*
b0b0: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  * nul-terminated
b0c0: 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20   string pointed 
b0d0: 74 6f 20 62 79 20 74 68 65 20 74 68 69 72 64 20  to by the third 
b0e0: 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e  parameter, zSign
b0f0: 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74  edIdent,.** to t
b100: 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 66 66  he specified off
b110: 73 65 74 20 69 6e 20 74 68 65 20 62 75 66 66 65  set in the buffe
b120: 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 2a 70  r and updates *p
b130: 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20  Idx to refer.** 
b140: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
b150: 65 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  e after the last
b160: 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 62 65   byte written be
b170: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
b180: 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73 74  ** .** If the st
b190: 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64 65 6e  ring zSignedIden
b1a0: 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72  t consists entir
b1b0: 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d  ely of alpha-num
b1c0: 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63 74 65  eric.** characte
b1d0: 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65 67  rs, does not beg
b1e0: 69 6e 20 77 69 74 68 20 61 20 64 69 67 69 74 20  in with a digit 
b1f0: 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20 53 51  and is not an SQ
b200: 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68  L keyword,.** th
b210: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
b220: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  to the output bu
b230: 66 66 65 72 20 65 78 61 63 74 6c 79 20 61 73 20  ffer exactly as 
b240: 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69 73 65  it is. Otherwise
b250: 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f 74 65  ,.** it is quote
b260: 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71  d using double-q
b270: 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  uotes..*/.static
b280: 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63   void identPut(c
b290: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64  har *z, int *pId
b2a0: 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64  x, char *zSigned
b2b0: 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e  Ident){.  unsign
b2c0: 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20  ed char *zIdent 
b2d0: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
b2e0: 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a  *)zSignedIdent;.
b2f0: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64    int i, j, need
b300: 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49  Quote;.  i = *pI
b310: 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  dx;..  for(j=0; 
b320: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
b330: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
b340: 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b  3Isalnum(zIdent[
b350: 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d  j]) && zIdent[j]
b360: 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20  !='_' ) break;. 
b370: 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d   }.  needQuote =
b380: 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28   sqlite3Isdigit(
b390: 7a 49 64 65 6e 74 5b 30 5d 29 20 7c 7c 20 73 71  zIdent[0]) || sq
b3a0: 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65  lite3KeywordCode
b3b0: 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f  (zIdent, j)!=TK_
b3c0: 49 44 3b 0a 20 20 69 66 28 20 21 6e 65 65 64 51  ID;.  if( !needQ
b3d0: 75 6f 74 65 20 29 7b 0a 20 20 20 20 6e 65 65 64  uote ){.    need
b3e0: 51 75 6f 74 65 20 3d 20 7a 49 64 65 6e 74 5b 6a  Quote = zIdent[j
b3f0: 5d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 65  ];.  }..  if( ne
b400: 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d  edQuote ) z[i++]
b410: 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d   = '"';.  for(j=
b420: 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b  0; zIdent[j]; j+
b430: 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d  +){.    z[i++] =
b440: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20   zIdent[j];.    
b450: 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27  if( zIdent[j]=='
b460: 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  "' ) z[i++] = '"
b470: 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65  ';.  }.  if( nee
b480: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
b490: 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20  = '"';.  z[i] = 
b4a0: 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a  0;.  *pIdx = i;.
b4b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
b4c0: 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  e a CREATE TABLE
b4d0: 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f   statement appro
b4e0: 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67  priate for the g
b4f0: 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20  iven.** table.  
b500: 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74  Memory to hold t
b510: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73  he text of the s
b520: 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61  tatement is obta
b530: 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c  ined.** from sql
b540: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
b550: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
b560: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
b570: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
b580: 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62   char *createTab
b590: 6c 65 53 74 6d 74 28 73 71 6c 69 74 65 33 20 2a  leStmt(sqlite3 *
b5a0: 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20  db, Table *p){. 
b5b0: 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20   int i, k, n;.  
b5c0: 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63  char *zStmt;.  c
b5d0: 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70  har *zSep, *zSep
b5e0: 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c 75  2, *zEnd;.  Colu
b5f0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20  mn *pCol;.  n = 
b600: 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20  0;.  for(pCol = 
b610: 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c  p->aCol, i=0; i<
b620: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  p->nCol; i++, pC
b630: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ol++){.    n += 
b640: 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c  identLength(pCol
b650: 2d 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a 20 20  ->zName) + 5;.  
b660: 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65  }.  n += identLe
b670: 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  ngth(p->zName);.
b680: 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 20 0a 20    if( n<50 ){ . 
b690: 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20     zSep = "";.  
b6a0: 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20    zSep2 = ",";. 
b6b0: 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20     zEnd = ")";. 
b6c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70   }else{.    zSep
b6d0: 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a   = "\n  ";.    z
b6e0: 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a  Sep2 = ",\n  ";.
b6f0: 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22      zEnd = "\n)"
b700: 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20  ;.  }.  n += 35 
b710: 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a  + 6*p->nCol;.  z
b720: 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 44 62  Stmt = sqlite3Db
b730: 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 29 3b  MallocRaw(0, n);
b740: 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20  .  if( zStmt==0 
b750: 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  ){.    db->mallo
b760: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
b770: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
b780: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
b790: 66 28 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45  f(n, zStmt, "CRE
b7a0: 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20  ATE TABLE ");.  
b7b0: 6b 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  k = sqlite3Strle
b7c0: 6e 33 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64  n30(zStmt);.  id
b7d0: 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b  entPut(zStmt, &k
b7e0: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a  , p->zName);.  z
b7f0: 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b  Stmt[k++] = '(';
b800: 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61  .  for(pCol=p->a
b810: 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e  Col, i=0; i<p->n
b820: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
b830: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ){.    static co
b840: 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  nst char * const
b850: 20 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20 20   azType[] = {.  
b860: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
b870: 41 46 46 5f 54 45 58 54 20 20 20 20 2a 2f 20 22  AFF_TEXT    */ "
b880: 20 54 45 58 54 22 2c 0a 20 20 20 20 20 20 20 20   TEXT",.        
b890: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  /* SQLITE_AFF_NO
b8a0: 4e 45 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20  NE    */ "",.   
b8b0: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
b8c0: 46 46 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22 20  FF_NUMERIC */ " 
b8d0: 4e 55 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  NUM",.        /*
b8e0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
b8f0: 47 45 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a 20  GER */ " INT",. 
b900: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
b910: 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f 20  _AFF_REAL    */ 
b920: 22 20 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a 20  " REAL".    };. 
b930: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
b940: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
b950: 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e;..    sqlite3_
b960: 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a  snprintf(n-k, &z
b970: 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a  Stmt[k], zSep);.
b980: 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33      k += sqlite3
b990: 53 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74 5b  Strlen30(&zStmt[
b9a0: 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20  k]);.    zSep = 
b9b0: 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74  zSep2;.    ident
b9c0: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
b9d0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
b9e0: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61   assert( pCol->a
b9f0: 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41  ffinity-SQLITE_A
ba00: 46 46 5f 54 45 58 54 20 3e 3d 20 30 20 29 3b 0a  FF_TEXT >= 0 );.
ba10: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
ba20: 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54  ->affinity-SQLIT
ba30: 45 5f 41 46 46 5f 54 45 58 54 20 3c 20 41 72 72  E_AFF_TEXT < Arr
ba40: 61 79 53 69 7a 65 28 61 7a 54 79 70 65 29 20 29  aySize(azType) )
ba50: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
ba60: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
ba70: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
ba80: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
ba90: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
baa0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
bab0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
bac0: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
bad0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
bae0: 45 52 49 43 20 29 3b 0a 20 20 20 20 74 65 73 74  ERIC );.    test
baf0: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
bb00: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
bb10: 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20  _INTEGER );.    
bb20: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
bb30: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
bb40: 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20 20  _AFF_REAL );.   
bb50: 20 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 61 7a   .    zType = az
bb60: 54 79 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e  Type[pCol->affin
bb70: 69 74 79 20 2d 20 53 51 4c 49 54 45 5f 41 46 46  ity - SQLITE_AFF
bb80: 5f 54 45 58 54 5d 3b 0a 20 20 20 20 6c 65 6e 20  _TEXT];.    len 
bb90: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
bba0: 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 61 73  0(zType);.    as
bbb0: 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69  sert( pCol->affi
bbc0: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
bbd0: 5f 4e 4f 4e 45 20 0a 20 20 20 20 20 20 20 20 20  _NONE .         
bbe0: 20 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66 69     || pCol->affi
bbf0: 6e 69 74 79 3d 3d 73 71 6c 69 74 65 33 41 66 66  nity==sqlite3Aff
bc00: 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65 29  inityType(zType)
bc10: 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26   );.    memcpy(&
bc20: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c  zStmt[k], zType,
bc30: 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d 20   len);.    k += 
bc40: 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28  len;.    assert(
bc50: 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20 73   k<=n );.  }.  s
bc60: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
bc70: 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20  n-k, &zStmt[k], 
bc80: 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72  "%s", zEnd);.  r
bc90: 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a  eturn zStmt;.}..
bca0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
bcb0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
bcc0: 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c  report the final
bcd0: 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e   ")" that termin
bce0: 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45  ates.** a CREATE
bcf0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
bd00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
bd10: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
bd20: 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f   other action ro
bd30: 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e  utines have been
bd40: 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20   building.** is 
bd50: 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74  added to the int
bd60: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
bd70: 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65  s, assuming no e
bd80: 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63  rrors have.** oc
bd90: 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  curred..**.** An
bda0: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74   entry for the t
bdb0: 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20  able is made in 
bdc0: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
bdd0: 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73   on disk, unless
bde0: 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65  .** this is a te
bdf0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
be00: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
be10: 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69  1.  When db->ini
be20: 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20  t.busy==1.** it 
be30: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
be40: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
be50: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
be60: 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20  ause we just.** 
be70: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65  connected to the
be80: 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63   database or bec
be90: 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  ause the sqlite_
bea0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73  master table has
beb0: 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61  .** recently cha
bec0: 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74  nged, so the ent
bed0: 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  ry for this tabl
bee0: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
bef0: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   in.** the sqlit
bf00: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
bf10: 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   We do not want 
bf20: 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61  to create it aga
bf30: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  in..**.** If the
bf40: 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e   pSelect argumen
bf50: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  t is not NULL, i
bf60: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  t means that thi
bf70: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73  s routine.** was
bf80: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
bf90: 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61  e a table genera
bfa0: 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22  ted from a .** "
bfb0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e  CREATE TABLE ...
bfc0: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20   AS SELECT ..." 
bfd0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
bfe0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a  column names of.
bff0: 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
c000: 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20   will match the 
c010: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
c020: 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
c030: 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  d sqlite3EndTabl
c040: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
c050: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
c060: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
c070: 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c  .  Token *pCons,
c080: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
c090: 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65  e ',' token afte
c0a0: 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  r the last colum
c0b0: 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b  n defn. */.  Tok
c0c0: 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  en *pEnd,       
c0d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6e 61       /* The fina
c0e0: 6c 20 27 29 27 20 74 6f 6b 65 6e 20 69 6e 20 74  l ')' token in t
c0f0: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
c100: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
c110: 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20  lect         /* 
c120: 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43  Select from a "C
c130: 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c  REATE ... AS SEL
c140: 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ECT" */.){.  Tab
c150: 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  le *p;.  sqlite3
c160: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
c170: 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
c180: 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26   if( (pEnd==0 &&
c190: 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20   pSelect==0) || 
c1a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c1b0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
c1c0: 20 20 7d 0a 20 20 70 20 3d 20 70 50 61 72 73 65    }.  p = pParse
c1d0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
c1e0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
c1f0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  ;..  assert( !db
c200: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21  ->init.busy || !
c210: 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 69 44  pSelect );..  iD
c220: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
c230: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e  aToIndex(db, p->
c240: 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64  pSchema);..#ifnd
c250: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
c260: 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76  HECK.  /* Resolv
c270: 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43  e names in all C
c280: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
c290: 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a  expressions..  *
c2a0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65 63  /.  if( p->pChec
c2b0: 6b 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  k ){.    SrcList
c2c0: 20 73 53 72 63 3b 20 20 20 20 20 20 20 20 20 20   sSrc;          
c2d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65           /* Fake
c2e0: 20 53 72 63 4c 69 73 74 20 66 6f 72 20 70 50 61   SrcList for pPa
c2f0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a  rse->pNewTable *
c300: 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78  /.    NameContex
c310: 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20  t sNC;          
c320: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f        /* Name co
c330: 6e 74 65 78 74 20 66 6f 72 20 70 50 61 72 73 65  ntext for pParse
c340: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 20  ->pNewTable */. 
c350: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
c360: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
c370: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
c380: 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  l CHECK constrai
c390: 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  nts */.    int i
c3a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c3b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
c3c0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
c3d0: 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20     memset(&sNC, 
c3e0: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
c3f0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 53 72  .    memset(&sSr
c400: 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 72  c, 0, sizeof(sSr
c410: 63 29 29 3b 0a 20 20 20 20 73 53 72 63 2e 6e 53  c));.    sSrc.nS
c420: 72 63 20 3d 20 31 3b 0a 20 20 20 20 73 53 72 63  rc = 1;.    sSrc
c430: 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 70 2d  .a[0].zName = p-
c440: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 53 72 63  >zName;.    sSrc
c450: 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70 3b 0a  .a[0].pTab = p;.
c460: 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 69 43      sSrc.a[0].iC
c470: 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 20 20  ursor = -1;.    
c480: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
c490: 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72  rse;.    sNC.pSr
c4a0: 63 4c 69 73 74 20 3d 20 26 73 53 72 63 3b 0a 20  cList = &sSrc;. 
c4b0: 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 3d     sNC.ncFlags =
c4c0: 20 4e 43 5f 49 73 43 68 65 63 6b 3b 0a 20 20 20   NC_IsCheck;.   
c4d0: 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70 43 68 65   pList = p->pChe
c4e0: 63 6b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ck;.    for(i=0;
c4f0: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
c500: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
c510: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
c520: 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  xprNames(&sNC, p
c530: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
c540: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
c550: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
c560: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
c570: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
c580: 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a  _OMIT_CHECK) */.
c590: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d  .  /* If the db-
c5a0: 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20  >init.busy is 1 
c5b0: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
c5c0: 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20  reading the SQL 
c5d0: 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71  off the.  ** "sq
c5e0: 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20  lite_master" or 
c5f0: 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73  "sqlite_temp_mas
c600: 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68  ter" table on th
c610: 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20  e disk..  ** So 
c620: 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  do not write to 
c630: 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20  the disk again. 
c640: 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f   Extract the roo
c650: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  t page number.  
c660: 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ** for the table
c670: 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e   from the db->in
c680: 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64  it.newTnum field
c690: 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d  .  (The page num
c6a0: 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  ber.  ** should 
c6b0: 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68  have been put th
c6c0: 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74  ere by the sqlit
c6d0: 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e  eOpenCb routine.
c6e0: 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ).  */.  if( db-
c6f0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
c700: 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e    p->tnum = db->
c710: 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20  init.newTnum;.  
c720: 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69  }..  /* If not i
c730: 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65  nitializing, the
c740: 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72  n create a recor
c750: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  d for the new ta
c760: 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ble.  ** in the 
c770: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
c780: 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ble of the datab
c790: 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ase..  **.  ** I
c7a0: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
c7b0: 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69  ORARY table, wri
c7c0: 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74  te the entry int
c7d0: 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a  o the auxiliary.
c7e0: 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61    ** file instea
c7f0: 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61  d of into the ma
c800: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
c810: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
c820: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
c830: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64     int n;.    Vd
c840: 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20  be *v;.    char 
c850: 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76  *zType;    /* "v
c860: 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20  iew" or "table" 
c870: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79  */.    char *zTy
c880: 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22  pe2;   /* "VIEW"
c890: 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20   or "TABLE" */. 
c8a0: 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20     char *zStmt; 
c8b0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68     /* Text of th
c8c0: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f  e CREATE TABLE o
c8d0: 72 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  r CREATE VIEW st
c8e0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20  atement */..    
c8f0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
c900: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
c910: 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
c920: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73  ) return;..    s
c930: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
c940: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29  (v, OP_Close, 0)
c950: 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a  ;..    /* .    *
c960: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79  * Initialize zTy
c970: 70 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76  pe for the new v
c980: 69 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20  iew or table..  
c990: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
c9a0: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
c9b0: 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72      /* A regular
c9c0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
c9d0: 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b  zType = "table";
c9e0: 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20  .      zType2 = 
c9f0: 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66  "TABLE";.#ifndef
ca00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
ca10: 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  W.    }else{.   
ca20: 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a     /* A view */.
ca30: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76        zType = "v
ca40: 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70  iew";.      zTyp
ca50: 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e  e2 = "VIEW";.#en
ca60: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
ca70: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43  * If this is a C
ca80: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41  REATE TABLE xx A
ca90: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78  S SELECT ..., ex
caa0: 65 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54  ecute the SELECT
cab0: 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
cac0: 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  t to populate th
cad0: 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65  e new table. The
cae0: 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
caf0: 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  r for the.    **
cb00: 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e   new table is in
cb10: 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65   register pParse
cb20: 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a  ->regRoot..    *
cb30: 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68  *.    ** Once th
cb40: 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65  e SELECT has bee
cb50: 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74  n coded by sqlit
cb60: 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69  e3Select(), it i
cb70: 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75  s in a.    ** su
cb80: 69 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20  itable state to 
cb90: 71 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f  query for the co
cba0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74  lumn names and t
cbb0: 79 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a  ypes to be used.
cbc0: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65      ** by the ne
cbd0: 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a  w table..    **.
cbe0: 20 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d      ** A shared-
cbf0: 63 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  cache write-lock
cc00: 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
cc10: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
cc20: 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20   new table,.    
cc30: 2a 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c  ** as a schema-l
cc40: 6f 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c  ock must have al
cc50: 72 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69  ready been obtai
cc60: 6e 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 74  ned to create it
cc70: 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61  . Since.    ** a
cc80: 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63   schema-lock exc
cc90: 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20  ludes all other 
cca0: 64 61 74 61 62 61 73 65 20 75 73 65 72 73 2c 20  database users, 
ccb0: 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  the write-lock w
ccc0: 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72  ould.    ** be r
ccd0: 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f  edundant..    */
cce0: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
ccf0: 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74   ){.      Select
cd00: 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20  Dest dest;.     
cd10: 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b   Table *pSelTab;
cd20: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ..      assert(p
cd30: 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b  Parse->nTab==1);
cd40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
cd50: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
cd60: 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50 61  penWrite, 1, pPa
cd70: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44  rse->regRoot, iD
cd80: 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
cd90: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
cda0: 20 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 29   OPFLAG_P2ISREG)
cdb0: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
cdc0: 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20  nTab = 2;.      
cdd0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
cde0: 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
cdf0: 5f 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20  _Table, 1);.    
ce00: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
ce10: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
ce20: 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73   &dest);.      s
ce30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
ce40: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 29  (v, OP_Close, 1)
ce50: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
ce60: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
ce70: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d         pSelTab =
ce80: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
ce90: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
cea0: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
ceb0: 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d      if( pSelTab=
cec0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
ced0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
cee0: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
cef0: 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65     p->nCol = pSe
cf00: 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  lTab->nCol;.    
cf10: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53      p->aCol = pS
cf20: 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
cf30: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
cf40: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ol = 0;.        
cf50: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  pSelTab->aCol = 
cf60: 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
cf70: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
cf80: 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  , pSelTab);.    
cf90: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
cfa0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
cfb0: 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
cfc0: 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
cfd0: 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ent */.    if( p
cfe0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
cff0: 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61  zStmt = createTa
d000: 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a  bleStmt(db, p);.
d010: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d020: 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 2d   n = (int)(pEnd-
d030: 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61  >z - pParse->sNa
d040: 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a  meToken.z) + 1;.
d050: 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71        zStmt = sq
d060: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
d070: 20 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45   .          "CRE
d080: 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54  ATE %s %.*s", zT
d090: 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d  ype2, n, pParse-
d0a0: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20  >sNameToken.z.  
d0b0: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
d0c0: 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20    /* A slot for 
d0d0: 74 68 65 20 72 65 63 6f 72 64 20 68 61 73 20 61  the record has a
d0e0: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
d0f0: 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20  cated in the .  
d100: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54    ** SQLITE_MAST
d110: 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75  ER table.  We ju
d120: 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74  st need to updat
d130: 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68  e that slot with
d140: 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20   all.    ** the 
d150: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76  information we'v
d160: 65 20 63 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20  e collected..   
d170: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
d180: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
d190: 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54 45  e,.      "UPDATE
d1a0: 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20   %Q.%s ".       
d1b0: 20 20 22 53 45 54 20 74 79 70 65 3d 27 25 73 27    "SET type='%s'
d1c0: 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e  , name=%Q, tbl_n
d1d0: 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65  ame=%Q, rootpage
d1e0: 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20  =#%d, sql=%Q ". 
d1f0: 20 20 20 20 20 20 22 57 48 45 52 45 20 72 6f 77        "WHERE row
d200: 69 64 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64  id=#%d",.      d
d210: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
d220: 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
d230: 69 44 62 29 2c 0a 20 20 20 20 20 20 7a 54 79 70  iDb),.      zTyp
d240: 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
d250: 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
d260: 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  e,.      pParse-
d270: 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20  >regRoot,.      
d280: 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70 50 61  zStmt,.      pPa
d290: 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20  rse->regRowid.  
d2a0: 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
d2b0: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74  DbFree(db, zStmt
d2c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
d2d0: 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
d2e0: 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  e, iDb);..#ifnde
d2f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
d300: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
d310: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
d320: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72  if we need to cr
d330: 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73  eate an sqlite_s
d340: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f  equence table fo
d350: 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67  r.    ** keeping
d360: 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e   track of autoin
d370: 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20  crement keys..  
d380: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
d390: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
d3a0: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20  toincrement ){. 
d3b0: 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26       Db *pDb = &
d3c0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
d3d0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
d3e0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
d3f0: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
d400: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
d410: 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61  >pSchema->pSeqTa
d420: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
d430: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
d440: 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
d450: 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
d460: 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71  LE %Q.sqlite_seq
d470: 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22  uence(name,seq)"
d480: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  ,.          pDb-
d490: 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29  >zName.        )
d4a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d4b0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52  #endif..    /* R
d4c0: 65 70 61 72 73 65 20 65 76 65 72 79 74 68 69 6e  eparse everythin
d4d0: 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20  g to update our 
d4e0: 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74  internal data st
d4f0: 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20  ructures */.    
d500: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61  sqlite3VdbeAddPa
d510: 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69  rseSchemaOp(v, i
d520: 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
d530: 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
d540: 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d  f(db, "tbl_name=
d550: 27 25 71 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29  '%q'", p->zName)
d560: 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64  );.  }...  /* Ad
d570: 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74  d the table to t
d580: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
d590: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
d5a0: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
d5b0: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
d5c0: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 54 61 62  .busy ){.    Tab
d5d0: 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63  le *pOld;.    Sc
d5e0: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
d5f0: 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  p->pSchema;.    
d600: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
d610: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
d620: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
d630: 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
d640: 48 61 73 68 49 6e 73 65 72 74 28 26 70 53 63 68  HashInsert(&pSch
d650: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d  ema->tblHash, p-
d660: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
d670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d680: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 6c       sqlite3Strl
d690: 65 6e 33 30 28 70 2d 3e 7a 4e 61 6d 65 29 2c 70  en30(p->zName),p
d6a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20  );.    if( pOld 
d6b0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
d6c0: 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20   p==pOld );  /* 
d6d0: 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
d6e0: 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48   failed inside H
d6f0: 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20  ashInsert() */. 
d700: 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46       db->mallocF
d710: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ailed = 1;.     
d720: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
d730: 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
d740: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
d750: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
d760: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
d770: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
d780: 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45  _OMIT_ALTERTABLE
d790: 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65  .    if( !p->pSe
d7a0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f  lect ){.      co
d7b0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
d7c0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
d7d0: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
d7e0: 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20  en.z;.      int 
d7f0: 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73  nName;.      ass
d800: 65 72 74 28 20 21 70 53 65 6c 65 63 74 20 26 26  ert( !pSelect &&
d810: 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29   pCons && pEnd )
d820: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e  ;.      if( pCon
d830: 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  s->z==0 ){.     
d840: 20 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b     pCons = pEnd;
d850: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
d860: 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28 28 63 6f  Name = (int)((co
d870: 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6e 73  nst char *)pCons
d880: 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20  ->z - zName);.  
d890: 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66      p->addColOff
d8a0: 73 65 74 20 3d 20 31 33 20 2b 20 73 71 6c 69 74  set = 13 + sqlit
d8b0: 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e  e3Utf8CharLen(zN
d8c0: 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20  ame, nName);.   
d8d0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
d8e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d8f0: 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20  OMIT_VIEW./*.** 
d900: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
d910: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e   this routine in
d920: 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65   order to create
d930: 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76   a new VIEW.*/.v
d940: 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
d950: 65 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a  eView(.  Parse *
d960: 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54  pParse,     /* T
d970: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
d980: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
d990: 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68  Begin,     /* Th
d9a0: 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
d9b0: 68 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73  hat begins the s
d9c0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f  tatement */.  To
d9d0: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
d9e0: 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68   /* The token th
d9f0: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  at holds the nam
da00: 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f  e of the view */
da10: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
da20: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b  ,     /* The tok
da30: 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  en that holds th
da40: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69  e name of the vi
da50: 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ew */.  Select *
da60: 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20  pSelect,   /* A 
da70: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
da80: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
da90: 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a  e the new view *
daa0: 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20  /.  int isTemp, 
dab0: 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66         /* TRUE f
dac0: 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76  or a TEMPORARY v
dad0: 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45  iew */.  int noE
dae0: 72 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  rr          /* S
daf0: 75 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d 65  uppress error me
db00: 73 73 61 67 65 73 20 69 66 20 56 49 45 57 20 61  ssages if VIEW a
db10: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
db20: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  .){.  Table *p;.
db30: 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74    int n;.  const
db40: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65   char *z;.  Toke
db50: 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65  n sEnd;.  DbFixe
db60: 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20  r sFix;.  Token 
db70: 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e  *pName = 0;.  in
db80: 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33  t iDb;.  sqlite3
db90: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
dba0: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
dbb0: 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20  ->nVar>0 ){.    
dbc0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
dbd0: 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74  pParse, "paramet
dbe0: 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f  ers are not allo
dbf0: 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a  wed in views");.
dc00: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
dc10: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
dc20: 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
dc30: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
dc40: 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65  tartTable(pParse
dc50: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
dc60: 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20  , isTemp, 1, 0, 
dc70: 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50  noErr);.  p = pP
dc80: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
dc90: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
dca0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
dcb0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
dcc0: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
dcd0: 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ct);.    return;
dce0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 77  .  }.  sqlite3Tw
dcf0: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
dd00: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
dd10: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62  , &pName);.  iDb
dd20: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
dd30: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70  ToIndex(db, p->p
dd40: 53 63 68 65 6d 61 29 3b 0a 20 20 69 66 28 20 73  Schema);.  if( s
dd50: 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
dd60: 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
dd70: 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29  , "view", pName)
dd80: 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 46  .    && sqlite3F
dd90: 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20  ixSelect(&sFix, 
dda0: 70 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20  pSelect).  ){.  
ddb0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
ddc0: 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63  elete(db, pSelec
ddd0: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
dde0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61    }..  /* Make a
ddf0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74   copy of the ent
de00: 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ire SELECT state
de10: 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
de20: 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a  s the view..  **
de30: 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65   This will force
de40: 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f   all the Expr.to
de50: 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20  ken.z values to 
de60: 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  be dynamically. 
de70: 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61   ** allocated ra
de80: 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20  ther than point 
de90: 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  to the input str
dea0: 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e  ing - which mean
deb0: 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79  s that.  ** they
dec0: 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66   will persist af
ded0: 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ter the current 
dee0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63  sqlite3_exec() c
def0: 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a  all returns..  *
df00: 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d  /.  p->pSelect =
df10: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
df20: 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45  p(db, pSelect, E
df30: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
df40: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
df50: 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63  elete(db, pSelec
df60: 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  t);.  if( db->ma
df70: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
df80: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
df90: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
dfa0: 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  sy ){.    sqlite
dfb0: 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
dfc0: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  mes(pParse, p);.
dfd0: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
dfe0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
dff0: 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
e000: 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e  ement.  Make sEn
e010: 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20  d point to.  ** 
e020: 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20  the end..  */.  
e030: 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73  sEnd = pParse->s
e040: 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28  LastToken;.  if(
e050: 20 41 4c 57 41 59 53 28 73 45 6e 64 2e 7a 5b 30   ALWAYS(sEnd.z[0
e060: 5d 21 3d 30 29 20 26 26 20 73 45 6e 64 2e 7a 5b  ]!=0) && sEnd.z[
e070: 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73  0]!=';' ){.    s
e080: 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b  End.z += sEnd.n;
e090: 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  .  }.  sEnd.n = 
e0a0: 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28 73  0;.  n = (int)(s
e0b0: 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e  End.z - pBegin->
e0c0: 7a 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e  z);.  z = pBegin
e0d0: 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 41 4c  ->z;.  while( AL
e0e0: 57 41 59 53 28 6e 3e 30 29 20 26 26 20 73 71 6c  WAYS(n>0) && sql
e0f0: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d  ite3Isspace(z[n-
e100: 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  1]) ){ n--; }.  
e110: 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d  sEnd.z = &z[n-1]
e120: 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a  ;.  sEnd.n = 1;.
e130: 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65  .  /* Use sqlite
e140: 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61  3EndTable() to a
e150: 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20 74  dd the view to t
e160: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
e170: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
e180: 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72  te3EndTable(pPar
e190: 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 29  se, 0, &sEnd, 0)
e1a0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  ;.  return;.}.#e
e1b0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
e1c0: 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66  MIT_VIEW */..#if
e1d0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
e1e0: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
e1f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
e200: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
e210: 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c  )./*.** The Tabl
e220: 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62  e structure pTab
e230: 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56  le is really a V
e240: 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68  IEW.  Fill in th
e250: 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68  e names of.** th
e260: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
e270: 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61   view in the pTa
e280: 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  ble structure.  
e290: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
e2a0: 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20  r.** of errors. 
e2b0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
e2c0: 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72  seen leave an er
e2d0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
e2e0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
e2f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69  */.int sqlite3Vi
e300: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
e310: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
e320: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
e330: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
e340: 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61  ;   /* A fake ta
e350: 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77  ble from which w
e360: 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c 74  e get the result
e370: 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74   set */.  Select
e380: 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43   *pSel;     /* C
e390: 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
e3a0: 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  T that implement
e3b0: 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  s the view */.  
e3c0: 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20  int nErr = 0;   
e3d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
e3e0: 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
e3f0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
e400: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
e410: 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68  orarily holds th
e420: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  e number of curs
e430: 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a  ors assigned */.
e440: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
e450: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
e460: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
e470: 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65  ion for malloc e
e480: 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 28  rrors */.  int (
e490: 2a 78 41 75 74 68 29 28 76 6f 69 64 2a 2c 69 6e  *xAuth)(void*,in
e4a0: 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  t,const char*,co
e4b0: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
e4c0: 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72  char*,const char
e4d0: 2a 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *);..  assert( p
e4e0: 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65  Table );..#ifnde
e4f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
e500: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
e510: 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c   sqlite3VtabCall
e520: 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20  Connect(pParse, 
e530: 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72  pTable) ){.    r
e540: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
e550: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73  OR;.  }.  if( Is
e560: 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20  Virtual(pTable) 
e570: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
e580: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
e590: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f  TE_OMIT_VIEW.  /
e5a0: 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f  * A positive nCo
e5b0: 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75  l means the colu
e5c0: 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68  mns names for th
e5d0: 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a  is view are.  **
e5e0: 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a   already known..
e5f0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
e600: 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75  e->nCol>0 ) retu
e610: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65  rn 0;..  /* A ne
e620: 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61  gative nCol is a
e630: 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20   special marker 
e640: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20  meaning that we 
e650: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  are currently.  
e660: 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d  ** trying to com
e670: 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pute the column 
e680: 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e  names.  If we en
e690: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
e6a0: 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67   with.  ** a neg
e6b0: 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d  ative nCol, it m
e6c0: 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65  eans two or more
e6d0: 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f   views form a lo
e6e0: 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  op, like this:. 
e6f0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45   **.  **     CRE
e700: 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20  ATE VIEW one AS 
e710: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77  SELECT * FROM tw
e720: 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  o;.  **     CREA
e730: 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53  TE VIEW two AS S
e740: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65  ELECT * FROM one
e750: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75  ;.  **.  ** Actu
e760: 61 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f 72 20  ally, the error 
e770: 61 62 6f 76 65 20 69 73 20 6e 6f 77 20 63 61 75  above is now cau
e780: 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61  ght prior to rea
e790: 63 68 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74  ching this point
e7a0: 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 66  ..  ** But the f
e7b0: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20 69 73  ollowing test is
e7c0: 20 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74   still important
e7d0: 20 61 73 20 69 74 20 64 6f 65 73 20 63 6f 6d 65   as it does come
e7e0: 20 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20   up.  ** in the 
e7f0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20  following:.  ** 
e800: 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
e810: 20 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28   TABLE main.ex1(
e820: 61 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  a);.  **     CRE
e830: 41 54 45 20 54 45 4d 50 20 56 49 45 57 20 65 78  ATE TEMP VIEW ex
e840: 31 20 41 53 20 53 45 4c 45 43 54 20 61 20 46 52  1 AS SELECT a FR
e850: 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20  OM ex1;.  **    
e860: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
e870: 65 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20  emp.ex1;.  */.  
e880: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
e890: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
e8a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
e8b0: 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69  , "view %s is ci
e8c0: 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64  rcularly defined
e8d0: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
e8e0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
e8f0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
e900: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29  Table->nCol>=0 )
e910: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65  ;..  /* If we ge
e920: 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
e930: 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20  eans we need to 
e940: 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c  compute the tabl
e950: 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f  e names..  ** No
e960: 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  te that the call
e970: 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c   to sqlite3Resul
e980: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77  tSetOfSelect() w
e990: 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20  ill expand any. 
e9a0: 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73   ** "*" elements
e9b0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20   in the results 
e9c0: 73 65 74 20 6f 66 20 74 68 65 20 76 69 65 77 20  set of the view 
e9d0: 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20  and will assign 
e9e0: 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20  cursors.  ** to 
e9f0: 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  the elements of 
ea00: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
ea10: 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20    But we do not 
ea20: 77 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67  want these chang
ea30: 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65  es.  ** to be pe
ea40: 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65  rmanent.  So the
ea50: 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
ea60: 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f  done on a copy o
ea70: 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a  f the SELECT.  *
ea80: 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  * statement that
ea90: 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
eaa0: 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  w..  */.  assert
eab0: 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  ( pTable->pSelec
eac0: 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71  t );.  pSel = sq
ead0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
eae0: 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  b, pTable->pSele
eaf0: 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53  ct, 0);.  if( pS
eb00: 65 6c 20 29 7b 0a 20 20 20 20 75 38 20 65 6e 61  el ){.    u8 ena
eb10: 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 64  bleLookaside = d
eb20: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
eb30: 61 62 6c 65 64 3b 0a 20 20 20 20 6e 20 3d 20 70  abled;.    n = p
eb40: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20  Parse->nTab;.   
eb50: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
eb60: 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
eb70: 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29  rse, pSel->pSrc)
eb80: 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43  ;.    pTable->nC
eb90: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 64 62 2d  ol = -1;.    db-
eba0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
ebb0: 6c 65 64 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  led = 0;.#ifndef
ebc0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
ebd0: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 78  HORIZATION.    x
ebe0: 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75 74 68  Auth = db->xAuth
ebf0: 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20  ;.    db->xAuth 
ec00: 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  = 0;.    pSelTab
ec10: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
ec20: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
ec30: 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64  se, pSel);.    d
ec40: 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68  b->xAuth = xAuth
ec50: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 53 65 6c  ;.#else.    pSel
ec60: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
ec70: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
ec80: 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23 65  Parse, pSel);.#e
ec90: 6e 64 69 66 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  ndif.    db->loo
eca0: 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20  kaside.bEnabled 
ecb0: 3d 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64  = enableLookasid
ecc0: 65 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  e;.    pParse->n
ecd0: 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28  Tab = n;.    if(
ece0: 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20   pSelTab ){.    
ecf0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
ed00: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
ed10: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
ed20: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
ed30: 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61  .      pTable->a
ed40: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
ed50: 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  Col;.      pSelT
ed60: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
ed70: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
ed80: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  l = 0;.      sql
ed90: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
eda0: 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  db, pSelTab);.  
edb0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
edc0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
edd0: 6c 64 28 64 62 2c 20 30 2c 20 70 54 61 62 6c 65  ld(db, 0, pTable
ede0: 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
edf0: 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68      pTable->pSch
ee00: 65 6d 61 2d 3e 66 6c 61 67 73 20 7c 3d 20 44 42  ema->flags |= DB
ee10: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20  _UnresetViews;. 
ee20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ee30: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
ee40: 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  ;.      nErr++;.
ee50: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
ee60: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
ee70: 2c 20 70 53 65 6c 29 3b 0a 20 20 7d 20 65 6c 73  , pSel);.  } els
ee80: 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  e {.    nErr++;.
ee90: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
eea0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
eeb0: 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  /.  return nErr;
eec0: 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21    .}.#endif /* !
eed0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
eee0: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
eef0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
ef00: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
ef10: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
ef20: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
ef30: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c  ** Clear the col
ef40: 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65  umn names from e
ef50: 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61 74  very VIEW in dat
ef60: 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74  abase idx..*/.st
ef70: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
ef80: 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c  ViewResetAll(sql
ef90: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64  ite3 *db, int id
efa0: 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  x){.  HashElem *
efb0: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  i;.  assert( sql
efc0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
efd0: 65 6c 64 28 64 62 2c 20 69 64 78 2c 20 30 29 20  eld(db, idx, 0) 
efe0: 29 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73 50  );.  if( !DbHasP
eff0: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
f000: 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
f010: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  ) ) return;.  fo
f020: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
f030: 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78  rst(&db->aDb[idx
f040: 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ].pSchema->tblHa
f050: 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48  sh); i;i=sqliteH
f060: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
f070: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
f080: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
f090: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
f0a0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
f0b0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 43 6f 6c   sqliteDeleteCol
f0c0: 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61  umnNames(db, pTa
f0d0: 62 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  b);.      pTab->
f0e0: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
f0f0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  pTab->nCol = 0;.
f100: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c      }.  }.  DbCl
f110: 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20  earProperty(db, 
f120: 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56  idx, DB_UnresetV
f130: 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  iews);.}.#else.#
f140: 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69   define sqliteVi
f150: 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a  ewResetAll(A,B).
f160: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
f170: 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f  _OMIT_VIEW */../
f180: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
f190: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
f1a0: 74 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75  the VDBE to adju
f1b0: 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  st the internal 
f1c0: 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62  schema.** used b
f1d0: 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68  y SQLite when th
f1e0: 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f  e btree layer mo
f1f0: 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74  ves a table root
f200: 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f   page. The.** ro
f210: 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62  ot-page of a tab
f220: 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64  le or index in d
f230: 61 74 61 62 61 73 65 20 69 44 62 20 68 61 73 20  atabase iDb has 
f240: 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72  changed from iFr
f250: 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a  om.** to iTo..**
f260: 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31 37 32 38  .** Ticket #1728
f270: 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c 20 74 61  :  The symbol ta
f280: 62 6c 65 20 6d 69 67 68 74 20 73 74 69 6c 6c 20  ble might still 
f290: 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74  contain informat
f2a0: 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73  ion.** on tables
f2b0: 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73 20   and/or indices 
f2c0: 74 68 61 74 20 61 72 65 20 74 68 65 20 70 72 6f  that are the pro
f2d0: 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 64 65  cess of being de
f2e0: 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75  leted..** If you
f2f0: 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e   are unlucky, on
f300: 65 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74  e of those delet
f310: 65 64 20 69 6e 64 69 63 65 73 20 6f 72 20 74 61  ed indices or ta
f320: 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61  bles might.** ha
f330: 76 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74  ve the same root
f340: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 74  page number as t
f350: 68 65 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72  he real table or
f360: 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 2a   index that is.*
f370: 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20  * being moved.  
f380: 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f  So we cannot sto
f390: 70 20 73 65 61 72 63 68 69 6e 67 20 61 66 74 65  p searching afte
f3a0: 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  r the first matc
f3b0: 68 20 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68  h .** because th
f3c0: 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 6d 69  e first match mi
f3d0: 67 68 74 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f  ght be for one o
f3e0: 66 20 74 68 65 20 64 65 6c 65 74 65 64 20 69 6e  f the deleted in
f3f0: 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c  dices.** or tabl
f400: 65 73 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74  es and not the t
f410: 61 62 6c 65 2f 69 6e 64 65 78 20 74 68 61 74 20  able/index that 
f420: 69 73 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  is actually bein
f430: 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d  g moved..** We m
f440: 75 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f  ust continue loo
f450: 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74  ping until all t
f460: 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65  ables and indice
f470: 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61  s with.** rootpa
f480: 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20 62  ge==iFrom have b
f490: 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f  een converted to
f4a0: 20 68 61 76 65 20 61 20 72 6f 6f 74 70 61 67 65   have a rootpage
f4b0: 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72   of iTo.** in or
f4c0: 64 65 72 20 74 6f 20 62 65 20 63 65 72 74 61 69  der to be certai
f4d0: 6e 20 74 68 61 74 20 77 65 20 67 6f 74 20 74 68  n that we got th
f4e0: 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a  e right one..*/.
f4f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f500: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76  MIT_AUTOVACUUM.v
f510: 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50  oid sqlite3RootP
f520: 61 67 65 4d 6f 76 65 64 28 73 71 6c 69 74 65 33  ageMoved(sqlite3
f530: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69   *db, int iDb, i
f540: 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
f550: 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  o){.  HashElem *
f560: 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70  pElem;.  Hash *p
f570: 48 61 73 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b  Hash;.  Db *pDb;
f580: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
f590: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
f5a0: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
f5b0: 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
f5c0: 44 62 5b 69 44 62 5d 3b 0a 20 20 70 48 61 73 68  Db[iDb];.  pHash
f5d0: 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61   = &pDb->pSchema
f5e0: 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72  ->tblHash;.  for
f5f0: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
f600: 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
f610: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
f620: 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
f630: 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
f640: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
f650: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
f660: 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d   if( pTab->tnum=
f670: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
f680: 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pTab->tnum = iTo
f690: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48  ;.    }.  }.  pH
f6a0: 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68  ash = &pDb->pSch
f6b0: 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20  ema->idxHash;.  
f6c0: 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65  for(pElem=sqlite
f6d0: 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29  HashFirst(pHash)
f6e0: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
f6f0: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
f700: 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78  lem)){.    Index
f710: 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48   *pIdx = sqliteH
f720: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
f730: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e      if( pIdx->tn
f740: 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  um==iFrom ){.   
f750: 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20     pIdx->tnum = 
f760: 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  iTo;.    }.  }.}
f770: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
f780: 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61  rite code to era
f790: 73 65 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  se the table wit
f7a0: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
f7b0: 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  le from database
f7c0: 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72   iDb..** Also wr
f7d0: 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69  ite code to modi
f7e0: 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  fy the sqlite_ma
f7f0: 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69  ster table and i
f800: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
f810: 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65  * if a root-page
f820: 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   of another tabl
f830: 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68  e is moved by th
f840: 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68  e btree-layer wh
f850: 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20  ilst.** erasing 
f860: 69 54 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e  iTable (this can
f870: 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20   happen with an 
f880: 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
f890: 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69  base)..*/ .stati
f8a0: 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f  c void destroyRo
f8b0: 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a 70 50  otPage(Parse *pP
f8c0: 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65  arse, int iTable
f8d0: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
f8e0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
f8f0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
f900: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
f910: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
f920: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
f930: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
f940: 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c  Destroy, iTable,
f950: 20 72 31 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c   r1, iDb);.  sql
f960: 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
f970: 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  rse);.#ifndef SQ
f980: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
f990: 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73  CUUM.  /* OP_Des
f9a0: 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69  troy stores an i
f9b0: 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66  n integer r1. If
f9c0: 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20   this integer.  
f9d0: 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ** is non-zero, 
f9e0: 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
f9f0: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
fa00: 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64  of a table moved
fa10: 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f   to.  ** locatio
fa20: 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f  n iTable. The fo
fa30: 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64  llowing code mod
fa40: 69 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65  ifies the sqlite
fa50: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f  _master table to
fa60: 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68  .  ** reflect th
fa70: 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  is..  **.  ** Th
fa80: 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20  e "#NNN" in the 
fa90: 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c  SQL is a special
faa0: 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d   constant that m
fab0: 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61  eans whatever va
fac0: 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72  lue.  ** is in r
fad0: 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65  egister NNN.  Se
fae0: 65 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 20  e grammar rules 
faf0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
fb00: 74 68 65 20 54 4b 5f 52 45 47 49 53 54 45 52 0a  the TK_REGISTER.
fb10: 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61    ** token for a
fb20: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
fb30: 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71  ation..  */.  sq
fb40: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
fb50: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22  (pParse, .     "
fb60: 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54  UPDATE %Q.%s SET
fb70: 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45   rootpage=%d WHE
fb80: 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70  RE #%d AND rootp
fb90: 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70  age=#%d",.     p
fba0: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
fbb0: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
fbc0: 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69 54  A_TABLE(iDb), iT
fbd0: 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23  able, r1, r1);.#
fbe0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52  endif.  sqlite3R
fbf0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
fc00: 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a  arse, r1);.}../*
fc10: 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63  .** Write VDBE c
fc20: 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62  ode to erase tab
fc30: 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20  le pTab and all 
fc40: 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63  associated indic
fc50: 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43  es on disk..** C
fc60: 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  ode to update th
fc70: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
fc80: 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72  tables and inter
fc90: 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e  nal schema defin
fca0: 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73  itions.** in cas
fcb0: 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65  e a root-page be
fcc0: 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68  longing to anoth
fcd0: 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
fce0: 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c  d by the btree l
fcf0: 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20  ayer.** is also 
fd00: 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20  added (this can 
fd10: 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61  happen with an a
fd20: 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
fd30: 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
fd40: 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c  void destroyTabl
fd50: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
fd60: 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23   Table *pTab){.#
fd70: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
fd80: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49  T_AUTOVACUUM.  I
fd90: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
fda0: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
fdb0: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
fdc0: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
fdd0: 53 63 68 65 6d 61 29 3b 0a 20 20 64 65 73 74 72  Schema);.  destr
fde0: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
fdf0: 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69  e, pTab->tnum, i
fe00: 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  Db);.  for(pIdx=
fe10: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
fe20: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
fe30: 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72  Next){.    destr
fe40: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
fe50: 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  e, pIdx->tnum, i
fe60: 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  Db);.  }.#else. 
fe70: 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
fe80: 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d  ase may be auto-
fe90: 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28  vacuum capable (
fea0: 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  if SQLITE_OMIT_A
feb0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69  UTOVACUUM.  ** i
fec0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20  s not defined), 
fed0: 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72  then it is impor
fee0: 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f  tant to call OP_
fef0: 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20  Destroy on the. 
ff00: 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e   ** table and in
ff10: 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69  dex root-pages i
ff20: 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e  n order, startin
ff30: 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72  g with the numer
ff40: 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72  ically .  ** lar
ff50: 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
ff60: 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 72  umber. This guar
ff70: 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65  antees that none
ff80: 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   of the root-pag
ff90: 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65  es.  ** to be de
ffa0: 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63  stroyed is reloc
ffb0: 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ated by an earli
ffc0: 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69  er OP_Destroy. i
ffd0: 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  .e. if the.  ** 
ffe0: 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63  following were c
fff0: 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oded:.  **.  ** 
10000 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20  OP_Destroy 4 0. 
10010 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f   ** ....  ** OP_
10020 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a  Destroy 5 0.  **
10030 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70  .  ** and root p
10040 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 74  age 5 happened t
10050 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 74  o be the largest
10060 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
10070 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  r in the.  ** da
10080 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f  tabase, then roo
10090 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62  t page 5 would b
100a0 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20  e moved to page 
100b0 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22  4 by the .  ** "
100c0 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20  OP_Destroy 4 0" 
100d0 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73  opcode. The subs
100e0 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72  equent "OP_Destr
100f0 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69  oy 5 0" would hi
10100 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69  t.  ** a free-li
10110 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  st page..  */.  
10120 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d  int iTab = pTab-
10130 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65  >tnum;.  int iDe
10140 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20  stroyed = 0;..  
10150 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
10160 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
10170 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20   int iLargest = 
10180 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73  0;..    if( iDes
10190 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61  troyed==0 || iTa
101a0 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a  b<iDestroyed ){.
101b0 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d        iLargest =
101c0 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20   iTab;.    }.   
101d0 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
101e0 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
101f0 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
10200 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20  .      int iIdx 
10210 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20  = pIdx->tnum;.  
10220 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
10230 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
10240 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
10250 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 65    if( (iDestroye
10260 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44  d==0 || (iIdx<iD
10270 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 49  estroyed)) && iI
10280 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20  dx>iLargest ){. 
10290 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20         iLargest 
102a0 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a  = iIdx;.      }.
102b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c      }.    if( iL
102c0 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20  argest==0 ){.   
102d0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
102e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
102f0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
10300 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
10310 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
10320 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 61 73 73  hema);.      ass
10330 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
10340 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e  Db<pParse->db->n
10350 44 62 20 29 3b 0a 20 20 20 20 20 20 64 65 73 74  Db );.      dest
10360 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
10370 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69 44  se, iLargest, iD
10380 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74 72  b);.      iDestr
10390 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b  oyed = iLargest;
103a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
103b0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  f.}../*.** Remov
103c0 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74  e entries from t
103d0 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20  he sqlite_statN 
103e0 74 61 62 6c 65 73 20 28 66 6f 72 20 4e 20 69 6e  tables (for N in
103f0 20 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66 74   (1,2,3)).** aft
10400 65 72 20 61 20 44 52 4f 50 20 49 4e 44 45 58 20  er a DROP INDEX 
10410 6f 72 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f  or DROP TABLE co
10420 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  mmand..*/.static
10430 20 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65   void sqlite3Cle
10440 61 72 53 74 61 74 54 61 62 6c 65 73 28 0a 20 20  arStatTables(.  
10450 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
10460 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
10470 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
10480 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20  .  int iDb,     
10490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
104a0 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   database number
104b0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
104c0 20 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a 20   *zType,     /* 
104d0 22 69 64 78 22 20 6f 72 20 22 74 62 6c 22 20 2a  "idx" or "tbl" *
104e0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
104f0 7a 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61  zName      /* Na
10500 6d 65 20 6f 66 20 69 6e 64 65 78 20 6f 72 20 74  me of index or t
10510 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  able */.){.  int
10520 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
10530 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61 72   *zDbName = pPar
10540 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
10550 2e 7a 4e 61 6d 65 3b 0a 20 20 66 6f 72 28 69 3d  .zName;.  for(i=
10560 31 3b 20 69 3c 3d 33 3b 20 69 2b 2b 29 7b 0a 20  1; i<=3; i++){. 
10570 20 20 20 63 68 61 72 20 7a 54 61 62 5b 32 34 5d     char zTab[24]
10580 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
10590 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54  printf(sizeof(zT
105a0 61 62 29 2c 7a 54 61 62 2c 22 73 71 6c 69 74 65  ab),zTab,"sqlite
105b0 5f 73 74 61 74 25 64 22 2c 69 29 3b 0a 20 20 20  _stat%d",i);.   
105c0 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
105d0 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
105e0 2c 20 7a 54 61 62 2c 20 7a 44 62 4e 61 6d 65 29  , zTab, zDbName)
105f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10600 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
10610 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45  rse,.        "DE
10620 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
10630 57 48 45 52 45 20 25 73 3d 25 51 22 2c 0a 20 20  WHERE %s=%Q",.  
10640 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a        zDbName, z
10650 54 61 62 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d  Tab, zType, zNam
10660 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
10670 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
10680 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64  nerate code to d
10690 72 6f 70 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a  rop a table..*/.
106a0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
106b0 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20  DropTable(Parse 
106c0 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
106d0 70 54 61 62 2c 20 69 6e 74 20 69 44 62 2c 20 69  pTab, int iDb, i
106e0 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20 56 64  nt isView){.  Vd
106f0 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33  be *v;.  sqlite3
10700 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
10710 62 3b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54  b;.  Trigger *pT
10720 72 69 67 67 65 72 3b 0a 20 20 44 62 20 2a 70 44  rigger;.  Db *pD
10730 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
10740 5d 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  ];..  v = sqlite
10750 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
10760 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
10770 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67   );.  sqlite3Beg
10780 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
10790 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
107a0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
107b0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
107c0 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74  BLE.  if( IsVirt
107d0 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
107e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
107f0 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29  p0(v, OP_VBegin)
10800 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
10810 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67  /* Drop all trig
10820 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  gers associated 
10830 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62  with the table b
10840 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f  eing dropped. Co
10850 64 65 0a 20 20 2a 2a 20 69 73 20 67 65 6e 65 72  de.  ** is gener
10860 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65  ated to remove e
10870 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69  ntries from sqli
10880 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72  te_master and/or
10890 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d  .  ** sqlite_tem
108a0 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71 75  p_master if requ
108b0 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 72  ired..  */.  pTr
108c0 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54  igger = sqlite3T
108d0 72 69 67 67 65 72 4c 69 73 74 28 70 50 61 72 73  riggerList(pPars
108e0 65 2c 20 70 54 61 62 29 3b 0a 20 20 77 68 69 6c  e, pTab);.  whil
108f0 65 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20  e( pTrigger ){. 
10900 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
10910 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  ger->pSchema==pT
10920 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a  ab->pSchema || .
10930 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72          pTrigger
10940 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61  ->pSchema==db->a
10950 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b  Db[1].pSchema );
10960 0a 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70  .    sqlite3Drop
10970 54 72 69 67 67 65 72 50 74 72 28 70 50 61 72 73  TriggerPtr(pPars
10980 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20  e, pTrigger);.  
10990 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72    pTrigger = pTr
109a0 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  igger->pNext;.  
109b0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
109c0 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
109d0 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65  MENT.  /* Remove
109e0 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20   any entries of 
109f0 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
10a00 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69  nce table associ
10a10 61 74 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74  ated with.  ** t
10a20 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
10a30 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73 20  ropped. This is 
10a40 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20  done before the 
10a50 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65 64  table is dropped
10a60 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72  .  ** at the btr
10a70 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73  ee level, in cas
10a80 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71  e the sqlite_seq
10a90 75 65 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64  uence table need
10aa0 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20 61  s to.  ** move a
10ab0 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
10ac0 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70  e drop (can happ
10ad0 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  en in auto-vacuu
10ae0 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20 20  m mode)..  */.  
10af0 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61  if( pTab->tabFla
10b00 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72  gs & TF_Autoincr
10b10 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c  ement ){.    sql
10b20 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
10b30 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 44  pParse,.      "D
10b40 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71  ELETE FROM %Q.sq
10b50 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48  lite_sequence WH
10b60 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20  ERE name=%Q",.  
10b70 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20      pDb->zName, 
10b80 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pTab->zName.    
10b90 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
10ba0 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c   /* Drop all SQL
10bb0 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
10bc0 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69   and index entri
10bd0 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  es that refer to
10be0 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 2e   the.  ** table.
10bf0 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d   The program nam
10c00 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  e loops through 
10c10 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
10c20 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 2a   and deletes.  *
10c30 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74  * every row that
10c40 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
10c50 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  le of the same n
10c60 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62  ame as the one b
10c70 65 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70 65  eing.  ** droppe
10c80 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20  d. Triggers are 
10c90 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65  handled separate
10ca0 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69  ly because a tri
10cb0 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 2a 2a  gger can be.  **
10cc0 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
10cd0 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68  temp database th
10ce0 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  at refers to a t
10cf0 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a  able in another.
10d00 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20    ** database.. 
10d10 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73   */.  sqlite3Nes
10d20 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
10d30 20 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20   .      "DELETE 
10d40 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45  FROM %Q.%s WHERE
10d50 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64   tbl_name=%Q and
10d60 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27   type!='trigger'
10d70 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  ",.      pDb->zN
10d80 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
10d90 45 28 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e  E(iDb), pTab->zN
10da0 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 69 73 56  ame);.  if( !isV
10db0 69 65 77 20 26 26 20 21 49 73 56 69 72 74 75 61  iew && !IsVirtua
10dc0 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 64  l(pTab) ){.    d
10dd0 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72  estroyTable(pPar
10de0 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 0a  se, pTab);.  }..
10df0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
10e00 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d  table entry from
10e10 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e   SQLite's intern
10e20 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f  al schema and mo
10e30 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63  dify.  ** the sc
10e40 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a  hema cookie..  *
10e50 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
10e60 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73  l(pTab) ){.    s
10e70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
10e80 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c  (v, OP_VDestroy,
10e90 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62   iDb, 0, 0, pTab
10ea0 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d  ->zName, 0);.  }
10eb0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
10ec0 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54  dOp4(v, OP_DropT
10ed0 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c  able, iDb, 0, 0,
10ee0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
10ef0 3b 0a 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67  ;.  sqlite3Chang
10f00 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
10f10 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 56 69  iDb);.  sqliteVi
10f20 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69  ewResetAll(db, i
10f30 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Db);.}../*.** Th
10f40 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
10f50 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77  lled to do the w
10f60 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41  ork of a DROP TA
10f70 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
10f80 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e  * pName is the n
10f90 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
10fa0 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a   to be dropped..
10fb0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
10fc0 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  ropTable(Parse *
10fd0 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
10fe0 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69  *pName, int isVi
10ff0 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a  ew, int noErr){.
11000 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
11010 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
11020 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
11030 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
11040 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
11050 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
11060 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
11070 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  able;.  }.  asse
11080 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
11090 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
110a0 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
110b0 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29  );.  if( noErr )
110c0 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72   db->suppressErr
110d0 2b 2b 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  ++;.  pTab = sql
110e0 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
110f0 74 65 6d 28 70 50 61 72 73 65 2c 20 69 73 56 69  tem(pParse, isVi
11100 65 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ew, &pName->a[0]
11110 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29  );.  if( noErr )
11120 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72   db->suppressErr
11130 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  --;..  if( pTab=
11140 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f  =0 ){.    if( no
11150 45 72 72 20 29 20 73 71 6c 69 74 65 33 43 6f 64  Err ) sqlite3Cod
11160 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65  eVerifyNamedSche
11170 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  ma(pParse, pName
11180 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
11190 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
111a0 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
111b0 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
111c0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
111d0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
111e0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
111f0 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
11200 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54  b );..  /* If pT
11210 61 62 20 69 73 20 61 20 76 69 72 74 75 61 6c 20  ab is a virtual 
11220 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77  table, call View
11230 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29  GetColumnNames()
11240 20 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20   to ensure.  ** 
11250 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  it is initialize
11260 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73  d..  */.  if( Is
11270 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26  Virtual(pTab) &&
11280 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
11290 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
112a0 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20  e, pTab) ){.    
112b0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
112c0 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  able;.  }.#ifnde
112d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
112e0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
112f0 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
11300 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
11310 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  ab = SCHEMA_TABL
11320 45 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73  E(iDb);.    cons
11330 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
11340 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
11350 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
11360 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20 20   *zArg2 = 0;.   
11370 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
11380 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
11390 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
113a0 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20  b, 0, zDb)){.   
113b0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
113c0 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
113d0 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
113e0 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
113f0 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
11400 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  1 ){.        cod
11410 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
11420 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  TEMP_VIEW;.     
11430 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11440 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
11450 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  OP_VIEW;.      }
11460 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11470 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
11480 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  E.    }else if( 
11490 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
114a0 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20  ){.      code = 
114b0 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42  SQLITE_DROP_VTAB
114c0 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72 67 32 20  LE;.      zArg2 
114d0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  = sqlite3GetVTab
114e0 6c 65 28 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d  le(db, pTab)->pM
114f0 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69  od->zName;.#endi
11500 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
11510 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
11520 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
11530 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
11540 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
11550 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65  _TABLE;.      }e
11560 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
11570 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
11580 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20  TABLE;.      }. 
11590 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
115a0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
115b0 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62  arse, code, pTab
115c0 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20  ->zName, zArg2, 
115d0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
115e0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
115f0 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  le;.    }.    if
11600 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
11610 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
11620 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e  E_DELETE, pTab->
11630 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29  zName, 0, zDb) )
11640 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
11650 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
11660 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
11670 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
11680 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  ICmp(pTab->zName
11690 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d  , "sqlite_", 7)=
116a0 3d 30 20 0a 20 20 20 20 26 26 20 73 71 6c 69 74  =0 .    && sqlit
116b0 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
116c0 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
116d0 73 74 61 74 22 2c 20 31 31 29 21 3d 30 20 29 7b  stat", 11)!=0 ){
116e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
116f0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
11700 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62  ble %s may not b
11710 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62  e dropped", pTab
11720 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
11730 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
11740 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  le;.  }..#ifndef
11750 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
11760 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52  W.  /* Ensure DR
11770 4f 50 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20  OP TABLE is not 
11780 75 73 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20  used on a view, 
11790 61 6e 64 20 44 52 4f 50 20 56 49 45 57 20 69 73  and DROP VIEW is
117a0 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f   not used.  ** o
117b0 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  n a table..  */.
117c0 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26 20    if( isView && 
117d0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
117e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
117f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11800 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20  "use DROP TABLE 
11810 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20  to delete table 
11820 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
11830 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
11840 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
11850 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26  .  if( !isView &
11860 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  & pTab->pSelect 
11870 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
11880 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
11890 75 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f  use DROP VIEW to
118a0 20 64 65 6c 65 74 65 20 76 69 65 77 20 25 73 22   delete view %s"
118b0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
118c0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
118d0 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65  op_table;.  }.#e
118e0 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
118f0 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
11900 76 65 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  ve the table fro
11910 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
11920 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e  le.  ** on disk.
11930 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
11940 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
11950 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
11960 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
11970 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
11980 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20  arse, 1, iDb);. 
11990 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53     sqlite3ClearS
119a0 74 61 74 54 61 62 6c 65 73 28 70 50 61 72 73 65  tatTables(pParse
119b0 2c 20 69 44 62 2c 20 22 74 62 6c 22 2c 20 70 54  , iDb, "tbl", pT
119c0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
119d0 73 71 6c 69 74 65 33 46 6b 44 72 6f 70 54 61 62  sqlite3FkDropTab
119e0 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  le(pParse, pName
119f0 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c  , pTab);.    sql
11a00 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c  ite3CodeDropTabl
11a10 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
11a20 69 44 62 2c 20 69 73 56 69 65 77 29 3b 0a 20 20  iDb, isView);.  
11a30 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  }..exit_drop_tab
11a40 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  le:.  sqlite3Src
11a50 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
11a60 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
11a70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
11a80 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
11a90 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b   a new foreign k
11aa0 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a  ey on the table.
11ab0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  ** currently und
11ac0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
11ad0 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72    pFromCol deter
11ae0 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75  mines which colu
11af0 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75  mns.** in the cu
11b00 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e  rrent table poin
11b10 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e  t to the foreign
11b20 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43   key.  If pFromC
11b30 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f  ol==0 then.** co
11b40 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f  nnect the key to
11b50 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
11b60 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20   inserted.  pTo 
11b70 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a  is the name of.*
11b80 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65  * the table refe
11b90 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c  rred to.  pToCol
11ba0 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 61   is a list of ta
11bb0 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68 65  bles in the othe
11bc0 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20 74  r.** pTo table t
11bd0 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20  hat the foreign 
11be0 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  key points to.  
11bf0 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61  flags contains a
11c00 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
11c10 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66  n about the conf
11c20 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
11c30 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69  algorithms speci
11c40 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f  fied.** in the O
11c50 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44  N DELETE, ON UPD
11c60 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52  ATE and ON INSER
11c70 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  T clauses..**.**
11c80 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75   An FKey structu
11c90 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  re is created an
11ca0 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  d added to the t
11cb0 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a  able currently.*
11cc0 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  * under construc
11cd0 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72  tion in the pPar
11ce0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69  se->pNewTable fi
11cf0 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  eld..**.** The f
11d00 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65  oreign key is se
11d10 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20  t for IMMEDIATE 
11d20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73  processing.  A s
11d30 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a  ubsequent call.*
11d40 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65  * to sqlite3Defe
11d50 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69  rForeignKey() mi
11d60 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20  ght change this 
11d70 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a  to DEFERRED..*/.
11d80 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
11d90 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20  teForeignKey(.  
11da0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
11db0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
11dc0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
11dd0 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c  rList *pFromCol,
11de0 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
11df0 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20  this table that 
11e00 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74  point to other t
11e10 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  able */.  Token 
11e20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  *pTo,          /
11e30 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74  * Name of the ot
11e40 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45  her table */.  E
11e50 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c  xprList *pToCol,
11e60 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69      /* Columns i
11e70 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c  n the other tabl
11e80 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
11e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
11ea0 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
11eb0 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a  on algorithms. *
11ec0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
11ed0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
11ee0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11ef0 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
11f00 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d  .  FKey *pFKey =
11f10 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e 65 78   0;.  FKey *pNex
11f20 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20  tTo;.  Table *p 
11f30 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
11f40 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  ble;.  int nByte
11f50 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
11f60 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a   nCol;.  char *z
11f70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  ;..  assert( pTo
11f80 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
11f90 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f  0 || IN_DECLARE_
11fa0 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65  VTAB ) goto fk_e
11fb0 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43  nd;.  if( pFromC
11fc0 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ol==0 ){.    int
11fd0 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d   iCol = p->nCol-
11fe0 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  1;.    if( NEVER
11ff0 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74 6f 20  (iCol<0) ) goto 
12000 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  fk_end;.    if( 
12010 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
12020 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20  ->nExpr!=1 ){.  
12030 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
12040 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72  Msg(pParse, "for
12050 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a  eign key on %s".
12060 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c           " shoul
12070 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79  d reference only
12080 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   one column of t
12090 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20  able %T",.      
120a0 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d     p->aCol[iCol]
120b0 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20  .zName, pTo);.  
120c0 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
120d0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20  .    }.    nCol 
120e0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
120f0 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f   pToCol && pToCo
12100 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43  l->nExpr!=pFromC
12110 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  ol->nExpr ){.   
12120 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
12130 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
12140 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75   "number of colu
12150 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  mns in foreign k
12160 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ey does not matc
12170 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  h the number of 
12180 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d  ".        "colum
12190 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65  ns in the refere
121a0 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20  nced table");.  
121b0 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
121c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c   }else{.    nCol
121d0 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78   = pFromCol->nEx
121e0 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20  pr;.  }.  nByte 
121f0 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29  = sizeof(*pFKey)
12200 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65   + (nCol-1)*size
12210 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30  of(pFKey->aCol[0
12220 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b  ]) + pTo->n + 1;
12230 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b  .  if( pToCol ){
12240 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
12250 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69  pToCol->nExpr; i
12260 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65  ++){.      nByte
12270 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
12280 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  n30(pToCol->a[i]
12290 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20  .zName) + 1;.   
122a0 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d   }.  }.  pFKey =
122b0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
122c0 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 29  Zero(db, nByte )
122d0 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30  ;.  if( pFKey==0
122e0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f   ){.    goto fk_
122f0 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79  end;.  }.  pFKey
12300 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70  ->pFrom = p;.  p
12310 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20  FKey->pNextFrom 
12320 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20  = p->pFKey;.  z 
12330 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 2d  = (char*)&pFKey-
12340 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70  >aCol[nCol];.  p
12350 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20  FKey->zTo = z;. 
12360 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e   memcpy(z, pTo->
12370 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b  z, pTo->n);.  z[
12380 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73  pTo->n] = 0;.  s
12390 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29  qlite3Dequote(z)
123a0 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b  ;.  z += pTo->n+
123b0 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c  1;.  pFKey->nCol
123c0 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70   = nCol;.  if( p
123d0 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
123e0 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d    pFKey->aCol[0]
123f0 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c  .iFrom = p->nCol
12400 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
12410 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
12420 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
12430 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
12440 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a  =0; j<p->nCol; j
12450 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
12460 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
12470 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  p->aCol[j].zName
12480 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d  , pFromCol->a[i]
12490 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
124a0 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61          pFKey->a
124b0 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a  Col[i].iFrom = j
124c0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
124d0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
124e0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
124f0 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  >=p->nCol ){.   
12500 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
12510 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
12520 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e          "unknown
12530 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69   column \"%s\" i
12540 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  n foreign key de
12550 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20  finition", .    
12560 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e        pFromCol->
12570 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
12580 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64       goto fk_end
12590 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
125a0 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c    }.  if( pToCol
125b0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
125c0 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
125d0 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c       int n = sql
125e0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f  ite3Strlen30(pTo
125f0 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
12600 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61  ;.      pFKey->a
12610 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b  Col[i].zCol = z;
12620 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c  .      memcpy(z,
12630 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e   pToCol->a[i].zN
12640 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a  ame, n);.      z
12650 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a  [n] = 0;.      z
12660 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20   += n+1;.    }. 
12670 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65   }.  pFKey->isDe
12680 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46  ferred = 0;.  pF
12690 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 20  Key->aAction[0] 
126a0 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26 20 30  = (u8)(flags & 0
126b0 78 66 66 29 3b 20 20 20 20 20 20 20 20 20 20 20  xff);           
126c0 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20 61 63   /* ON DELETE ac
126d0 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65 79 2d  tion */.  pFKey-
126e0 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20 28 75  >aAction[1] = (u
126f0 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 38 20 29  8)((flags >> 8 )
12700 20 26 20 30 78 66 66 29 3b 20 20 20 20 2f 2a 20   & 0xff);    /* 
12710 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e  ON UPDATE action
12720 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
12730 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
12740 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 2d 3e  xHeld(db, 0, p->
12750 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 70 4e  pSchema) );.  pN
12760 65 78 74 54 6f 20 3d 20 28 46 4b 65 79 20 2a 29  extTo = (FKey *)
12770 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
12780 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 66  t(&p->pSchema->f
12790 6b 65 79 48 61 73 68 2c 20 0a 20 20 20 20 20 20  keyHash, .      
127a0 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 71 6c 69  pFKey->zTo, sqli
127b0 74 65 33 53 74 72 6c 65 6e 33 30 28 70 46 4b 65  te3Strlen30(pFKe
127c0 79 2d 3e 7a 54 6f 29 2c 20 28 76 6f 69 64 20 2a  y->zTo), (void *
127d0 29 70 46 4b 65 79 0a 20 20 29 3b 0a 20 20 69 66  )pFKey.  );.  if
127e0 28 20 70 4e 65 78 74 54 6f 3d 3d 70 46 4b 65 79  ( pNextTo==pFKey
127f0 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   ){.    db->mall
12800 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
12810 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
12820 20 7d 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f   }.  if( pNextTo
12830 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12840 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f  pNextTo->pPrevTo
12850 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 4b 65 79  ==0 );.    pFKey
12860 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 4e 65 78  ->pNextTo = pNex
12870 74 54 6f 3b 0a 20 20 20 20 70 4e 65 78 74 54 6f  tTo;.    pNextTo
12880 2d 3e 70 50 72 65 76 54 6f 20 3d 20 70 46 4b 65  ->pPrevTo = pFKe
12890 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e  y;.  }..  /* Lin
128a0 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  k the foreign ke
128b0 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61  y to the table a
128c0 73 20 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e  s the last step.
128d0 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79  .  */.  p->pFKey
128e0 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65   = pFKey;.  pFKe
128f0 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a  y = 0;..fk_end:.
12900 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12910 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65 6e 64  db, pFKey);.#end
12920 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
12930 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
12940 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c  GN_KEY) */.  sql
12950 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
12960 74 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f 6c 29  te(db, pFromCol)
12970 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
12980 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  istDelete(db, pT
12990 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  oCol);.}../*.** 
129a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
129b0 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49  called when an I
129c0 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
129d0 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  TE or INITIALLY 
129e0 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75  DEFERRED.** clau
129f0 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70 61  se is seen as pa
12a00 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20  rt of a foreign 
12a10 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20  key definition. 
12a20 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64 0a   The isDeferred.
12a30 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
12a40 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  1 for INITIALLY 
12a50 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20 66  DEFERRED and 0 f
12a60 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  or INITIALLY IMM
12a70 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62  EDIATE..** The b
12a80 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d  ehavior of the m
12a90 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65  ost recently cre
12aa0 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  ated foreign key
12ab0 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20   is adjusted.** 
12ac0 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a  accordingly..*/.
12ad0 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 65  void sqlite3Defe
12ae0 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73  rForeignKey(Pars
12af0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
12b00 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e  sDeferred){.#ifn
12b10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12b20 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61  FOREIGN_KEY.  Ta
12b30 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65  ble *pTab;.  FKe
12b40 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20  y *pFKey;.  if( 
12b50 28 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  (pTab = pParse->
12b60 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c  pNewTable)==0 ||
12b70 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e   (pFKey = pTab->
12b80 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75  pFKey)==0 ) retu
12b90 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  rn;.  assert( is
12ba0 44 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c 20 69  Deferred==0 || i
12bb0 73 44 65 66 65 72 72 65 64 3d 3d 31 20 29 3b 20  sDeferred==1 ); 
12bc0 2f 2a 20 45 56 3a 20 52 2d 33 30 33 32 33 2d 32  /* EV: R-30323-2
12bd0 31 39 31 37 20 2a 2f 0a 20 20 70 46 4b 65 79 2d  1917 */.  pFKey-
12be0 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 28 75  >isDeferred = (u
12bf0 38 29 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65  8)isDeferred;.#e
12c00 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ndif.}../*.** Ge
12c10 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
12c20 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20   will erase and 
12c30 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49  refill index *pI
12c40 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  dx.  This is.** 
12c50 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69  used to initiali
12c60 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74  ze a newly creat
12c70 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72  ed index or to r
12c80 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20  ecompute the.** 
12c90 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e  content of an in
12ca0 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20  dex in response 
12cb0 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d  to a REINDEX com
12cc0 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d  mand..**.** if m
12cd0 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f  emRootPage is no
12ce0 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d  t negative, it m
12cf0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e  eans that the in
12d00 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20  dex is newly.** 
12d10 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 72 65  created.  The re
12d20 67 69 73 74 65 72 20 73 70 65 63 69 66 69 65 64  gister specified
12d30 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   by memRootPage 
12d40 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20  contains the.** 
12d50 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
12d60 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
12d70 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69  If memRootPage i
12d80 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
12d90 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c  .** the index al
12da0 72 65 61 64 79 20 65 78 69 73 74 73 20 61 6e 64  ready exists and
12db0 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65 64   must be cleared
12dc0 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65   before being re
12dd0 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68  filled and.** th
12de0 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
12df0 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  er of the index 
12e00 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49  is taken from pI
12e10 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73  ndex->tnum..*/.s
12e20 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
12e30 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61  e3RefillIndex(Pa
12e40 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
12e50 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20  ex *pIndex, int 
12e60 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20  memRootPage){.  
12e70 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
12e80 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f  ndex->pTable;  /
12e90 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68 61 74  * The table that
12ea0 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   is indexed */. 
12eb0 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
12ec0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
12ed0 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20  /* Btree cursor 
12ee0 75 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f  used for pTab */
12ef0 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50  .  int iIdx = pP
12f00 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
12f10 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f    /* Btree curso
12f20 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65  r used for pInde
12f30 78 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74  x */.  int iSort
12f40 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
12f50 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
12f60 6f 70 65 6e 65 64 20 62 79 20 4f 70 65 6e 53 6f  opened by OpenSo
12f70 72 74 65 72 20 28 69 66 20 69 6e 20 75 73 65 29  rter (if in use)
12f80 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b   */.  int addr1;
12f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fa0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
12fb0 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a  of top of loop *
12fc0 2f 0a 20 20 69 6e 74 20 61 64 64 72 32 3b 20 20  /.  int addr2;  
12fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fe0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 74 6f     /* Address to
12ff0 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 6e 65 78   jump to for nex
13000 74 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  t iteration */. 
13010 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20   int tnum;      
13020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13030 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
13040 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20  index */.  Vdbe 
13050 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
13060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
13070 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
13080 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
13090 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  hine */.  KeyInf
130a0 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20  o *pKey;        
130b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49           /* KeyI
130c0 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f  nfo for index */
130d0 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
130e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
130f0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
13100 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 69 65 64  lding assemblied
13110 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f   index record */
13120 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
13130 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
13140 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
13150 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
13160 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
13170 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
13180 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  (db, pIndex->pSc
13190 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20  hema);..#ifndef 
131a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
131b0 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  ORIZATION.  if( 
131c0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
131d0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
131e0 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d  REINDEX, pIndex-
131f0 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20  >zName, 0,.     
13200 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
13210 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74  ame ) ){.    ret
13220 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
13230 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20 61 20  .  /* Require a 
13240 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
13250 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72 66 6f  e table to perfo
13260 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  rm this operatio
13270 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61  n */.  sqlite3Ta
13280 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
13290 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
132a0 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   1, pTab->zName)
132b0 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
132c0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
132d0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
132e0 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52  turn;.  if( memR
132f0 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20  ootPage>=0 ){.  
13300 20 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74    tnum = memRoot
13310 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Page;.  }else{. 
13320 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78     tnum = pIndex
13330 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 73 71 6c 69  ->tnum;.    sqli
13340 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13350 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c   OP_Clear, tnum,
13360 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 4b 65   iDb);.  }.  pKe
13370 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  y = sqlite3Index
13380 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20  Keyinfo(pParse, 
13390 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69 74  pIndex);.  sqlit
133a0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
133b0 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49  OP_OpenWrite, iI
133c0 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a  dx, tnum, iDb, .
133d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133e0 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79      (char *)pKey
133f0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
13400 44 4f 46 46 29 3b 0a 20 20 73 71 6c 69 74 65 33  DOFF);.  sqlite3
13410 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
13420 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 7c 28  OPFLAG_BULKCSR|(
13430 28 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 29  (memRootPage>=0)
13440 3f 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 3a  ?OPFLAG_P2ISREG:
13450 30 29 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  0));..  /* Open 
13460 74 68 65 20 73 6f 72 74 65 72 20 63 75 72 73 6f  the sorter curso
13470 72 20 69 66 20 77 65 20 61 72 65 20 74 6f 20 75  r if we are to u
13480 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 53 6f  se one. */.  iSo
13490 72 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rter = pParse->n
134a0 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  Tab++;.  sqlite3
134b0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
134c0 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 69 53 6f  _SorterOpen, iSo
134d0 72 74 65 72 2c 20 30 2c 20 30 2c 20 28 63 68 61  rter, 0, 0, (cha
134e0 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49  r*)pKey, P4_KEYI
134f0 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  NFO);..  /* Open
13500 20 74 68 65 20 74 61 62 6c 65 2e 20 4c 6f 6f 70   the table. Loop
13510 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f 77   through all row
13520 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2c 20  s of the table, 
13530 69 6e 73 65 72 74 69 6e 67 20 69 6e 64 65 78 0a  inserting index.
13540 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 69 6e 74    ** records int
13550 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f  o the sorter. */
13560 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61  .  sqlite3OpenTa
13570 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ble(pParse, iTab
13580 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
13590 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64  OpenRead);.  add
135a0 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
135b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
135c0 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20  ind, iTab, 0);. 
135d0 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
135e0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
135f0 50 61 72 73 65 29 3b 0a 0a 20 20 73 71 6c 69 74  Parse);..  sqlit
13600 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b  e3GenerateIndexK
13610 65 79 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ey(pParse, pInde
13620 78 2c 20 69 54 61 62 2c 20 72 65 67 52 65 63 6f  x, iTab, regReco
13630 72 64 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65  rd, 1);.  sqlite
13640 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13650 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20  P_SorterInsert, 
13660 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f  iSorter, regReco
13670 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rd);.  sqlite3Vd
13680 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
13690 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31  ext, iTab, addr1
136a0 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  +1);.  sqlite3Vd
136b0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
136c0 64 72 31 29 3b 0a 20 20 61 64 64 72 31 20 3d 20  dr1);.  addr1 = 
136d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
136e0 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f  2(v, OP_SorterSo
136f0 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 30 29 3b  rt, iSorter, 0);
13700 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f  .  if( pIndex->o
13710 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
13720 29 7b 0a 20 20 20 20 69 6e 74 20 6a 32 20 3d 20  ){.    int j2 = 
13730 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
13740 6e 74 41 64 64 72 28 76 29 20 2b 20 33 3b 0a 20  ntAddr(v) + 3;. 
13750 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13760 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
13770 20 30 2c 20 6a 32 29 3b 0a 20 20 20 20 61 64 64   0, j2);.    add
13780 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
13790 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
137a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
137b0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp3(v, OP_Sort
137c0 65 72 43 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74  erCompare, iSort
137d0 65 72 2c 20 6a 32 2c 20 72 65 67 52 65 63 6f 72  er, j2, regRecor
137e0 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48  d);.    sqlite3H
137f0 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  altConstraint(pP
13800 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e  arse, SQLITE_CON
13810 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 2c 0a  STRAINT_UNIQUE,.
13820 20 20 20 20 20 20 20 20 4f 45 5f 41 62 6f 72 74          OE_Abort
13830 2c 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  , "indexed colum
13840 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75  ns are not uniqu
13850 65 22 2c 20 50 34 5f 53 54 41 54 49 43 0a 20 20  e", P4_STATIC.  
13860 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    );.  }else{.  
13870 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
13880 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
13890 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
138a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
138b0 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69  OP_SorterData, i
138c0 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72  Sorter, regRecor
138d0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
138e0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64  eAddOp3(v, OP_Id
138f0 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72  xInsert, iIdx, r
13900 65 67 52 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20  egRecord, 1);.  
13910 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
13920 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53  eP5(v, OPFLAG_US
13930 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20  ESEEKRESULT);.  
13940 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
13950 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
13960 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
13970 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13980 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20   OP_SorterNext, 
13990 69 53 6f 72 74 65 72 2c 20 61 64 64 72 32 29 3b  iSorter, addr2);
139a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
139b0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
139c0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ;..  sqlite3Vdbe
139d0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
139e0 73 65 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c  se, iTab);.  sql
139f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
13a00 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78  , OP_Close, iIdx
13a10 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
13a20 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
13a30 73 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a  se, iSorter);.}.
13a40 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
13a50 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e  new index for an
13a60 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61   SQL table.  pNa
13a70 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68  me1.pName2 is th
13a80 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
13a90 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c  dex .** and pTbl
13aa0 4c 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65  List is the name
13ab0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68   of the table th
13ac0 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
13ad0 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20  xed.  Both will 
13ae0 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20  .** be NULL for 
13af0 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
13b00 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69   an index that i
13b10 73 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74  s created to sat
13b20 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45  isfy a.** UNIQUE
13b30 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66   constraint.  If
13b40 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64   pTable and pInd
13b50 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65  ex are NULL, use
13b60 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
13b70 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62  le.** as the tab
13b80 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
13b90 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
13ba0 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20  able is a table 
13bb0 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65  that is.** curre
13bc0 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74  ntly being const
13bd0 72 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41  ructed by a CREA
13be0 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
13bf0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  nt..**.** pList 
13c00 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c  is a list of col
13c10 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
13c20 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20  ed.  pList will 
13c30 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a  be NULL if this.
13c40 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20  ** is a primary 
13c50 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f  key or unique-co
13c60 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20  nstraint on the 
13c70 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75  most recent colu
13c80 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74  mn added.** to t
13c90 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
13ca0 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
13cb0 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 49  ction.  .**.** I
13cc0 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 63  f the index is c
13cd0 72 65 61 74 65 64 20 73 75 63 63 65 73 73 66 75  reated successfu
13ce0 6c 6c 79 2c 20 72 65 74 75 72 6e 20 61 20 70 6f  lly, return a po
13cf0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
13d00 20 49 6e 64 65 78 0a 2a 2a 20 73 74 72 75 63 74   Index.** struct
13d10 75 72 65 2e 20 54 68 69 73 20 69 73 20 75 73 65  ure. This is use
13d20 64 20 62 79 20 73 71 6c 69 74 65 33 41 64 64 50  d by sqlite3AddP
13d30 72 69 6d 61 72 79 4b 65 79 28 29 20 74 6f 20 6d  rimaryKey() to m
13d40 61 72 6b 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a  ark the index.**
13d50 20 61 73 20 74 68 65 20 74 61 62 6c 65 73 20 70   as the tables p
13d60 72 69 6d 61 72 79 20 6b 65 79 20 28 49 6e 64 65  rimary key (Inde
13d70 78 2e 61 75 74 6f 49 6e 64 65 78 3d 3d 32 29 2e  x.autoIndex==2).
13d80 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
13d90 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20  e3CreateIndex(. 
13da0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
13db0 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72      /* All infor
13dc0 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69  mation about thi
13dd0 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b  s parse */.  Tok
13de0 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
13df0 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
13e00 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
13e10 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   be NULL */.  To
13e20 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
13e30 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
13e40 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d  of index name. M
13e50 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
13e60 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d  SrcList *pTblNam
13e70 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69  e, /* Table to i
13e80 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65  ndex. Use pParse
13e90 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30  ->pNewTable if 0
13ea0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
13eb0 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69  pList,   /* A li
13ec0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
13ed0 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
13ee0 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
13ef0 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c      /* OE_Abort,
13f00 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52   OE_Ignore, OE_R
13f10 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f  eplace, or OE_No
13f20 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ne */.  Token *p
13f30 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68  Start,     /* Th
13f40 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
13f50 68 61 74 20 62 65 67 69 6e 73 20 74 68 69 73 20  hat begins this 
13f60 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
13f70 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20  oken *pEnd,     
13f80 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61    /* The ")" tha
13f90 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45  t closes the CRE
13fa0 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
13fb0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ent */.  int sor
13fc0 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53  tOrder,     /* S
13fd0 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69  ort order of pri
13fe0 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c  mary key when pL
13ff0 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69  ist==NULL */.  i
14000 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 20 20 20  nt ifNotExist   
14010 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20    /* Omit error 
14020 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  if index already
14030 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20   exists */.){.  
14040 49 6e 64 65 78 20 2a 70 52 65 74 20 3d 20 30 3b  Index *pRet = 0;
14050 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
14060 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 54  to return */.  T
14070 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
14080 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
14090 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
140a0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
140b0 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  0;   /* The inde
140c0 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  x to be created 
140d0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
140e0 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d   = 0;     /* Nam
140f0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a  e of the index *
14100 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
14110 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
14120 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
14130 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69   in zName */.  i
14140 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e  nt i, j;.  Token
14150 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20 20 20   nullId;        
14160 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f  /* Fake token fo
14170 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c 69  r an empty ID li
14180 73 74 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20  st */.  DbFixer 
14190 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  sFix;        /* 
141a0 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61  For assigning da
141b0 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20  tabase names to 
141c0 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  pTable */.  int 
141d0 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20  sortOrderMask;  
141e0 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44   /* 1 to honor D
141f0 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30  ESC in index.  0
14200 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20   to ignore. */. 
14210 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
14220 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20  Parse->db;.  Db 
14230 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *pDb;           
14240 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69    /* The specifi
14250 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  c table containi
14260 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64 20 64  ng the indexed d
14270 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
14280 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
14290 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
142a0 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
142b0 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
142c0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
142d0 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e  me = 0;    /* Un
142e0 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f  qualified name o
142f0 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63  f the index to c
14300 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63  reate */.  struc
14310 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
14320 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46  *pListItem; /* F
14330 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
14340 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  pList */.  int n
14350 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72  Col;.  int nExtr
14360 61 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  a = 0;.  char *z
14370 45 78 74 72 61 3b 0a 0a 20 20 61 73 73 65 72 74  Extra;..  assert
14380 28 20 70 53 74 61 72 74 3d 3d 30 20 7c 7c 20 70  ( pStart==0 || p
14390 45 6e 64 21 3d 30 20 29 3b 20 2f 2a 20 70 45 6e  End!=0 ); /* pEn
143a0 64 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 4e 55  d must be non-NU
143b0 4c 4c 20 69 66 20 70 53 74 61 72 74 20 69 73 20  LL if pStart is 
143c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
143d0 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20  rse->nErr==0 ); 
143e0 20 20 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61       /* Never ca
143f0 6c 6c 65 64 20 77 69 74 68 20 70 72 69 6f 72 20  lled with prior 
14400 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20  errors */.  if( 
14410 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
14420 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56   || IN_DECLARE_V
14430 54 41 42 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  TAB ){.    goto 
14440 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
14450 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c  x;.  }.  if( SQL
14460 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
14470 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
14480 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
14490 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
144a0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
144b0 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74  Find the table t
144c0 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64  hat is to be ind
144d0 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61  exed.  Return ea
144e0 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  rly if not found
144f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62  ..  */.  if( pTb
14500 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20  lName!=0 ){..   
14510 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d   /* Use the two-
14520 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20  part index name 
14530 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
14540 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
14550 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20  * to search for 
14560 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27  the table. 'Fix'
14570 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
14580 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a  to this db.    *
14590 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67  * before looking
145a0 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   up the table.. 
145b0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
145c0 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d  ( pName1 && pNam
145d0 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20  e2 );.    iDb = 
145e0 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
145f0 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
14600 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
14610 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  e);.    if( iDb<
14620 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
14630 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
14640 61 73 73 65 72 74 28 20 70 4e 61 6d 65 20 26 26  assert( pName &&
14650 20 70 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69   pName->z );..#i
14660 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14670 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20  T_TEMPDB.    /* 
14680 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  If the index nam
14690 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65  e was unqualifie
146a0 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  d, check if the 
146b0 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  table.    ** is 
146c0 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66  a temp table. If
146d0 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74   so, set the dat
146e0 61 62 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e  abase to 1. Do n
146f0 6f 74 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a  ot do this.    *
14700 2a 20 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e  * if initialisin
14710 67 20 61 20 64 61 74 61 62 61 73 65 20 73 63 68  g a database sch
14720 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ema..    */.    
14730 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
14740 73 79 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  sy ){.      pTab
14750 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
14760 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  tLookup(pParse, 
14770 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20  pTblName);.     
14780 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d   if( pName2->n==
14790 30 20 26 26 20 70 54 61 62 20 26 26 20 70 54 61  0 && pTab && pTa
147a0 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e  b->pSchema==db->
147b0 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
147c0 7b 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d 20  {.        iDb = 
147d0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
147e0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28  .#endif..    if(
147f0 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
14800 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
14810 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61  Db, "index", pNa
14820 6d 65 29 20 26 26 0a 20 20 20 20 20 20 20 20 73  me) &&.        s
14830 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
14840 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65  (&sFix, pTblName
14850 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
14860 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 70 61  * Because the pa
14870 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20  rser constructs 
14880 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20  pTblName from a 
14890 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65  single identifie
148a0 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  r,.      ** sqli
148b0 74 65 33 46 69 78 53 72 63 4c 69 73 74 20 63 61  te3FixSrcList ca
148c0 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f  n never fail. */
148d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29  .      assert(0)
148e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
148f0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
14900 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65  TableItem(pParse
14910 2c 20 30 2c 20 26 70 54 62 6c 4e 61 6d 65 2d 3e  , 0, &pTblName->
14920 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  a[0]);.    asser
14930 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
14940 6c 65 64 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d  led==0 || pTab==
14950 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  0 );.    if( pTa
14960 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  b==0 ) goto exit
14970 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
14980 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
14990 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3d  Db[iDb].pSchema=
149a0 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
149b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
149c0 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20  ssert( pName==0 
149d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
149e0 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Start==0 );.    
149f0 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
14a00 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66  NewTable;.    if
14a10 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65  ( !pTab ) goto e
14a20 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
14a30 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
14a40 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
14a50 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
14a60 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d  ma);.  }.  pDb =
14a70 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
14a80 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21  .  assert( pTab!
14a90 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
14aa0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
14ab0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
14ac0 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
14ad0 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
14ae0 20 37 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26   7)==0 .       &
14af0 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  & sqlite3StrNICm
14b00 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37  p(&pTab->zName[7
14b10 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c 39 29  ],"altertab_",9)
14b20 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
14b30 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
14b40 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
14b50 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
14b60 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
14b70 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
14b80 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
14b90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14ba0 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70  MIT_VIEW.  if( p
14bb0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
14bc0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14bd0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65  Msg(pParse, "vie
14be0 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  ws may not be in
14bf0 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74  dexed");.    got
14c00 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
14c10 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  dex;.  }.#endif.
14c20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14c30 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
14c40 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
14c50 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  (pTab) ){.    sq
14c60 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
14c70 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74  arse, "virtual t
14c80 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
14c90 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20   indexed");.    
14ca0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
14cb0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64  _index;.  }.#end
14cc0 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69  if..  /*.  ** Fi
14cd0 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nd the name of t
14ce0 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20  he index.  Make 
14cf0 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
14d00 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65  t already anothe
14d10 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20  r.  ** index or 
14d20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  table with the s
14d30 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a  ame name.  .  **
14d40 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a  .  ** Exception:
14d50 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64    If we are read
14d60 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ing the names of
14d70 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63   permanent indic
14d80 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  es from the.  **
14d90 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
14da0 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f  able (because so
14db0 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
14dc0 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68   changed the sch
14dd0 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e  ema) and.  ** on
14de0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e  e of the index n
14df0 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69  ames collides wi
14e00 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  th the name of a
14e10 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
14e20 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20   or.  ** index, 
14e30 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e  then we will con
14e40 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73  tinue to process
14e50 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a   this index..  *
14e60 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d  *.  ** If pName=
14e70 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  =0 it means that
14e80 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61   we are.  ** dea
14e90 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d  ling with a prim
14ea0 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55  ary key or UNIQU
14eb0 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57  E constraint.  W
14ec0 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74  e have to invent
14ed0 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61   our.  ** own na
14ee0 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  me..  */.  if( p
14ef0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d  Name ){.    zNam
14f00 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
14f10 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
14f20 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  me);.    if( zNa
14f30 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  me==0 ) goto exi
14f40 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
14f50 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
14f60 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69  e->z!=0 );.    i
14f70 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
14f80 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74  lite3CheckObject
14f90 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61  Name(pParse, zNa
14fa0 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  me) ){.      got
14fb0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
14fc0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
14fd0 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
14fe0 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  y ){.      if( s
14ff0 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
15000 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30  db, zName, 0)!=0
15010 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
15020 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15030 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  se, "there is al
15040 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61  ready a table na
15050 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
15060 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
15070 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
15080 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15090 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
150a0 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
150b0 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d  e, pDb->zName)!=
150c0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
150d0 69 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20  ifNotExist ){.  
150e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
150f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
15100 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64 79 20  ndex %s already 
15110 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b  exists", zName);
15120 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15130 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
15140 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a  b->init.busy );.
15150 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
15160 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
15170 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
15180 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
15190 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
151a0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ex;.    }.  }els
151b0 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  e{.    int n;.  
151c0 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a    Index *pLoop;.
151d0 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54      for(pLoop=pT
151e0 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b  ab->pIndex, n=1;
151f0 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
15200 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29  oop->pNext, n++)
15210 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  {}.    zName = s
15220 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
15230 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
15240 64 65 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62  dex_%s_%d", pTab
15250 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ->zName, n);.   
15260 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
15270 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
15280 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
15290 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
152a0 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69  heck for authori
152b0 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65  zation to create
152c0 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a   an index..  */.
152d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
152e0 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
152f0 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  N.  {.    const 
15300 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d  char *zDb = pDb-
15310 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  >zName;.    if( 
15320 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
15330 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
15340 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
15350 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44  ABLE(iDb), 0, zD
15360 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
15370 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
15380 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20  ex;.    }.    i 
15390 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
153a0 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21  INDEX;.    if( !
153b0 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
153c0 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49  Db==1 ) i = SQLI
153d0 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
153e0 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71  NDEX;.    if( sq
153f0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
15400 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c  Parse, i, zName,
15410 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
15420 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
15430 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
15440 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
15450 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c  ndif..  /* If pL
15460 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73  ist==0, it means
15470 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
15480 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65  s called to make
15490 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20   a primary.  ** 
154a0 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  key out of the l
154b0 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ast column added
154c0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e   to the table un
154d0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
154e0 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65  ..  ** So create
154f0 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20   a fake list to 
15500 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20  simulate this.. 
15510 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   */.  if( pList=
15520 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64  =0 ){.    nullId
15530 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  .z = pTab->aCol[
15540 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e  pTab->nCol-1].zN
15550 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e  ame;.    nullId.
15560 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
15570 6e 33 30 28 28 63 68 61 72 2a 29 6e 75 6c 6c 49  n30((char*)nullI
15580 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  d.z);.    pList 
15590 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
155a0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
155b0 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
155c0 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65  List==0 ) goto e
155d0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
155e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
155f0 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
15600 72 73 65 2c 20 70 4c 69 73 74 2c 20 26 6e 75 6c  rse, pList, &nul
15610 6c 49 64 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69  lId, 0);.    pLi
15620 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64  st->a[0].sortOrd
15630 65 72 20 3d 20 28 75 38 29 73 6f 72 74 4f 72 64  er = (u8)sortOrd
15640 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  er;.  }..  /* Fi
15650 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
15660 79 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  y bytes of space
15670 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f   are required to
15680 20 73 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c   store explicitl
15690 79 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64  y.  ** specified
156a0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
156b0 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a  nce names..  */.
156c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
156d0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
156e0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
156f0 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
15700 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
15710 78 70 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73  xpr ){.      ass
15720 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
15730 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20  TK_COLLATE );.  
15740 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31      nExtra += (1
15750 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   + sqlite3Strlen
15760 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  30(pExpr->u.zTok
15770 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  en));.    }.  }.
15780 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f  .  /* .  ** Allo
15790 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73  cate the index s
157a0 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a  tructure. .  */.
157b0 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
157c0 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
157d0 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c 69 73 74  ;.  nCol = pList
157e0 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65  ->nExpr;.  pInde
157f0 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  x = sqlite3DbMal
15800 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20  locZero(db, .   
15810 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
15820 28 49 6e 64 65 78 29 29 20 2b 20 20 20 20 20 20  (Index)) +      
15830 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
15840 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20   structure  */. 
15850 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65       ROUND8(size
15860 6f 66 28 74 52 6f 77 63 6e 74 29 2a 28 6e 43 6f  of(tRowcnt)*(nCo
15870 6c 2b 31 29 29 20 2b 20 20 20 2f 2a 20 49 6e 64  l+1)) +   /* Ind
15880 65 78 2e 61 69 52 6f 77 45 73 74 20 20 20 2a 2f  ex.aiRowEst   */
15890 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 63 68  .      sizeof(ch
158a0 61 72 20 2a 29 2a 6e 43 6f 6c 20 2b 20 20 20 20  ar *)*nCol +    
158b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
158c0 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20  ndex.azColl     
158d0 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
158e0 69 6e 74 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20  int)*nCol +     
158f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15900 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20   Index.aiColumn 
15910 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f    */.      sizeo
15920 66 28 75 38 29 2a 6e 43 6f 6c 20 2b 20 20 20 20  f(u8)*nCol +    
15930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15940 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72  /* Index.aSortOr
15950 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 61  der */.      nNa
15960 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20 20 20  me + 1 +        
15970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15980 20 20 2f 2a 20 49 6e 64 65 78 2e 7a 4e 61 6d 65    /* Index.zName
15990 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6e        */.      n
159a0 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20  Extra           
159b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159c0 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e      /* Collation
159d0 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 20   sequence names 
159e0 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 64 62  */.  );.  if( db
159f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
15a00 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
15a10 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
15a20 7d 0a 20 20 7a 45 78 74 72 61 20 3d 20 28 63 68  }.  zExtra = (ch
15a30 61 72 2a 29 70 49 6e 64 65 78 3b 0a 20 20 70 49  ar*)pIndex;.  pI
15a40 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d  ndex->aiRowEst =
15a50 20 28 74 52 6f 77 63 6e 74 2a 29 26 7a 45 78 74   (tRowcnt*)&zExt
15a60 72 61 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  ra[ROUND8(sizeof
15a70 28 49 6e 64 65 78 29 29 5d 3b 0a 20 20 70 49 6e  (Index))];.  pIn
15a80 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63  dex->azColl = (c
15a90 68 61 72 2a 2a 29 0a 20 20 20 20 20 28 28 63 68  har**).     ((ch
15aa0 61 72 2a 29 70 49 6e 64 65 78 2d 3e 61 69 52 6f  ar*)pIndex->aiRo
15ab0 77 45 73 74 20 2b 20 52 4f 55 4e 44 38 28 73 69  wEst + ROUND8(si
15ac0 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 6e 43  zeof(tRowcnt)*nC
15ad0 6f 6c 2b 31 29 29 3b 0a 20 20 61 73 73 65 72 74  ol+1));.  assert
15ae0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
15af0 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61  GNMENT(pIndex->a
15b00 69 52 6f 77 45 73 74 29 20 29 3b 0a 20 20 61 73  iRowEst) );.  as
15b10 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
15b20 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65  _ALIGNMENT(pInde
15b30 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20 20  x->azColl) );.  
15b40 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
15b50 20 3d 20 28 69 6e 74 20 2a 29 28 26 70 49 6e 64   = (int *)(&pInd
15b60 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 5d  ex->azColl[nCol]
15b70 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f  );.  pIndex->aSo
15b80 72 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a 29  rtOrder = (u8 *)
15b90 28 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  (&pIndex->aiColu
15ba0 6d 6e 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e  mn[nCol]);.  pIn
15bb0 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68  dex->zName = (ch
15bc0 61 72 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61  ar *)(&pIndex->a
15bd0 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 29  SortOrder[nCol])
15be0 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 28 63 68  ;.  zExtra = (ch
15bf0 61 72 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 7a  ar *)(&pIndex->z
15c00 4e 61 6d 65 5b 6e 4e 61 6d 65 2b 31 5d 29 3b 0a  Name[nName+1]);.
15c10 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d    memcpy(pIndex-
15c20 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e  >zName, zName, n
15c30 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65  Name+1);.  pInde
15c40 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
15c50 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ;.  pIndex->nCol
15c60 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  umn = pList->nEx
15c70 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e  pr;.  pIndex->on
15c80 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72  Error = (u8)onEr
15c90 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  ror;.  pIndex->a
15ca0 75 74 6f 49 6e 64 65 78 20 3d 20 28 75 38 29 28  utoIndex = (u8)(
15cb0 70 4e 61 6d 65 3d 3d 30 29 3b 0a 20 20 70 49 6e  pName==0);.  pIn
15cc0 64 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64  dex->pSchema = d
15cd0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
15ce0 65 6d 61 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ema;.  assert( s
15cf0 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
15d00 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
15d10 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ) );..  /* Check
15d20 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 73 68   to see if we sh
15d30 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20  ould honor DESC 
15d40 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65  requests on inde
15d50 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20  x columns.  */. 
15d60 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
15d70 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  a->file_format>=
15d80 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64  4 ){.    sortOrd
15d90 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f  erMask = -1;   /
15da0 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a  * Honor DESC */.
15db0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72    }else{.    sor
15dc0 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20  tOrderMask = 0; 
15dd0 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53     /* Ignore DES
15de0 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  C */.  }..  /* S
15df0 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  can the names of
15e00 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
15e10 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
15e20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a  indexed and.  **
15e30 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e   load the column
15e40 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68   indices into th
15e50 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  e Index structur
15e60 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72  e.  Report an er
15e70 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20  ror.  ** if any 
15e80 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f  column is not fo
15e90 75 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  und..  **.  ** T
15ea0 4f 44 4f 3a 20 20 41 64 64 20 61 20 74 65 73 74  ODO:  Add a test
15eb0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
15ec0 61 74 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75  at the same colu
15ed0 6d 6e 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64 0a  mn is not named.
15ee0 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f    ** more than o
15ef0 6e 63 65 20 77 69 74 68 69 6e 20 74 68 65 20 73  nce within the s
15f00 61 6d 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79  ame index.  Only
15f10 20 74 68 65 20 66 69 72 73 74 20 69 6e 73 74 61   the first insta
15f20 6e 63 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  nce of.  ** the 
15f30 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72  column will ever
15f40 20 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20   be used by the 
15f50 6f 70 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65  optimizer.  Note
15f60 20 74 68 61 74 20 75 73 69 6e 67 20 74 68 65 0a   that using the.
15f70 20 20 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d 6e    ** same column
15f80 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20   more than once 
15f90 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72 72  cannot be an err
15fa0 6f 72 20 62 65 63 61 75 73 65 20 74 68 61 74 20  or because that 
15fb0 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 62 72 65 61  would .  ** brea
15fc0 6b 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  k backwards comp
15fd0 61 74 69 62 69 6c 69 74 79 20 2d 20 69 74 20 6e  atibility - it n
15fe0 65 65 64 73 20 74 6f 20 62 65 20 61 20 77 61 72  eeds to be a war
15ff0 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ning..  */.  for
16000 28 69 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d  (i=0, pListItem=
16010 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73  pList->a; i<pLis
16020 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
16030 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  ListItem++){.   
16040 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
16050 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74 49 74 65  lName = pListIte
16060 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 43 6f  m->zName;.    Co
16070 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20  lumn *pTabCol;. 
16080 20 20 20 69 6e 74 20 72 65 71 75 65 73 74 65 64     int requested
16090 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 63  SortOrder;.    c
160a0 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20  har *zColl;     
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
160c0 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
160d0 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20  nce name */..   
160e0 20 66 6f 72 28 6a 3d 30 2c 20 70 54 61 62 43 6f   for(j=0, pTabCo
160f0 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c  l=pTab->aCol; j<
16100 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c  pTab->nCol; j++,
16110 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20   pTabCol++){.   
16120 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
16130 72 49 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20  rICmp(zColName, 
16140 70 54 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d  pTabCol->zName)=
16150 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
16160 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61  }.    if( j>=pTa
16170 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
16180 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
16190 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
161a0 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e  %s has no column
161b0 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20   named %s",.    
161c0 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
161d0 20 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20   zColName);.    
161e0 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
161f0 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20  chema = 1;.     
16200 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
16210 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
16220 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
16230 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20  umn[i] = j;.    
16240 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  if( pListItem->p
16250 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 69 6e  Expr ){.      in
16260 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 61  t nColl;.      a
16270 73 73 65 72 74 28 20 70 4c 69 73 74 49 74 65 6d  ssert( pListItem
16280 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ->pExpr->op==TK_
16290 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 20  COLLATE );.     
162a0 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74   zColl = pListIt
162b0 65 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  em->pExpr->u.zTo
162c0 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c  ken;.      nColl
162d0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
162e0 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20  30(zColl) + 1;. 
162f0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78       assert( nEx
16300 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20  tra>=nColl );.  
16310 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72      memcpy(zExtr
16320 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29  a, zColl, nColl)
16330 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  ;.      zColl = 
16340 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 20 7a 45  zExtra;.      zE
16350 78 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20  xtra += nColl;. 
16360 20 20 20 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e       nExtra -= n
16370 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Coll;.    }else{
16380 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70  .      zColl = p
16390 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f  Tab->aCol[j].zCo
163a0 6c 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  ll;.      if( !z
163b0 43 6f 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 22  Coll ) zColl = "
163c0 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 7d 0a 20  BINARY";.    }. 
163d0 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74     if( !db->init
163e0 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69 74 65  .busy && !sqlite
163f0 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
16400 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  Parse, zColl) ){
16410 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
16420 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
16430 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
16440 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f  >azColl[i] = zCo
16450 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65  ll;.    requeste
16460 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69  dSortOrder = pLi
16470 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  stItem->sortOrde
16480 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73  r & sortOrderMas
16490 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  k;.    pIndex->a
164a0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28  SortOrder[i] = (
164b0 75 38 29 72 65 71 75 65 73 74 65 64 53 6f 72 74  u8)requestedSort
164c0 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20 73 71 6c  Order;.  }.  sql
164d0 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73  ite3DefaultRowEs
164e0 74 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 69 66  t(pIndex);..  if
164f0 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e  ( pTab==pParse->
16500 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20  pNewTable ){.   
16510 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
16520 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
16530 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75   to create an au
16540 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73  tomatic index as
16550 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74   a.    ** result
16560 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45   of a PRIMARY KE
16570 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
16580 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64  se on a column d
16590 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20  efinition, or.  
165a0 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b    ** a PRIMARY K
165b0 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61  EY or UNIQUE cla
165c0 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  use following th
165d0 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  e column definit
165e0 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65  ions..    ** i.e
165f0 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a  . one of:.    **
16600 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54  .    ** CREATE T
16610 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59  ABLE t(x PRIMARY
16620 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a   KEY, y);.    **
16630 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
16640 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20  x, y, UNIQUE(x, 
16650 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  y));.    **.    
16660 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63  ** Either way, c
16670 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
16680 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  he table already
16690 20 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64   has such an ind
166a0 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f  ex. If.    ** so
166b0 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63  , don't bother c
166c0 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65  reating this one
166d0 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c  . This only appl
166e0 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75  ies to.    ** au
166f0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61  tomatically crea
16700 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65  ted indices. Use
16710 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65  rs can do as the
16720 79 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20  y wish with.    
16730 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69  ** explicit indi
16740 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ces..    **.    
16750 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45 20 6f 72  ** Two UNIQUE or
16760 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
16770 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 6e  straints are con
16780 73 69 64 65 72 65 64 20 65 71 75 69 76 61 6c 65  sidered equivale
16790 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20 74  nt.    ** (and t
167a0 68 75 73 20 73 75 70 70 72 65 73 73 69 6e 67 20  hus suppressing 
167b0 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20  the second one) 
167c0 65 76 65 6e 20 69 66 20 74 68 65 79 20 68 61 76  even if they hav
167d0 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20  e different.    
167e0 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a  ** sort orders..
167f0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
16800 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65   there are diffe
16810 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  rent collating s
16820 65 71 75 65 6e 63 65 73 20 6f 72 20 69 66 20 74  equences or if t
16830 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20  he columns of.  
16840 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72 61    ** the constra
16850 69 6e 74 20 6f 63 63 75 72 20 69 6e 20 64 69 66  int occur in dif
16860 66 65 72 65 6e 74 20 6f 72 64 65 72 73 2c 20 74  ferent orders, t
16870 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69  hen the constrai
16880 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 63  nts are.    ** c
16890 6f 6e 73 69 64 65 72 65 64 20 64 69 73 74 69 6e  onsidered distin
168a0 63 74 20 61 6e 64 20 62 6f 74 68 20 72 65 73 75  ct and both resu
168b0 6c 74 20 69 6e 20 73 65 70 61 72 61 74 65 20 69  lt in separate i
168c0 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20  ndices..    */. 
168d0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
168e0 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
168f0 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
16900 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
16910 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b  t){.      int k;
16920 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16930 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  Idx->onError!=OE
16940 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20 61  _None );.      a
16950 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 75 74  ssert( pIdx->aut
16960 6f 49 6e 64 65 78 20 29 3b 0a 20 20 20 20 20 20  oIndex );.      
16970 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e  assert( pIndex->
16980 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
16990 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70   );..      if( p
169a0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49  Idx->nColumn!=pI
169b0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20  ndex->nColumn ) 
169c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
169d0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d  for(k=0; k<pIdx-
169e0 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a  >nColumn; k++){.
169f0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
16a00 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20  ar *z1;.        
16a10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a  const char *z2;.
16a20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
16a30 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70  ->aiColumn[k]!=p
16a40 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
16a50 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  k] ) break;.    
16a60 20 20 20 20 7a 31 20 3d 20 70 49 64 78 2d 3e 61      z1 = pIdx->a
16a70 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  zColl[k];.      
16a80 20 20 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61    z2 = pIndex->a
16a90 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  zColl[k];.      
16aa0 20 20 69 66 28 20 7a 31 21 3d 7a 32 20 26 26 20    if( z1!=z2 && 
16ab0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
16ac0 31 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a  1, z2) ) break;.
16ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
16ae0 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  ( k==pIdx->nColu
16af0 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  mn ){.        if
16b00 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
16b10 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  =pIndex->onError
16b20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
16b30 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   This constraint
16b40 20 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d   creates the sam
16b50 65 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65  e index as a pre
16b60 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20  vious.          
16b70 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70  ** constraint sp
16b80 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72  ecified somewher
16b90 65 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20  e in the CREATE 
16ba0 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
16bb0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f  .          ** Ho
16bc0 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e  wever the ON CON
16bd0 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72  FLICT clauses ar
16be0 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20  e different. If 
16bf0 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20  both this .     
16c00 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
16c10 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69  nt and the previ
16c20 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63  ous equivalent c
16c30 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65  onstraint have e
16c40 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20  xplicit.        
16c50 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54    ** ON CONFLICT
16c60 20 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73   clauses this is
16c70 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72   an error. Other
16c80 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20  wise, use the.  
16c90 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69          ** expli
16ca0 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20  citly specified 
16cb0 62 65 68 61 76 69 6f 72 20 66 6f 72 20 74 68 65  behavior for the
16cc0 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
16cd0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
16ce0 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72  f( !(pIdx->onErr
16cf0 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c  or==OE_Default |
16d00 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  | pIndex->onErro
16d10 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29  r==OE_Default) )
16d20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
16d30 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
16d40 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
16d50 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74         "conflict
16d60 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  ing ON CONFLICT 
16d70 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65  clauses specifie
16d80 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  d", 0);.        
16d90 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
16da0 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
16db0 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20  =OE_Default ){. 
16dc0 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
16dd0 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65  >onError = pInde
16de0 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  x->onError;.    
16df0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16e00 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  }.        goto e
16e10 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
16e20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16e30 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74    }..  /* Link t
16e40 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72  he new Index str
16e50 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61  ucture to its ta
16e60 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f  ble and to the o
16e70 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d  ther.  ** in-mem
16e80 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72  ory database str
16e90 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20  uctures. .  */. 
16ea0 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
16eb0 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  sy ){.    Index 
16ec0 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  *p;.    assert( 
16ed0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
16ee0 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49  exHeld(db, 0, pI
16ef0 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29  ndex->pSchema) )
16f00 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
16f10 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 49 6e  3HashInsert(&pIn
16f20 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  dex->pSchema->id
16f30 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20  xHash, .        
16f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f50 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c    pIndex->zName,
16f60 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
16f70 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c  (pIndex->zName),
16f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16f90 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65             pInde
16fa0 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  x);.    if( p ){
16fb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16fc0 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20  ==pIndex );  /* 
16fd0 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
16fe0 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
16ff0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
17000 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  d = 1;.      got
17010 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
17020 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  dex;.    }.    d
17030 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
17040 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
17050 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61  ;.    if( pTblNa
17060 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  me!=0 ){.      p
17070 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62  Index->tnum = db
17080 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a  ->init.newTnum;.
17090 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
170a0 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  If the db->init.
170b0 62 75 73 79 20 69 73 20 30 20 74 68 65 6e 20 63  busy is 0 then c
170c0 72 65 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  reate the index 
170d0 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20  on disk.  This. 
170e0 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69   ** involves wri
170f0 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69  ting the index i
17100 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74  nto the master t
17110 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67  able and filling
17120 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64   in the.  ** ind
17130 65 78 20 77 69 74 68 20 74 68 65 20 63 75 72 72  ex with the curr
17140 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e  ent table conten
17150 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ts..  **.  ** Th
17160 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
17170 69 73 20 30 20 77 68 65 6e 20 74 68 65 20 75 73  is 0 when the us
17180 65 72 20 66 69 72 73 74 20 65 6e 74 65 72 73 20  er first enters 
17190 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a  a CREATE INDEX .
171a0 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64    ** command.  d
171b0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
171c0 31 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73  1 when a databas
171d0 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20  e is opened and 
171e0 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44  .  ** CREATE IND
171f0 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  EX statements ar
17200 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68  e read out of th
17210 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e master table. 
17220 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74   In.  ** the lat
17230 74 65 72 20 63 61 73 65 20 74 68 65 20 69 6e 64  ter case the ind
17240 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
17250 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68  s on disk, which
17260 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20   is why.  ** we 
17270 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65  don't want to re
17280 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a  create it..  **.
17290 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65    ** If pTblName
172a0 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69  ==0 it means thi
172b0 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72  s index is gener
172c0 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61 72  ated as a primar
172d0 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e  y key.  ** or UN
172e0 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
172f0 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  of a CREATE TABL
17300 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69  E statement.  Si
17310 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20  nce the table.  
17320 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ** has just been
17330 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e   created, it con
17340 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e  tains no data an
17350 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74  d the index init
17360 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  ialization.  ** 
17370 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70  step can be skip
17380 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  ped..  */.  else
17390 7b 20 2f 2a 20 69 66 28 20 64 62 2d 3e 69 6e 69  { /* if( db->ini
173a0 74 2e 62 75 73 79 3d 3d 30 20 29 20 2a 2f 0a 20  t.busy==0 ) */. 
173b0 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
173c0 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20  char *zStmt;.   
173d0 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50   int iMem = ++pP
173e0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20  arse->nMem;..   
173f0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
17400 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
17410 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
17420 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
17430 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 72 65  ex;...    /* Cre
17440 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65  ate the rootpage
17450 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20   for the index. 
17460 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
17470 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
17480 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
17490 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
174a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
174b0 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20 69  P_CreateIndex, i
174c0 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20  Db, iMem);..    
174d0 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20 63 6f  /* Gather the co
174e0 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
174f0 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  he CREATE INDEX 
17500 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20  statement into. 
17510 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20     ** the zStmt 
17520 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a  variable.    */.
17530 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29      if( pStart )
17540 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
17550 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 20  pEnd!=0 );.     
17560 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65   /* A named inde
17570 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63  x with an explic
17580 69 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  it CREATE INDEX 
17590 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
175a0 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
175b0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43  e3MPrintf(db, "C
175c0 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e  REATE%s INDEX %.
175d0 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45  *s",.        onE
175e0 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20  rror==OE_None ? 
175f0 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 0a  "" : " UNIQUE",.
17600 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70 45          (int)(pE
17610 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a  nd->z - pName->z
17620 29 20 2b 20 31 2c 0a 20 20 20 20 20 20 20 20 70  ) + 1,.        p
17630 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65  Name->z);.    }e
17640 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
17650 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
17660 20 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52   created by a PR
17670 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
17680 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  QUE constraint *
17690 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74  /.      /* zStmt
176a0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
176b0 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20  f(""); */.      
176c0 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  zStmt = 0;.    }
176d0 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20  ..    /* Add an 
176e0 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f  entry in sqlite_
176f0 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20  master for this 
17700 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20  index.    */.   
17710 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
17720 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
17730 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
17740 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27  O %Q.%s VALUES('
17750 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64  index',%Q,%Q,#%d
17760 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20  ,%Q);",.        
17770 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
17780 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
17790 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70  (iDb),.        p
177a0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  Index->zName,.  
177b0 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
177c0 65 2c 0a 20 20 20 20 20 20 20 20 69 4d 65 6d 2c  e,.        iMem,
177d0 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20  .        zStmt. 
177e0 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
177f0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d  3DbFree(db, zStm
17800 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c  t);..    /* Fill
17810 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20   the index with 
17820 64 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65  data and reparse
17830 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64   the schema. Cod
17840 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20  e an OP_Expire. 
17850 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64     ** to invalid
17860 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70  ate all pre-comp
17870 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  iled statements.
17880 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
17890 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  pTblName ){.    
178a0 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
178b0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
178c0 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  dex, iMem);.    
178d0 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
178e0 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
178f0 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
17900 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68  3VdbeAddParseSch
17910 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20  emaOp(v, iDb,.  
17920 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
17930 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d  rintf(db, "name=
17940 27 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69  '%q' AND type='i
17950 6e 64 65 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e  ndex'", pIndex->
17960 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73  zName));.      s
17970 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
17980 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30  (v, OP_Expire, 0
17990 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
179a0 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61  /* When adding a
179b0 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c  n index to the l
179c0 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66  ist of indices f
179d0 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65  or a table, make
179e0 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69  .  ** sure all i
179f0 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f  ndices labeled O
17a00 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61  E_Replace come a
17a10 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c  fter all those l
17a20 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49  abeled.  ** OE_I
17a30 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20  gnore.  This is 
17a40 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68  necessary for th
17a50 65 20 63 6f 72 72 65 63 74 20 63 6f 6e 73 74 72  e correct constr
17a60 61 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a 20  aint check.  ** 
17a70 70 72 6f 63 65 73 73 69 6e 67 20 28 69 6e 20 73  processing (in s
17a80 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f  qlite3GenerateCo
17a90 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28 29  nstraintChecks()
17aa0 29 20 61 73 20 70 61 72 74 20 6f 66 0a 20 20 2a  ) as part of.  *
17ab0 2a 20 55 50 44 41 54 45 20 61 6e 64 20 49 4e 53  * UPDATE and INS
17ac0 45 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ERT statements. 
17ad0 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d   .  */.  if( db-
17ae0 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54  >init.busy || pT
17af0 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  blName==0 ){.   
17b00 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45   if( onError!=OE
17b10 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62  _Replace || pTab
17b20 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20  ->pIndex==0.    
17b30 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49       || pTab->pI
17b40 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
17b50 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20  E_Replace){.    
17b60 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
17b70 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
17b80 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64        pTab->pInd
17b90 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  ex = pIndex;.   
17ba0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
17bb0 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54  dex *pOther = pT
17bc0 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
17bd0 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d    while( pOther-
17be0 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72  >pNext && pOther
17bf0 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72  ->pNext->onError
17c00 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a  !=OE_Replace ){.
17c10 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d          pOther =
17c20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
17c30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
17c40 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f  ndex->pNext = pO
17c50 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
17c60 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74     pOther->pNext
17c70 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d   = pIndex;.    }
17c80 0a 20 20 20 20 70 52 65 74 20 3d 20 70 49 6e 64  .    pRet = pInd
17c90 65 78 3b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d  ex;.    pIndex =
17ca0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c   0;.  }..  /* Cl
17cb0 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78  ean up before ex
17cc0 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72  iting */.exit_cr
17cd0 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66  eate_index:.  if
17ce0 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ( pIndex ){.    
17cf0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
17d00 2c 20 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66  , pIndex->zColAf
17d10 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  f);.    sqlite3D
17d20 62 46 72 65 65 28 64 62 2c 20 70 49 6e 64 65 78  bFree(db, pIndex
17d30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
17d40 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
17d50 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c  b, pList);.  sql
17d60 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
17d70 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b  e(db, pTblName);
17d80 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
17d90 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72  (db, zName);.  r
17da0 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
17db0 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e  *.** Fill the In
17dc0 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61  dex.aiRowEst[] a
17dd0 72 72 61 79 20 77 69 74 68 20 64 65 66 61 75 6c  rray with defaul
17de0 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  t information - 
17df0 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74  information.** t
17e00 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 77  o be used when w
17e10 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74  e have not run t
17e20 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61  he ANALYZE comma
17e30 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45  nd..**.** aiRowE
17e40 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65  st[0] is suppose
17e50 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
17e60 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
17e70 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  ts in the index.
17e80 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20  .** Since we do 
17e90 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20  not know, guess 
17ea0 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f  1 million.  aiRo
17eb0 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73  wEst[1] is an es
17ec0 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a  timate of the.**
17ed0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
17ee0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  in the table tha
17ef0 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74  t match any part
17f00 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20  icular value of 
17f10 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c  the.** first col
17f20 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
17f30 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69  .  aiRowEst[2] i
17f40 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
17f50 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
17f60 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63  f rows that matc
17f70 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  h any particular
17f80 20 63 6f 6d 62 69 6e 69 61 74 69 6f 6e 20 6f 66   combiniation of
17f90 20 74 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c   the first 2 col
17fa0 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69  umns.** of the i
17fb0 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f  ndex.  And so fo
17fc0 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c  rth.  It must al
17fd0 77 61 79 73 20 62 65 20 74 68 65 20 63 61 73 65  ways be the case
17fe0 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20   that.*.**      
17ff0 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d       aiRowEst[N]
18000 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a  <=aiRowEst[N-1].
18010 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52  **           aiR
18020 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a  owEst[N]>=1.**.*
18030 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61  * Apart from tha
18040 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c  t, we have littl
18050 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64  e to go on besid
18060 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20  es intuition as 
18070 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45  to.** how aiRowE
18080 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69  st[] should be i
18090 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65  nitialized.  The
180a0 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74   numbers generat
180b0 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62  ed here.** are b
180c0 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20  ased on typical 
180d0 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20  values found in 
180e0 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a  actual indices..
180f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
18100 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64  efaultRowEst(Ind
18110 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 74 52 6f  ex *pIdx){.  tRo
18120 77 63 6e 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e  wcnt *a = pIdx->
18130 61 69 52 6f 77 45 73 74 3b 0a 20 20 69 6e 74 20  aiRowEst;.  int 
18140 69 3b 0a 20 20 74 52 6f 77 63 6e 74 20 6e 3b 0a  i;.  tRowcnt n;.
18150 20 20 61 73 73 65 72 74 28 20 61 21 3d 30 20 29    assert( a!=0 )
18160 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 49 64 78 2d  ;.  a[0] = pIdx-
18170 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 45 73 74  >pTable->nRowEst
18180 3b 0a 20 20 69 66 28 20 61 5b 30 5d 3c 31 30 20  ;.  if( a[0]<10 
18190 29 20 61 5b 30 5d 20 3d 20 31 30 3b 0a 20 20 6e  ) a[0] = 10;.  n
181a0 20 3d 20 31 30 3b 0a 20 20 66 6f 72 28 69 3d 31   = 10;.  for(i=1
181b0 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  ; i<=pIdx->nColu
181c0 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 5b  mn; i++){.    a[
181d0 69 5d 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  i] = n;.    if( 
181e0 6e 3e 35 20 29 20 6e 2d 2d 3b 0a 20 20 7d 0a 20  n>5 ) n--;.  }. 
181f0 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
18200 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20  or!=OE_None ){. 
18210 20 20 20 61 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75     a[pIdx->nColu
18220 6d 6e 5d 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  mn] = 1;.  }.}..
18230 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
18240 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20  ne will drop an 
18250 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69  existing named i
18260 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74  ndex.  This rout
18270 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  ine.** implement
18280 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58  s the DROP INDEX
18290 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
182a0 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49  oid sqlite3DropI
182b0 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
182c0 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61  se, SrcList *pNa
182d0 6d 65 2c 20 69 6e 74 20 69 66 45 78 69 73 74 73  me, int ifExists
182e0 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
182f0 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  ex;.  Vdbe *v;. 
18300 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
18310 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
18320 20 69 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28   iDb;..  assert(
18330 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
18340 20 29 3b 20 20 20 2f 2a 20 4e 65 76 65 72 20 63   );   /* Never c
18350 61 6c 6c 65 64 20 77 69 74 68 20 70 72 69 6f 72  alled with prior
18360 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28   errors */.  if(
18370 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
18380 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
18390 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
183a0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61   }.  assert( pNa
183b0 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
183c0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
183d0 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
183e0 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
183f0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
18400 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e  index;.  }.  pIn
18410 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  dex = sqlite3Fin
18420 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65  dIndex(db, pName
18430 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e  ->a[0].zName, pN
18440 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
18450 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  ase);.  if( pInd
18460 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ex==0 ){.    if(
18470 20 21 69 66 45 78 69 73 74 73 20 29 7b 0a 20 20   !ifExists ){.  
18480 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
18490 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
184a0 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c  such index: %S",
184b0 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   pName, 0);.    
184c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
184d0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61  ite3CodeVerifyNa
184e0 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  medSchema(pParse
184f0 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  , pName->a[0].zD
18500 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a  atabase);.    }.
18510 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
18520 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  kSchema = 1;.   
18530 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
18540 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
18550 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
18560 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ex ){.    sqlite
18570 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
18580 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61  , "index associa
18590 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20  ted with UNIQUE 
185a0 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d  ".      "or PRIM
185b0 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
185c0 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f  nt cannot be dro
185d0 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67  pped", 0);.    g
185e0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
185f0 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d  dex;.  }.  iDb =
18600 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
18610 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
18620 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e  ->pSchema);.#ifn
18630 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18640 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
18650 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d  {.    int code =
18660 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44   SQLITE_DROP_IND
18670 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  EX;.    Table *p
18680 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54  Tab = pIndex->pT
18690 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  able;.    const 
186a0 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
186b0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
186c0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
186d0 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
186e0 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69 66  BLE(iDb);.    if
186f0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
18700 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
18710 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20  E_DELETE, zTab, 
18720 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
18730 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
18740 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
18750 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
18760 42 20 26 26 20 69 44 62 20 29 20 63 6f 64 65 20  B && iDb ) code 
18770 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
18780 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  MP_INDEX;.    if
18790 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
187a0 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
187b0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
187c0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
187d0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
187e0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
187f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
18800 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
18810 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
18820 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72  the index and fr
18830 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
18840 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ble */.  v = sql
18850 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
18860 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
18870 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
18880 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
18890 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
188a0 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
188b0 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
188c0 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
188d0 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e  OM %Q.%s WHERE n
188e0 61 6d 65 3d 25 51 20 41 4e 44 20 74 79 70 65 3d  ame=%Q AND type=
188f0 27 69 6e 64 65 78 27 22 2c 0a 20 20 20 20 20 20  'index'",.      
18900 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
18910 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
18920 45 28 69 44 62 29 2c 20 70 49 6e 64 65 78 2d 3e  E(iDb), pIndex->
18930 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20  zName.    );.   
18940 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61   sqlite3ClearSta
18950 74 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20  tTables(pParse, 
18960 69 44 62 2c 20 22 69 64 78 22 2c 20 70 49 6e 64  iDb, "idx", pInd
18970 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ex->zName);.    
18980 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
18990 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
189a0 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  ;.    destroyRoo
189b0 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49  tPage(pParse, pI
189c0 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  ndex->tnum, iDb)
189d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
189e0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72  eAddOp4(v, OP_Dr
189f0 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c  opIndex, iDb, 0,
18a00 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d   0, pIndex->zNam
18a10 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74  e, 0);.  }..exit
18a20 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73  _drop_index:.  s
18a30 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
18a40 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ete(db, pName);.
18a50 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20  }../*.** pArray 
18a60 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
18a70 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65  an array of obje
18a80 63 74 73 2e 20 45 61 63 68 20 6f 62 6a 65 63 74  cts. Each object
18a90 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61 79   in the.** array
18aa0 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74 65   is szEntry byte
18ab0 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 69 73 20  s in size. This 
18ac0 72 6f 75 74 69 6e 65 20 75 73 65 73 20 73 71 6c  routine uses sql
18ad0 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 29 0a  ite3DbRealloc().
18ae0 2a 2a 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65  ** to extend the
18af0 20 61 72 72 61 79 20 73 6f 20 74 68 61 74 20 74   array so that t
18b00 68 65 72 65 20 69 73 20 73 70 61 63 65 20 66 6f  here is space fo
18b10 72 20 61 20 6e 65 77 20 6f 62 6a 65 63 74 20 61  r a new object a
18b20 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a  t the end..**.**
18b30 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
18b40 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a  ion is called, *
18b50 70 6e 45 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73  pnEntry contains
18b60 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
18b70 65 20 6f 66 0a 2a 2a 20 74 68 65 20 61 72 72 61  e of.** the arra
18b80 79 20 28 69 6e 20 65 6e 74 72 69 65 73 20 2d 20  y (in entries - 
18b90 73 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  so the allocatio
18ba0 6e 20 69 73 20 28 28 2a 70 6e 45 6e 74 72 79 29  n is ((*pnEntry)
18bb0 20 2a 20 73 7a 45 6e 74 72 79 29 20 62 79 74 65   * szEntry) byte
18bc0 73 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c 29 2e 0a  s.** in total)..
18bd0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 61  **.** If the rea
18be0 6c 6c 6f 63 28 29 20 69 73 20 73 75 63 63 65 73  lloc() is succes
18bf0 73 66 75 6c 20 28 69 2e 65 2e 20 69 66 20 6e 6f  sful (i.e. if no
18c00 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 6f   OOM condition o
18c10 63 63 75 72 73 29 2c 20 74 68 65 0a 2a 2a 20 73  ccurs), the.** s
18c20 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
18c30 6f 72 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  or the new objec
18c40 74 20 69 73 20 7a 65 72 6f 65 64 2c 20 2a 70 6e  t is zeroed, *pn
18c50 45 6e 74 72 79 20 75 70 64 61 74 65 64 20 74 6f  Entry updated to
18c60 0a 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 65 20  .** reflect the 
18c70 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20  new size of the 
18c80 61 72 72 61 79 20 61 6e 64 20 61 20 70 6f 69 6e  array and a poin
18c90 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 61  ter to the new a
18ca0 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72 65 74  llocation.** ret
18cb0 75 72 6e 65 64 2e 20 2a 70 49 64 78 20 69 73 20  urned. *pIdx is 
18cc0 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
18cd0 20 6f 66 20 74 68 65 20 6e 65 77 20 61 72 72 61   of the new arra
18ce0 79 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20  y entry in this 
18cf0 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  case..**.** Othe
18d00 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 72 65  rwise, if the re
18d10 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2c 20 2a  alloc() fails, *
18d20 70 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 2d  pIdx is set to -
18d30 31 2c 20 2a 70 6e 45 6e 74 72 79 20 72 65 6d 61  1, *pnEntry rema
18d40 69 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  ins.** unchanged
18d50 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 70   and a copy of p
18d60 41 72 72 61 79 20 72 65 74 75 72 6e 65 64 2e 0a  Array returned..
18d70 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
18d80 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
18d90 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
18da0 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
18db0 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61   to notify of ma
18dc0 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f  lloc failures */
18dd0 0a 20 20 76 6f 69 64 20 2a 70 41 72 72 61 79 2c  .  void *pArray,
18de0 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
18df0 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67 68 74   objects.  Might
18e00 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20   be reallocated 
18e10 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72 79  */.  int szEntry
18e20 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  ,      /* Size o
18e30 66 20 65 61 63 68 20 6f 62 6a 65 63 74 20 69 6e  f each object in
18e40 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 20 20   the array */.  
18e50 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20  int *pnEntry,   
18e60 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
18e70 62 6a 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79  bjects currently
18e80 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74   in use */.  int
18e90 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f   *pIdx         /
18ea0 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e 64 65  * Write the inde
18eb0 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20  x of a new slot 
18ec0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  here */.){.  cha
18ed0 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  r *z;.  int n = 
18ee0 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 69 66 28 20  *pnEntry;.  if( 
18ef0 28 6e 20 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29  (n & (n-1))==0 )
18f00 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 28  {.    int sz = (
18f10 6e 3d 3d 30 29 20 3f 20 31 20 3a 20 32 2a 6e 3b  n==0) ? 1 : 2*n;
18f20 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20  .    void *pNew 
18f30 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
18f40 6f 63 28 64 62 2c 20 70 41 72 72 61 79 2c 20 73  oc(db, pArray, s
18f50 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20  z*szEntry);.    
18f60 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
18f70 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b       *pIdx = -1;
18f80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41  .      return pA
18f90 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rray;.    }.    
18fa0 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20  pArray = pNew;. 
18fb0 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29   }.  z = (char*)
18fc0 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74  pArray;.  memset
18fd0 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72 79 5d  (&z[n * szEntry]
18fe0 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20  , 0, szEntry);. 
18ff0 20 2a 70 49 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b   *pIdx = n;.  ++
19000 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75  *pnEntry;.  retu
19010 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a  rn pArray;.}../*
19020 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
19030 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
19040 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43  given IdList.  C
19050 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69  reate a new IdLi
19060 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
19070 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64  ..**.** A new Id
19080 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
19090 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
190a0 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
190b0 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
190c0 64 4c 69 73 74 41 70 70 65 6e 64 28 73 71 6c 69  dListAppend(sqli
190d0 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
190e0 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
190f0 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  Token){.  int i;
19100 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
19110 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
19120 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
19130 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64  ro(db, sizeof(Id
19140 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
19150 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
19160 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
19170 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72  t->a = sqlite3Ar
19180 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
19190 20 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69     db,.      pLi
191a0 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a  st->a,.      siz
191b0 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
191c0 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e  ,.      &pList->
191d0 6e 49 64 2c 0a 20 20 20 20 20 20 26 69 0a 20 20  nId,.      &i.  
191e0 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a  );.  if( i<0 ){.
191f0 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
19200 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
19210 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  t);.    return 0
19220 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61  ;.  }.  pList->a
19230 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [i].zName = sqli
19240 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
19250 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  (db, pToken);.  
19260 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
19270 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
19280 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64   IdList..*/.void
19290 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
192a0 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
192b0 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29  , IdList *pList)
192c0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
192d0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
192e0 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
192f0 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
19300 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
19310 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Free(db, pList->
19320 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  a[i].zName);.  }
19330 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
19340 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a  (db, pList->a);.
19350 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
19360 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
19370 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
19380 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f  index in pList o
19390 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  f the identifier
193a0 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74   named zId.  Ret
193b0 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74  urn -1.** if not
193c0 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
193d0 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
193e0 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  x(IdList *pList,
193f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
19400 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
19410 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
19420 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28  eturn -1;.  for(
19430 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
19440 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
19450 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
19460 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
19470 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  e, zName)==0 ) r
19480 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
19490 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
194a0 2a 2a 20 45 78 70 61 6e 64 20 74 68 65 20 73 70  ** Expand the sp
194b0 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
194c0 72 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  r the given SrcL
194d0 69 73 74 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a  ist object by.**
194e0 20 63 72 65 61 74 69 6e 67 20 6e 45 78 74 72 61   creating nExtra
194f0 20 6e 65 77 20 73 6c 6f 74 73 20 62 65 67 69 6e   new slots begin
19500 6e 69 6e 67 20 61 74 20 69 53 74 61 72 74 2e 20  ning at iStart. 
19510 20 69 53 74 61 72 74 20 69 73 20 7a 65 72 6f 20   iStart is zero 
19520 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c  based..** New sl
19530 6f 74 73 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  ots are zeroed..
19540 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
19550 65 2c 20 73 75 70 70 6f 73 65 20 61 20 53 72 63  e, suppose a Src
19560 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 63  List initially c
19570 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e 74 72  ontains two entr
19580 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20  ies: A,B..** To 
19590 61 70 70 65 6e 64 20 33 20 6e 65 77 20 65 6e 74  append 3 new ent
195a0 72 69 65 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e  ries onto the en
195b0 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a  d, do this:.**.*
195c0 2a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  *    sqlite3SrcL
195d0 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70  istEnlarge(db, p
195e0 53 72 63 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a  Srclist, 3, 2);.
195f0 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
19600 63 61 6c 6c 20 61 62 6f 76 65 20 69 74 20 77 6f  call above it wo
19610 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c  uld contain:  A,
19620 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69   B, nil, nil, ni
19630 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 53 74  l..** If the iSt
19640 61 72 74 20 61 72 67 75 6d 65 6e 74 20 68 61 64  art argument had
19650 20 62 65 65 6e 20 31 20 69 6e 73 74 65 61 64 20   been 1 instead 
19660 6f 66 20 32 2c 20 74 68 65 6e 20 74 68 65 20 72  of 2, then the r
19670 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68  esult.** would h
19680 61 76 65 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69  ave been:  A, ni
19690 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20  l, nil, nil, B. 
196a0 20 54 6f 20 70 72 65 70 65 6e 64 20 74 68 65 20   To prepend the 
196b0 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68  new slots,.** th
196c0 65 20 69 53 74 61 72 74 20 76 61 6c 75 65 20 77  e iStart value w
196d0 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20  ould be 0.  The 
196e0 72 65 73 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c  result then woul
196f0 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69  d.** be: nil, ni
19700 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a  l, nil, A, B..**
19710 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
19720 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
19730 20 74 68 65 20 53 72 63 4c 69 73 74 20 69 73 20   the SrcList is 
19740 75 6e 63 68 61 6e 67 65 64 2e 20 20 54 68 65 0a  unchanged.  The.
19750 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ** db->mallocFai
19760 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c 20 62 65  led flag will be
19770 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a 2a 2f   set to true..*/
19780 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
19790 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
197a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
197b0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
197c0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
197d0 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20 65 72  notify of OOM er
197e0 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73  rors */.  SrcLis
197f0 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20  t *pSrc,     /* 
19800 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f 20 62  The SrcList to b
19810 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20  e enlarged */.  
19820 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
19830 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19840 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61 64 64  new slots to add
19850 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f   to pSrc->a[] */
19860 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20 20 20  .  int iStart   
19870 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
19880 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66  n pSrc->a[] of f
19890 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f  irst new slot */
198a0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  .){.  int i;..  
198b0 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
198c0 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61  ng on calling pa
198d0 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73  rameters */.  as
198e0 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d 30 20  sert( iStart>=0 
198f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78  );.  assert( nEx
19900 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  tra>=1 );.  asse
19910 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
19920 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c   assert( iStart<
19930 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a  =pSrc->nSrc );..
19940 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64    /* Allocate ad
19950 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65 20 69  ditional space i
19960 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 66  f needed */.  if
19970 28 20 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78  ( pSrc->nSrc+nEx
19980 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63  tra>pSrc->nAlloc
19990 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
199a0 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e  *pNew;.    int n
199b0 41 6c 6c 6f 63 20 3d 20 70 53 72 63 2d 3e 6e 53  Alloc = pSrc->nS
199c0 72 63 2b 6e 45 78 74 72 61 3b 0a 20 20 20 20 69  rc+nExtra;.    i
199d0 6e 74 20 6e 47 6f 74 3b 0a 20 20 20 20 70 4e 65  nt nGot;.    pNe
199e0 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
199f0 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63 2c 0a 20  lloc(db, pSrc,. 
19a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
19a10 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b 20 28 6e  zeof(*pSrc) + (n
19a20 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28  Alloc-1)*sizeof(
19a30 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  pSrc->a[0]) );. 
19a40 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
19a50 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
19a60 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19a70 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
19a80 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20   pSrc;.    }.   
19a90 20 70 53 72 63 20 3d 20 70 4e 65 77 3b 0a 20 20   pSrc = pNew;.  
19aa0 20 20 6e 47 6f 74 20 3d 20 28 73 71 6c 69 74 65    nGot = (sqlite
19ab0 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62  3DbMallocSize(db
19ac0 2c 20 70 4e 65 77 29 20 2d 20 73 69 7a 65 6f 66  , pNew) - sizeof
19ad0 28 2a 70 53 72 63 29 29 2f 73 69 7a 65 6f 66 28  (*pSrc))/sizeof(
19ae0 70 53 72 63 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20  pSrc->a[0])+1;. 
19af0 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20     pSrc->nAlloc 
19b00 3d 20 28 75 31 36 29 6e 47 6f 74 3b 0a 20 20 7d  = (u16)nGot;.  }
19b10 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73  ..  /* Move exis
19b20 74 69 6e 67 20 73 6c 6f 74 73 20 74 68 61 74 20  ting slots that 
19b30 63 6f 6d 65 20 61 66 74 65 72 20 74 68 65 20 6e  come after the n
19b40 65 77 6c 79 20 69 6e 73 65 72 74 65 64 20 73 6c  ewly inserted sl
19b50 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20  ots.  ** out of 
19b60 74 68 65 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72  the way */.  for
19b70 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b  (i=pSrc->nSrc-1;
19b80 20 69 3e 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29   i>=iStart; i--)
19b90 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b  {.    pSrc->a[i+
19ba0 6e 45 78 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e  nExtra] = pSrc->
19bb0 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63  a[i];.  }.  pSrc
19bc0 2d 3e 6e 53 72 63 20 2b 3d 20 28 69 31 36 29 6e  ->nSrc += (i16)n
19bd0 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72  Extra;..  /* Zer
19be0 6f 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f  o the newly allo
19bf0 63 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20  cated slots */. 
19c00 20 6d 65 6d 73 65 74 28 26 70 53 72 63 2d 3e 61   memset(&pSrc->a
19c10 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  [iStart], 0, siz
19c20 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a  eof(pSrc->a[0])*
19c30 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f 72 28 69  nExtra);.  for(i
19c40 3d 69 53 74 61 72 74 3b 20 69 3c 69 53 74 61 72  =iStart; i<iStar
19c50 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a  t+nExtra; i++){.
19c60 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69      pSrc->a[i].i
19c70 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d  Cursor = -1;.  }
19c80 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20  ..  /* Return a 
19c90 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65  pointer to the e
19ca0 6e 6c 61 72 67 65 64 20 53 72 63 4c 69 73 74 20  nlarged SrcList 
19cb0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63  */.  return pSrc
19cc0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  ;.}.../*.** Appe
19cd0 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e  nd a new table n
19ce0 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ame to the given
19cf0 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74   SrcList.  Creat
19d00 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  e a new SrcList 
19d10 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20  if.** need be.  
19d20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63  A new entry is c
19d30 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72  reated in the Sr
19d40 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54  cList even if pT
19d50 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  able is NULL..**
19d60 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74 20 69 73  .** A SrcList is
19d70 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
19d80 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 61  LL if there is a
19d90 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68  n OOM error.  Th
19da0 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72  e returned.** Sr
19db0 63 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 74  cList might be t
19dc0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 53  he same as the S
19dd0 72 63 4c 69 73 74 20 74 68 61 74 20 77 61 73 20  rcList that was 
19de0 69 6e 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68  input or it migh
19df0 74 20 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e  t be.** a new on
19e00 65 2e 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  e.  If an OOM er
19e10 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c  ror does occurs,
19e20 20 74 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20   then the prior 
19e30 76 61 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a  value of pList.*
19e40 2a 20 74 68 61 74 20 69 73 20 69 6e 70 75 74 20  * that is input 
19e50 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
19e60 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
19e70 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
19e80 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f   pDatabase is no
19e90 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73  t null, it means
19ea0 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
19eb0 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a  has an optional.
19ec0 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ** database name
19ed0 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74   prefix.  Like t
19ee0 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e  his:  "database.
19ef0 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61  table".  The pDa
19f00 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73  tabase.** points
19f10 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61   to the table na
19f20 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c  me and the pTabl
19f30 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  e points to the 
19f40 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
19f50 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b  * The SrcList.a[
19f60 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73  ].zName field is
19f70 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
19f80 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63   table name whic
19f90 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20  h might.** come 
19fa0 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20  from pTable (if 
19fb0 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
19fc0 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61  L) or from pData
19fd0 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69  base.  .** SrcLi
19fe0 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65  st.a[].zDatabase
19ff0 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
1a000 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1a010 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a  e from pTable,.*
1a020 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69  * or with NULL i
1a030 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73  f no database is
1a040 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
1a050 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
1a060 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74  , if call like t
1a070 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
1a080 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1a090 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29  tAppend(D,A,B,0)
1a0a0 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69  ;.**.** Then B i
1a0b0 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  s a table name a
1a0c0 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
1a0d0 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66  name is unspecif
1a0e0 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a  ied.  If called.
1a0f0 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ** like this:.**
1a100 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
1a110 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1a120 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a  (D,A,B,C);.**.**
1a130 20 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74   Then C is the t
1a140 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20  able name and B 
1a150 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
1a160 6e 61 6d 65 2e 20 20 49 66 20 43 20 69 73 20 64  name.  If C is d
1a170 65 66 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73  efined.** then s
1a180 6f 20 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 65  o is B.  In othe
1a190 72 20 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 65  r words, we neve
1a1a0 72 20 68 61 76 65 20 61 20 63 61 73 65 20 77 68  r have a case wh
1a1b0 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ere:.**.**      
1a1c0 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1a1d0 74 41 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29  tAppend(D,A,0,C)
1a1e0 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61  ;.**.** Both pTa
1a1f0 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73  ble and pDatabas
1a200 65 20 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f  e are assumed to
1a210 20 62 65 20 71 75 6f 74 65 64 2e 20 20 54 68 65   be quoted.  The
1a220 79 20 61 72 65 20 64 65 71 75 6f 74 65 64 0a 2a  y are dequoted.*
1a230 2a 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61  * before being a
1a240 64 64 65 64 20 74 6f 20 74 68 65 20 53 72 63 4c  dded to the SrcL
1a250 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  ist..*/.SrcList 
1a260 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41  *sqlite3SrcListA
1a270 70 70 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33  ppend(.  sqlite3
1a280 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
1a290 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f  Connection to no
1a2a0 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66  tify of malloc f
1a2b0 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63  ailures */.  Src
1a2c0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
1a2d0 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68   /* Append to th
1a2e0 69 73 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c  is SrcList. NULL
1a2f0 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 53   creates a new S
1a300 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65  rcList */.  Toke
1a310 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20  n *pTable,      
1a320 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65  /* Table to appe
1a330 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nd */.  Token *p
1a340 44 61 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44  Database    /* D
1a350 61 74 61 62 61 73 65 20 6f 66 20 74 68 65 20 74  atabase of the t
1a360 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  able */.){.  str
1a370 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1a380 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72   *pItem;.  asser
1a390 74 28 20 70 44 61 74 61 62 61 73 65 3d 3d 30 20  t( pDatabase==0 
1a3a0 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 20  || pTable!=0 ); 
1a3b0 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 76 65 20   /* Cannot have 
1a3c0 43 20 77 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20  C without B */. 
1a3d0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
1a3e0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
1a3f0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
1a400 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 72 63 4c  (db, sizeof(SrcL
1a410 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
1a420 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1a430 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  n 0;.    pList->
1a440 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a  nAlloc = 1;.  }.
1a450 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1a460 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
1a470 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c  db, pList, 1, pL
1a480 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 69 66  ist->nSrc);.  if
1a490 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1a4a0 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
1a4b0 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
1a4c0 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72  b, pList);.    r
1a4d0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1a4e0 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
1a4f0 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 3b  [pList->nSrc-1];
1a500 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
1a510 20 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a   && pDatabase->z
1a520 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61  ==0 ){.    pData
1a530 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  base = 0;.  }.  
1a540 69 66 28 20 70 44 61 74 61 62 61 73 65 20 29 7b  if( pDatabase ){
1a550 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d  .    Token *pTem
1a560 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20  p = pDatabase;. 
1a570 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 70     pDatabase = p
1a580 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c  Table;.    pTabl
1a590 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20  e = pTemp;.  }. 
1a5a0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
1a5b0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1a5c0 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29  oken(db, pTable)
1a5d0 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  ;.  pItem->zData
1a5e0 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  base = sqlite3Na
1a5f0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
1a600 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 72 65  pDatabase);.  re
1a610 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
1a620 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56 64 62 65  *.** Assign Vdbe
1a630 43 75 72 73 6f 72 20 69 6e 64 65 78 20 6e 75 6d  Cursor index num
1a640 62 65 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c  bers to all tabl
1a650 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a  es in a SrcList.
1a660 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1a670 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
1a680 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ors(Parse *pPars
1a690 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  e, SrcList *pLis
1a6a0 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
1a6b0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1a6c0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73  em *pItem;.  ass
1a6d0 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 70 50 61  ert(pList || pPa
1a6e0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
1a6f0 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
1a700 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
1a710 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  i=0, pItem=pList
1a720 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  ->a; i<pList->nS
1a730 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
1a740 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
1a750 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29  em->iCursor>=0 )
1a760 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 49   break;.      pI
1a770 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
1a780 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
1a790 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1a7a0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
1a7b0 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1a7c0 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
1a7d0 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53  Parse, pItem->pS
1a7e0 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20  elect->pSrc);.  
1a7f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1a800 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
1a810 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73  an entire SrcLis
1a820 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20  t including all 
1a830 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65  its substructure
1a840 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1a850 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 73  3SrcListDelete(s
1a860 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c  qlite3 *db, SrcL
1a870 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
1a880 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53  nt i;.  struct S
1a890 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1a8a0 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
1a8b0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
1a8c0 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
1a8d0 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
1a8e0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
1a8f0 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m++){.    sqlite
1a900 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
1a910 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
1a920 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1a930 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  (db, pItem->zNam
1a940 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
1a950 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
1a960 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 73 71  >zAlias);.    sq
1a970 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1a980 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a  pItem->zIndex);.
1a990 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
1a9a0 65 54 61 62 6c 65 28 64 62 2c 20 70 49 74 65 6d  eTable(db, pItem
1a9b0 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c  ->pTab);.    sql
1a9c0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
1a9d0 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  (db, pItem->pSel
1a9e0 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ect);.    sqlite
1a9f0 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1aa00 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20  pItem->pOn);.   
1aa10 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1aa20 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
1aa30 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73  pUsing);.  }.  s
1aa40 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1aa50 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
1aa60 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1aa70 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
1aa80 70 61 72 73 65 72 20 74 6f 20 61 64 64 20 61 20  parser to add a 
1aa90 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a  new term to the.
1aaa0 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77  ** end of a grow
1aab0 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  ing FROM clause.
1aac0 20 20 54 68 65 20 22 70 22 20 70 61 72 61 6d 65    The "p" parame
1aad0 74 65 72 20 69 73 20 74 68 65 20 70 61 72 74 20  ter is the part 
1aae0 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  of.** the FROM c
1aaf0 6c 61 75 73 65 20 74 68 61 74 20 68 61 73 20 61  lause that has a
1ab00 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73  lready been cons
1ab10 74 72 75 63 74 65 64 2e 20 20 22 70 22 20 69 73  tructed.  "p" is
1ab20 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73   NULL.** if this
1ab30 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65   is the first te
1ab40 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rm of the FROM c
1ab50 6c 61 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61  lause.  pTable a
1ab60 6e 64 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20  nd pDatabase.** 
1ab70 61 72 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  are the name of 
1ab80 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61  the table and da
1ab90 74 61 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20  tabase named in 
1aba0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1abb0 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61  term..** pDataba
1abc0 73 65 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68  se is NULL if th
1abd0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
1abe0 71 75 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73  qualifier is mis
1abf0 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73  sing - the.** us
1ac00 75 61 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68  ual case.  If th
1ac10 65 20 74 65 72 6d 20 68 61 73 20 61 20 61 6c 69  e term has a ali
1ac20 61 73 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20  as, then pAlias 
1ac30 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
1ac40 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49   alias token.  I
1ac50 66 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20  f the term is a 
1ac60 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70  subquery, then p
1ac70 53 75 62 71 75 65 72 79 20 69 73 20 74 68 65 0a  Subquery is the.
1ac80 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
1ac90 65 6e 74 20 74 68 61 74 20 74 68 65 20 73 75 62  ent that the sub
1aca0 71 75 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20  query encodes.  
1acb0 54 68 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a  The pTable and.*
1acc0 2a 20 70 44 61 74 61 62 61 73 65 20 70 61 72 61  * pDatabase para
1acd0 6d 65 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20  meters are NULL 
1ace0 66 6f 72 20 73 75 62 71 75 65 72 69 65 73 2e 20  for subqueries. 
1acf0 20 54 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73   The pOn and pUs
1ad00 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ing.** parameter
1ad10 73 20 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  s are the conten
1ad20 74 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20  t of the ON and 
1ad30 55 53 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a  USING clauses..*
1ad40 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65  *.** Return a ne
1ad50 77 20 53 72 63 4c 69 73 74 20 77 68 69 63 68 20  w SrcList which 
1ad60 65 6e 63 6f 64 65 73 20 69 73 20 74 68 65 20 46  encodes is the F
1ad70 52 4f 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77  ROM with the new
1ad80 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a  .** term added..
1ad90 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
1ada0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1adb0 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73  FromTerm(.  Pars
1adc0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1add0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1ade0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
1adf0 69 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ist *p,         
1ae00 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20      /* The left 
1ae10 70 61 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  part of the FROM
1ae20 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20   clause already 
1ae30 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  seen */.  Token 
1ae40 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20  *pTable,        
1ae50 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1ae60 20 74 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f   table to add to
1ae70 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1ae80 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61   */.  Token *pDa
1ae90 74 61 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a  tabase,       /*
1aea0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
1aeb0 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
1aec0 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b   pTable */.  Tok
1aed0 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20  en *pAlias,     
1aee0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
1aef0 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
1af00 68 65 20 41 53 20 73 75 62 65 78 70 72 65 73 73  he AS subexpress
1af10 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
1af20 2a 70 53 75 62 71 75 65 72 79 2c 20 20 20 20 20  *pSubquery,     
1af30 20 2f 2a 20 41 20 73 75 62 71 75 65 72 79 20 75   /* A subquery u
1af40 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  sed in place of 
1af50 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  a table name */.
1af60 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20    Expr *pOn,    
1af70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1af80 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20   ON clause of a 
1af90 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74  join */.  IdList
1afa0 20 2a 70 55 73 69 6e 67 20 20 20 20 20 20 20 20   *pUsing        
1afb0 20 20 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63    /* The USING c
1afc0 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20  lause of a join 
1afd0 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  */.){.  struct S
1afe0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1aff0 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
1b000 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1b010 20 20 69 66 28 20 21 70 20 26 26 20 28 70 4f 6e    if( !p && (pOn
1b020 20 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b 0a 20   || pUsing) ){. 
1b030 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1b040 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 4a 4f  sg(pParse, "a JO
1b050 49 4e 20 63 6c 61 75 73 65 20 69 73 20 72 65 71  IN clause is req
1b060 75 69 72 65 64 20 62 65 66 6f 72 65 20 25 73 22  uired before %s"
1b070 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e 20 3f 20  , .      (pOn ? 
1b080 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22 29 0a  "ON" : "USING").
1b090 20 20 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20      );.    goto 
1b0a0 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f  append_from_erro
1b0b0 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c  r;.  }.  p = sql
1b0c0 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1b0d0 64 28 64 62 2c 20 70 2c 20 70 54 61 62 6c 65 2c  d(db, p, pTable,
1b0e0 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69   pDatabase);.  i
1b0f0 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52  f( p==0 || NEVER
1b100 28 70 2d 3e 6e 53 72 63 3d 3d 30 29 20 29 7b 0a  (p->nSrc==0) ){.
1b110 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f      goto append_
1b120 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  from_error;.  }.
1b130 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b    pItem = &p->a[
1b140 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 61 73  p->nSrc-1];.  as
1b150 73 65 72 74 28 20 70 41 6c 69 61 73 21 3d 30 20  sert( pAlias!=0 
1b160 29 3b 0a 20 20 69 66 28 20 70 41 6c 69 61 73 2d  );.  if( pAlias-
1b170 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d  >n ){.    pItem-
1b180 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65  >zAlias = sqlite
1b190 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1b1a0 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a  b, pAlias);.  }.
1b1b0 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74    pItem->pSelect
1b1c0 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20   = pSubquery;.  
1b1d0 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e  pItem->pOn = pOn
1b1e0 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e  ;.  pItem->pUsin
1b1f0 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65  g = pUsing;.  re
1b200 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65 6e 64  turn p;.. append
1b210 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 61  _from_error:.  a
1b220 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20  ssert( p==0 );. 
1b230 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1b240 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20 73  te(db, pOn);.  s
1b250 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1b260 74 65 28 64 62 2c 20 70 55 73 69 6e 67 29 3b 0a  te(db, pUsing);.
1b270 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1b280 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 71 75  elete(db, pSubqu
1b290 65 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ery);.  return 0
1b2a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
1b2b0 6e 20 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20  n INDEXED BY or 
1b2c0 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75  NOT INDEXED clau
1b2d0 73 65 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72  se to the most r
1b2e0 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 0a 2a  ecently added .*
1b2f0 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  * element of the
1b300 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 70 61 73   source-list pas
1b310 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
1b320 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76  d argument..*/.v
1b330 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
1b340 73 74 49 6e 64 65 78 65 64 42 79 28 50 61 72 73  stIndexedBy(Pars
1b350 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
1b360 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70 49  st *p, Token *pI
1b370 6e 64 65 78 65 64 42 79 29 7b 0a 20 20 61 73 73  ndexedBy){.  ass
1b380 65 72 74 28 20 70 49 6e 64 65 78 65 64 42 79 21  ert( pIndexedBy!
1b390 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26  =0 );.  if( p &&
1b3a0 20 41 4c 57 41 59 53 28 70 2d 3e 6e 53 72 63 3e   ALWAYS(p->nSrc>
1b3b0 30 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  0) ){.    struct
1b3c0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1b3d0 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e  Item = &p->a[p->
1b3e0 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73  nSrc-1];.    ass
1b3f0 65 72 74 28 20 70 49 74 65 6d 2d 3e 6e 6f 74 49  ert( pItem->notI
1b400 6e 64 65 78 65 64 3d 3d 30 20 26 26 20 70 49 74  ndexed==0 && pIt
1b410 65 6d 2d 3e 7a 49 6e 64 65 78 3d 3d 30 20 29 3b  em->zIndex==0 );
1b420 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 65  .    if( pIndexe
1b430 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49  dBy->n==1 && !pI
1b440 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20  ndexedBy->z ){. 
1b450 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49       /* A "NOT I
1b460 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65 20 77  NDEXED" clause w
1b470 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53 65 65  as supplied. See
1b480 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20 20 20   parse.y .      
1b490 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22 69 6e  ** construct "in
1b4a0 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72 20 64  dexed_opt" for d
1b4b0 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20  etails. */.     
1b4c0 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78   pItem->notIndex
1b4d0 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ed = 1;.    }els
1b4e0 65 7b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  e{.      pItem->
1b4f0 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  zIndex = sqlite3
1b500 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
1b510 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78  arse->db, pIndex
1b520 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  edBy);.    }.  }
1b530 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62  .}../*.** When b
1b540 75 69 6c 64 69 6e 67 20 75 70 20 61 20 46 52 4f  uilding up a FRO
1b550 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  M clause in the 
1b560 70 61 72 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e  parser, the join
1b570 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20   operator.** is 
1b580 69 6e 69 74 69 61 6c 6c 79 20 61 74 74 61 63 68  initially attach
1b590 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ed to the left o
1b5a0 70 65 72 61 6e 64 2e 20 20 42 75 74 20 74 68 65  perand.  But the
1b5b0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   code generator.
1b5c0 2a 2a 20 65 78 70 65 63 74 73 20 74 68 65 20 6a  ** expects the j
1b5d0 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  oin operator to 
1b5e0 62 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  be on the right 
1b5f0 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72  operand.  This r
1b600 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73  outine.** Shifts
1b610 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74   all join operat
1b620 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  ors from left to
1b630 20 72 69 67 68 74 20 66 6f 72 20 61 6e 20 65 6e   right for an en
1b640 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61  tire FROM.** cla
1b650 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  use..**.** Examp
1b660 6c 65 3a 20 53 75 70 70 6f 73 65 20 74 68 65 20  le: Suppose the 
1b670 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74 68 69  join is like thi
1b680 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
1b690 20 20 20 41 20 6e 61 74 75 72 61 6c 20 63 72 6f     A natural cro
1b6a0 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20  ss join B.**.** 
1b6b0 54 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20  The operator is 
1b6c0 22 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a  "natural cross j
1b6d0 6f 69 6e 22 2e 20 20 54 68 65 20 41 20 61 6e 64  oin".  The A and
1b6e0 20 42 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20   B operands are 
1b6f0 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e  stored.** in p->
1b700 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d  a[0] and p->a[1]
1b710 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  , respectively. 
1b720 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 69 74   The parser init
1b730 69 61 6c 6c 79 20 73 74 6f 72 65 73 20 74 68 65  ially stores the
1b740 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77 69 74  .** operator wit
1b750 68 20 41 2e 20 20 54 68 69 73 20 72 6f 75 74 69  h A.  This routi
1b760 6e 65 20 73 68 69 66 74 73 20 74 68 61 74 20 6f  ne shifts that o
1b770 70 65 72 61 74 6f 72 20 6f 76 65 72 20 74 6f 20  perator over to 
1b780 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  B..*/.void sqlit
1b790 65 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f  e3SrcListShiftJo
1b7a0 69 6e 54 79 70 65 28 53 72 63 4c 69 73 74 20 2a  inType(SrcList *
1b7b0 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
1b7c0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73     int i;.    as
1b7d0 73 65 72 74 28 20 70 2d 3e 61 20 7c 7c 20 70 2d  sert( p->a || p-
1b7e0 3e 6e 53 72 63 3d 3d 30 20 29 3b 0a 20 20 20 20  >nSrc==0 );.    
1b7f0 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b  for(i=p->nSrc-1;
1b800 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
1b810 20 20 70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e 74 79    p->a[i].jointy
1b820 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 6a  pe = p->a[i-1].j
1b830 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20  ointype;.    }. 
1b840 20 20 20 70 2d 3e 61 5b 30 5d 2e 6a 6f 69 6e 74     p->a[0].joint
1b850 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ype = 0;.  }.}..
1b860 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72  /*.** Begin a tr
1b870 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
1b880 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72  d sqlite3BeginTr
1b890 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
1b8a0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70  *pParse, int typ
1b8b0 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
1b8c0 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
1b8d0 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74  int i;..  assert
1b8e0 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20  ( pParse!=0 );. 
1b8f0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1b900 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
1b910 30 20 29 3b 0a 2f 2a 20 20 69 66 28 20 64 62 2d  0 );./*  if( db-
1b920 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[0].pBt==0 )
1b930 20 72 65 74 75 72 6e 3b 20 2a 2f 0a 20 20 69 66   return; */.  if
1b940 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1b950 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
1b960 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
1b970 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b  BEGIN", 0, 0) ){
1b980 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1b990 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1b9a0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1b9b0 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72 6e   if( !v ) return
1b9c0 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b  ;.  if( type!=TK
1b9d0 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20  _DEFERRED ){.   
1b9e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
1b9f0 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
1ba00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ba10 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  p2(v, OP_Transac
1ba20 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d  tion, i, (type==
1ba30 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29  TK_EXCLUSIVE)+1)
1ba40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1ba50 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
1ba60 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  i);.    }.  }.  
1ba70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ba80 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
1ba90 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  it, 0, 0);.}../*
1baa0 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61  .** Commit a tra
1bab0 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
1bac0 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72   sqlite3CommitTr
1bad0 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
1bae0 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65  *pParse){.  Vdbe
1baf0 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *v;..  assert( 
1bb00 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61  pParse!=0 );.  a
1bb10 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
1bb20 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71  b!=0 );.  if( sq
1bb30 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1bb40 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
1bb50 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d  ANSACTION, "COMM
1bb60 49 54 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  IT", 0, 0) ){.  
1bb70 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1bb80 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1bb90 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1bba0 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
1bbb0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1bbc0 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
1bbd0 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
1bbe0 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72  ** Rollback a tr
1bbf0 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
1bc00 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63  d sqlite3Rollbac
1bc10 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  kTransaction(Par
1bc20 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
1bc30 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72  dbe *v;..  asser
1bc40 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
1bc50 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1bc60 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ->db!=0 );.  if(
1bc70 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1bc80 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1bc90 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52  _TRANSACTION, "R
1bca0 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20  OLLBACK", 0, 0) 
1bcb0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
1bcc0 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
1bcd0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1bce0 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
1bcf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bd00 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
1bd10 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d  it, 1, 1);.  }.}
1bd20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1bd30 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1bd40 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
1bd50 65 6e 20 69 74 20 70 61 72 73 65 73 20 61 20 63  en it parses a c
1bd60 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65 61 74 65  ommand to create
1bd70 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72 20  ,.** release or 
1bd80 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c 20  rollback an SQL 
1bd90 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76  savepoint. .*/.v
1bda0 6f 69 64 20 73 71 6c 69 74 65 33 53 61 76 65 70  oid sqlite3Savep
1bdb0 6f 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61 72  oint(Parse *pPar
1bdc0 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b 65  se, int op, Toke
1bdd0 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61  n *pName){.  cha
1bde0 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
1bdf0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1be00 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
1be10 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  e);.  if( zName 
1be20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
1be30 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1be40 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66  pParse);.#ifndef
1be50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1be60 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 73  HORIZATION.    s
1be70 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1be80 20 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20   * const az[] = 
1be90 7b 20 22 42 45 47 49 4e 22 2c 20 22 52 45 4c 45  { "BEGIN", "RELE
1bea0 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43 4b 22  ASE", "ROLLBACK"
1beb0 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   };.    assert( 
1bec0 21 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e  !SAVEPOINT_BEGIN
1bed0 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   && SAVEPOINT_RE
1bee0 4c 45 41 53 45 3d 3d 31 20 26 26 20 53 41 56 45  LEASE==1 && SAVE
1bef0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d  POINT_ROLLBACK==
1bf00 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  2 );.#endif.    
1bf10 69 66 28 20 21 76 20 7c 7c 20 73 71 6c 69 74 65  if( !v || sqlite
1bf20 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1bf30 65 2c 20 53 51 4c 49 54 45 5f 53 41 56 45 50 4f  e, SQLITE_SAVEPO
1bf40 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61  INT, az[op], zNa
1bf50 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  me, 0) ){.      
1bf60 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
1bf70 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29  arse->db, zName)
1bf80 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
1bf90 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1bfa0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1bfb0 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f 70 2c  P_Savepoint, op,
1bfc0 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 50 34   0, 0, zName, P4
1bfd0 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d  _DYNAMIC);.  }.}
1bfe0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
1bff0 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62  e the TEMP datab
1c000 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  ase is open and 
1c010 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
1c020 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68  e.  Return.** th
1c030 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
1c040 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20 65  rs.  Leave any e
1c050 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e  rror messages in
1c060 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
1c070 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cture..*/.int sq
1c080 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74  lite3OpenTempDat
1c090 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50 61  abase(Parse *pPa
1c0a0 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  rse){.  sqlite3 
1c0b0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1c0c0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  ;.  if( db->aDb[
1c0d0 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50  1].pBt==0 && !pP
1c0e0 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
1c0f0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1c100 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 20   Btree *pBt;.   
1c110 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e   static const in
1c120 74 20 66 6c 61 67 73 20 3d 20 0a 20 20 20 20 20  t flags = .     
1c130 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1c140 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20 20  _READWRITE |.   
1c150 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1c160 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
1c170 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1c180 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20  N_EXCLUSIVE |.  
1c190 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1c1a0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
1c1b0 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
1c1c0 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
1c1d0 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  B;..    rc = sql
1c1e0 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62  ite3BtreeOpen(db
1c1f0 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c 20 26  ->pVfs, 0, db, &
1c200 70 42 74 2c 20 30 2c 20 66 6c 61 67 73 29 3b 0a  pBt, 0, flags);.
1c210 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c220 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
1c230 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1c240 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
1c250 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
1c260 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20  ry database ".  
1c270 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20        "file for 
1c280 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72  storing temporar
1c290 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20  y tables");.    
1c2a0 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72    pParse->rc = r
1c2b0 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  c;.      return 
1c2c0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  1;.    }.    db-
1c2d0 3e 61 44 62 5b 31 5d 2e 70 42 74 20 3d 20 70 42  >aDb[1].pBt = pB
1c2e0 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  t;.    assert( d
1c2f0 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
1c300 61 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  a );.    if( SQL
1c310 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74  ITE_NOMEM==sqlit
1c320 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
1c330 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78 74  ze(pBt, db->next
1c340 50 61 67 65 73 69 7a 65 2c 20 2d 31 2c 20 30 29  Pagesize, -1, 0)
1c350 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61   ){.      db->ma
1c360 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
1c370 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1c380 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1c390 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
1c3a0 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
1c3b0 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69  e that will veri
1c3c0 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  fy the schema co
1c3d0 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a 2a  okie and start.*
1c3e0 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  * a read-transac
1c3f0 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d  tion for all nam
1c400 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
1c410 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  s..**.** It is i
1c420 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c  mportant that al
1c430 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73  l schema cookies
1c440 20 62 65 20 76 65 72 69 66 69 65 64 20 61 6e 64   be verified and
1c450 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61   all.** read tra
1c460 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74 61  nsactions be sta
1c470 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79 74  rted before anyt
1c480 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65 6e  hing else happen
1c490 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45  s in.** the VDBE
1c4a0 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20 74   program.  But t
1c4b0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
1c4c0 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
1c4d0 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f  much other.** co
1c4e0 64 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e 65  de has been gene
1c4f0 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65 20  rated.  So here 
1c500 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a  is what we do:.*
1c510 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
1c520 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
1c530 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 63   is called, we c
1c540 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 74  ode an OP_Goto t
1c550 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70  hat.** will jump
1c560 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65   to a subroutine
1c570 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
1c580 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68 65  he program.  The
1c590 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65  n we.** record e
1c5a0 76 65 72 79 20 64 61 74 61 62 61 73 65 20 74 68  very database th
1c5b0 61 74 20 6e 65 65 64 73 20 69 74 73 20 73 63 68  at needs its sch
1c5c0 65 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e 20  ema verified in 
1c5d0 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63  the.** pParse->c
1c5e0 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e  ookieMask field.
1c5f0 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20 61    Later, after a
1c600 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61  ll other code ha
1c610 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61  s been.** genera
1c620 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ted, the subrout
1c630 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74 68  ine that does th
1c640 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63  e cookie verific
1c650 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74  ations and.** st
1c660 61 72 74 73 20 74 68 65 20 74 72 61 6e 73 61 63  arts the transac
1c670 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f  tions will be co
1c680 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f 47  ded and the OP_G
1c690 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20  oto P2 value.** 
1c6a0 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20  will be made to 
1c6b0 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73 75  point to that su
1c6c0 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 67  broutine.  The g
1c6d0 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  eneration of the
1c6e0 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  .** cookie verif
1c6f0 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74 69  ication subrouti
1c700 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73 20  ne code happens 
1c710 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  in sqlite3Finish
1c720 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20  Coding()..**.** 
1c730 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63 6f  If iDb<0 then co
1c740 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 6f  de the OP_Goto o
1c750 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74 20  nly - don't set 
1c760 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20 74  flag to verify t
1c770 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e 20  he.** schema on 
1c780 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20 20  any databases.  
1c790 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
1c7a0 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68 65   to position the
1c7b0 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c   OP_Goto.** earl
1c7c0 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20 62  y in the code, b
1c7d0 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69 66  efore we know if
1c7e0 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 74 61   any database ta
1c7f0 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65  bles will be use
1c800 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1c810 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
1c820 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
1c830 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61  , int iDb){.  Pa
1c840 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
1c850 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
1c860 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a  level(pParse);..
1c870 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c880 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 69 66  MIT_TRIGGER.  if
1c890 28 20 70 54 6f 70 6c 65 76 65 6c 21 3d 70 50 61  ( pToplevel!=pPa
1c8a0 72 73 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  rse ){.    /* Th
1c8b0 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
1c8c0 65 6e 20 69 66 20 61 20 74 72 69 67 67 65 72 20  en if a trigger 
1c8d0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  is currently bei
1c8e0 6e 67 20 63 6f 64 65 64 2e 20 49 6e 20 74 68 69  ng coded. In thi
1c8f0 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 73  s.    ** case, s
1c900 65 74 20 63 6f 6f 6b 69 65 47 6f 74 6f 20 74 6f  et cookieGoto to
1c910 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
1c920 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74  e to show that t
1c930 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20  his function.   
1c940 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 61 6c   ** has been cal
1c950 6c 65 64 2e 20 54 68 69 73 20 69 73 20 75 73 65  led. This is use
1c960 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
1c970 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74  ExprCodeConstant
1c980 73 28 29 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74  s().    ** funct
1c990 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72  ion. */.    pPar
1c9a0 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d  se->cookieGoto =
1c9b0 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   -1;.  }.#endif.
1c9c0 20 20 69 66 28 20 70 54 6f 70 6c 65 76 65 6c 2d    if( pToplevel-
1c9d0 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20 29  >cookieGoto==0 )
1c9e0 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
1c9f0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1ca00 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 69  Toplevel);.    i
1ca10 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
1ca20 3b 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20  ;  /* This only 
1ca30 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 72 65  happens if there
1ca40 20 77 61 73 20 61 20 70 72 69 6f 72 20 65 72 72   was a prior err
1ca50 6f 72 20 2a 2f 0a 20 20 20 20 70 54 6f 70 6c 65  or */.    pTople
1ca60 76 65 6c 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20  vel->cookieGoto 
1ca70 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1ca80 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1ca90 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a 20 20 69  0, 0)+1;.  }.  i
1caa0 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20  f( iDb>=0 ){.   
1cab0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1cac0 54 6f 70 6c 65 76 65 6c 2d 3e 64 62 3b 0a 20 20  Toplevel->db;.  
1cad0 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a    yDbMask mask;.
1cae0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62  .    assert( iDb
1caf0 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  <db->nDb );.    
1cb00 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
1cb10 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69  iDb].pBt!=0 || i
1cb20 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  Db==1 );.    ass
1cb30 65 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f  ert( iDb<SQLITE_
1cb40 4d 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29  MAX_ATTACHED+2 )
1cb50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
1cb60 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
1cb70 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
1cb80 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28   );.    mask = (
1cb90 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 44 62  (yDbMask)1)<<iDb
1cba0 3b 0a 20 20 20 20 69 66 28 20 28 70 54 6f 70 6c  ;.    if( (pTopl
1cbb0 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  evel->cookieMask
1cbc0 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20   & mask)==0 ){. 
1cbd0 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e       pToplevel->
1cbe0 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d 61  cookieMask |= ma
1cbf0 73 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65  sk;.      pTople
1cc00 76 65 6c 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65  vel->cookieValue
1cc10 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b  [iDb] = db->aDb[
1cc20 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63  iDb].pSchema->sc
1cc30 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20  hema_cookie;.   
1cc40 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
1cc50 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
1cc60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1cc70 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
1cc80 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20  (pToplevel);.   
1cc90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
1cca0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ../*.** If argum
1ccb0 65 6e 74 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c  ent zDb is NULL,
1ccc0 20 74 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74   then call sqlit
1ccd0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
1cce0 6d 61 28 29 20 66 6f 72 20 65 61 63 68 20 0a 2a  ma() for each .*
1ccf0 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  * attached datab
1cd00 61 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ase. Otherwise, 
1cd10 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72 20 74 68  invoke it for th
1cd20 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64  e database named
1cd30 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f   zDb only..*/.vo
1cd40 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  id sqlite3CodeVe
1cd50 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28  rifyNamedSchema(
1cd60 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
1cd70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b  onst char *zDb){
1cd80 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1cd90 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1cda0 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
1cdb0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
1cdc0 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20  {.    Db *pDb = 
1cdd0 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
1cde0 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 26 26   if( pDb->pBt &&
1cdf0 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d 73 71 6c   (!zDb || 0==sql
1ce00 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
1ce10 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 29 20 29 7b   pDb->zName)) ){
1ce20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
1ce30 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
1ce40 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d  Parse, i);.    }
1ce50 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1ce60 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
1ce70 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20 66   that prepares f
1ce80 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72  or doing an oper
1ce90 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69  ation that.** mi
1cea0 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64  ght change the d
1ceb0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
1cec0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72  his routine star
1ced0 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  ts a new transac
1cee0 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e  tion if we are n
1cef0 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  ot already withi
1cf00 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  n.** a transacti
1cf10 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20 61  on.  If we are a
1cf20 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 61 20  lready within a 
1cf30 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
1cf40 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a  n a checkpoint.*
1cf50 2a 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20  * is set if the 
1cf60 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72  setStatement par
1cf70 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e 20  ameter is true. 
1cf80 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68   A checkpoint sh
1cf90 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66  ould.** be set f
1cfa0 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68  or operations th
1cfb0 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64  at might fail (d
1cfc0 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69  ue to a constrai
1cfd0 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74  nt) part of.** t
1cfe0 68 65 20 77 61 79 20 74 68 72 6f 75 67 68 20 61  he way through a
1cff0 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65  nd which will ne
1d000 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20  ed to undo some 
1d010 77 72 69 74 65 73 20 77 69 74 68 6f 75 74 20 68  writes without h
1d020 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c  aving to.** roll
1d030 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74  back the whole t
1d040 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72  ransaction.  For
1d050 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72   operations wher
1d060 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  e all constraint
1d070 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63  s.** can be chec
1d080 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63  ked before any c
1d090 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
1d0a0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  to the database,
1d0b0 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20   it is never.** 
1d0c0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64  necessary to und
1d0d0 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20 74 68  o a write and th
1d0e0 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f  e checkpoint sho
1d0f0 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a  uld not be set..
1d100 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
1d110 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
1d120 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
1d130 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65  , int setStateme
1d140 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  nt, int iDb){.  
1d150 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
1d160 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
1d170 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
1d180 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  .  sqlite3CodeVe
1d190 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
1d1a0 65 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c  e, iDb);.  pTopl
1d1b0 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 20  evel->writeMask 
1d1c0 7c 3d 20 28 28 79 44 62 4d 61 73 6b 29 31 29 3c  |= ((yDbMask)1)<
1d1d0 3c 69 44 62 3b 0a 20 20 70 54 6f 70 6c 65 76 65  <iDb;.  pTopleve
1d1e0 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  l->isMultiWrite 
1d1f0 7c 3d 20 73 65 74 53 74 61 74 65 6d 65 6e 74 3b  |= setStatement;
1d200 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
1d210 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74  te that the stat
1d220 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20  ement currently 
1d230 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1d240 6f 6e 20 6d 69 67 68 74 20 77 72 69 74 65 0a 2a  on might write.*
1d250 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  * more than one 
1d260 65 6e 74 72 79 20 28 65 78 61 6d 70 6c 65 3a 20  entry (example: 
1d270 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f 77  deleting one row
1d280 20 74 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20   then inserting 
1d290 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73 65  another,.** inse
1d2a0 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 72  rting multiple r
1d2b0 6f 77 73 20 69 6e 20 61 20 74 61 62 6c 65 2c 20  ows in a table, 
1d2c0 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 61 20 72  or inserting a r
1d2d0 6f 77 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74  ow and index ent
1d2e0 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e 20  ries.).** If an 
1d2f0 61 62 6f 72 74 20 6f 63 63 75 72 73 20 61 66 74  abort occurs aft
1d300 65 72 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65  er some of these
1d310 20 77 72 69 74 65 73 20 68 61 76 65 20 63 6f 6d   writes have com
1d320 70 6c 65 74 65 64 2c 20 74 68 65 6e 20 69 74 20  pleted, then it 
1d330 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65 73  will.** be neces
1d340 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 74 68 65  sary to undo the
1d350 20 63 6f 6d 70 6c 65 74 65 64 20 77 72 69 74 65   completed write
1d360 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1d370 65 33 4d 75 6c 74 69 57 72 69 74 65 28 50 61 72  e3MultiWrite(Par
1d380 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50  se *pParse){.  P
1d390 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
1d3a0 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
1d3b0 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
1d3c0 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d    pToplevel->isM
1d3d0 75 6c 74 69 57 72 69 74 65 20 3d 20 31 3b 0a 7d  ultiWrite = 1;.}
1d3e0 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 64  ../* .** The cod
1d3f0 65 20 67 65 6e 65 72 61 74 6f 72 20 63 61 6c 6c  e generator call
1d400 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  s this routine i
1d410 66 20 69 73 20 64 69 73 63 6f 76 65 72 73 20 74  f is discovers t
1d420 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73  hat it is.** pos
1d430 73 69 62 6c 65 20 74 6f 20 61 62 6f 72 74 20 61  sible to abort a
1d440 20 73 74 61 74 65 6d 65 6e 74 20 70 72 69 6f 72   statement prior
1d450 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20   to completion. 
1d460 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a   In order to .**
1d470 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 61 62   perform this ab
1d480 6f 72 74 20 77 69 74 68 6f 75 74 20 63 6f 72 72  ort without corr
1d490 75 70 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  upting the datab
1d4a0 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ase, we need to 
1d4b0 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68 61  make.** sure tha
1d4c0 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
1d4d0 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20  is protected by 
1d4e0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
1d4f0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  saction..**.** T
1d500 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6f  echnically, we o
1d510 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 65 74 20  nly need to set 
1d520 74 68 65 20 6d 61 79 41 62 6f 72 74 20 66 6c 61  the mayAbort fla
1d530 67 20 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d 75  g if the.** isMu
1d540 6c 74 69 57 72 69 74 65 20 66 6c 61 67 20 77 61  ltiWrite flag wa
1d550 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74  s previously set
1d560 2e 20 20 54 68 65 72 65 20 69 73 20 61 20 74 69  .  There is a ti
1d570 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a  me dependency.**
1d580 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 61   such that the a
1d590 62 6f 72 74 20 6d 75 73 74 20 6f 63 63 75 72 20  bort must occur 
1d5a0 61 66 74 65 72 20 74 68 65 20 6d 75 6c 74 69 77  after the multiw
1d5b0 72 69 74 65 2e 20 20 54 68 69 73 20 6d 61 6b 65  rite.  This make
1d5c0 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65 6d  s.** some statem
1d5d0 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 74  ents involving t
1d5e0 68 65 20 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c  he REPLACE confl
1d5f0 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
1d600 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20 61  lgorithm.** go a
1d610 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72 2e 20   little faster. 
1d620 20 42 75 74 20 74 61 6b 69 6e 67 20 61 64 76 61   But taking adva
1d630 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20 74 69  ntage of this ti
1d640 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a  me dependency.**
1d650 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65 20 64   makes it more d
1d660 69 66 66 69 63 75 6c 74 20 74 6f 20 70 72 6f 76  ifficult to prov
1d670 65 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  e that the code 
1d680 69 73 20 63 6f 72 72 65 63 74 20 28 69 6e 20 0a  is correct (in .
1d690 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 2c 20 69  ** particular, i
1d6a0 74 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72  t prevents us fr
1d6b0 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e 20 65 66  om writing an ef
1d6c0 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c 65  fective.** imple
1d6d0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c  mentation of sql
1d6e0 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
1d6f0 72 74 28 29 29 20 61 6e 64 20 73 6f 20 77 65 20  rt()) and so we 
1d700 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20 74  have chosen.** t
1d710 6f 20 74 61 6b 65 20 74 68 65 20 73 61 66 65 20  o take the safe 
1d720 72 6f 75 74 65 20 61 6e 64 20 73 6b 69 70 20 74  route and skip t
1d730 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  he optimization.
1d740 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1d750 4d 61 79 41 62 6f 72 74 28 50 61 72 73 65 20 2a  MayAbort(Parse *
1d760 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65  pParse){.  Parse
1d770 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
1d780 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
1d790 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54  el(pParse);.  pT
1d7a0 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72  oplevel->mayAbor
1d7b0 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 1;.}../*.** 
1d7c0 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20  Code an OP_Halt 
1d7d0 74 68 61 74 20 63 61 75 73 65 73 20 74 68 65 20  that causes the 
1d7e0 76 64 62 65 20 74 6f 20 72 65 74 75 72 6e 20 61  vdbe to return a
1d7f0 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
1d800 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68  INT.** error. Th
1d810 65 20 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65  e onError parame
1d820 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ter determines w
1d830 68 69 63 68 20 28 69 66 20 61 6e 79 29 20 6f 66  hich (if any) of
1d840 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
1d850 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74  * and/or current
1d860 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1d870 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
1d880 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61 6c 74  void sqlite3Halt
1d890 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61  Constraint(.  Pa
1d8a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1d8b0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1d8c0 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43  xt */.  int errC
1d8d0 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20 65 78 74  ode,      /* ext
1d8e0 65 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64 65  ended error code
1d8f0 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
1d900 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74  r,      /* Const
1d910 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20  raint type */.  
1d920 63 68 61 72 20 2a 70 34 2c 20 20 20 20 20 20 20  char *p4,       
1d930 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61    /* Error messa
1d940 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79  ge */.  int p4ty
1d950 70 65 20 20 20 20 20 20 20 20 2f 2a 20 50 34 5f  pe        /* P4_
1d960 53 54 41 54 49 43 20 6f 72 20 50 34 5f 54 52 41  STATIC or P4_TRA
1d970 4e 53 49 45 4e 54 20 2a 2f 0a 29 7b 0a 20 20 56  NSIENT */.){.  V
1d980 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
1d990 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1d9a0 0a 20 20 61 73 73 65 72 74 28 20 28 65 72 72 43  .  assert( (errC
1d9b0 6f 64 65 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  ode&0xff)==SQLIT
1d9c0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a  E_CONSTRAINT );.
1d9d0 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f    if( onError==O
1d9e0 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 73  E_Abort ){.    s
1d9f0 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
1da00 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Parse);.  }.  sq
1da10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1da20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 65 72 72 43  v, OP_Halt, errC
1da30 6f 64 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c  ode, onError, 0,
1da40 20 70 34 2c 20 70 34 74 79 70 65 29 3b 0a 7d 0a   p4, p4type);.}.
1da50 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
1da60 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73  see if pIndex us
1da70 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  es the collating
1da80 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
1da90 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
1daa0 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20   if it does and 
1dab0 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73  false if it does
1dac0 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   not..*/.#ifndef
1dad0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
1dae0 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20  NDEX.static int 
1daf0 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63  collationMatch(c
1db00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
1db10 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29  , Index *pIndex)
1db20 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
1db30 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b  ert( zColl!=0 );
1db40 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
1db50 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  ndex->nColumn; i
1db60 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
1db70 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d  har *z = pIndex-
1db80 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >azColl[i];.    
1db90 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
1dba0 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
1dbb0 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f  e3StrICmp(z, zCo
1dbc0 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ll) ){.      ret
1dbd0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1dbe0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
1dbf0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  endif../*.** Rec
1dc00 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
1dc10 65 73 20 6f 66 20 70 54 61 62 20 74 68 61 74 20  es of pTab that 
1dc20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
1dc30 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
1dc40 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ..** If pColl==0
1dc50 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20   then recompute 
1dc60 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70  all indices of p
1dc70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  Tab..*/.#ifndef 
1dc80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
1dc90 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEX.static void 
1dca0 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72  reindexTable(Par
1dcb0 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
1dcc0 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f  e *pTab, char co
1dcd0 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49  nst *zColl){.  I
1dce0 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
1dcf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
1dd00 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
1dd10 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a  d with pTab */..
1dd20 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61    for(pIndex=pTa
1dd30 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  b->pIndex; pInde
1dd40 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78  x; pIndex=pIndex
1dd50 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
1dd60 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f  ( zColl==0 || co
1dd70 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f  llationMatch(zCo
1dd80 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20  ll, pIndex) ){. 
1dd90 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
1dda0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
1ddb0 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
1ddc0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
1ddd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
1dde0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
1ddf0 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
1de00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
1de10 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
1de20 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a  e, pIndex, -1);.
1de30 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
1de40 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70  if../*.** Recomp
1de50 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
1de60 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  of all tables in
1de70 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77   all databases w
1de80 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69  here the.** indi
1de90 63 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  ces use the coll
1dea0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
1deb0 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d  Coll.  If pColl=
1dec0 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74  =0 then recomput
1ded0 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73  e.** all indices
1dee0 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a   everywhere..*/.
1def0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1df00 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
1df10 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44  ic void reindexD
1df20 61 74 61 62 61 73 65 73 28 50 61 72 73 65 20 2a  atabases(Parse *
1df30 70 50 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e  pParse, char con
1df40 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62  st *zColl){.  Db
1df50 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
1df60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
1df70 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a  ingle database *
1df80 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
1df90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfa0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1dfb0 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  index number */.
1dfc0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1dfd0 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
1dfe0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
1dff0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61  nnection */.  Ha
1e000 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20  shElem *k;      
1e010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
1e020 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61   looping over ta
1e030 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20  bles in pDb */. 
1e040 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
1e050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e060 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  A table in the d
1e070 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73  atabase */..  as
1e080 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
1e090 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65  eeHoldsAllMutexe
1e0a0 73 28 64 62 29 20 29 3b 20 20 2f 2a 20 4e 65 65  s(db) );  /* Nee
1e0b0 64 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61  ded for schema a
1e0c0 63 63 65 73 73 20 2a 2f 0a 20 20 66 6f 72 28 69  ccess */.  for(i
1e0d0 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44  Db=0, pDb=db->aD
1e0e0 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  b; iDb<db->nDb; 
1e0f0 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20  iDb++, pDb++){. 
1e100 20 20 20 61 73 73 65 72 74 28 20 70 44 62 21 3d     assert( pDb!=
1e110 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73  0 );.    for(k=s
1e120 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
1e130 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
1e140 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71  lHash);  k; k=sq
1e150 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29  liteHashNext(k))
1e160 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 28  {.      pTab = (
1e170 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73  Table*)sqliteHas
1e180 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20  hData(k);.      
1e190 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61  reindexTable(pPa
1e1a0 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c  rse, pTab, zColl
1e1b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
1e1c0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  endif../*.** Gen
1e1d0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
1e1e0 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61  he REINDEX comma
1e1f0 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  nd..**.**       
1e200 20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20   REINDEX        
1e210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e220 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20      -- 1.**     
1e230 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c     REINDEX  <col
1e240 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20  lation>         
1e250 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20        -- 2.**   
1e260 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c       REINDEX  ?<
1e270 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c  database>.?<tabl
1e280 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20  ename>  -- 3.** 
1e290 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
1e2a0 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e  ?<database>.?<in
1e2b0 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a  dexname>  -- 4.*
1e2c0 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73  *.** Form 1 caus
1e2d0 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69  es all indices i
1e2e0 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  n all attached d
1e2f0 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20 72  atabases to be r
1e300 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20  ebuilt..** Form 
1e310 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69  2 rebuilds all i
1e320 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61  ndices in all da
1e330 74 61 62 61 73 65 73 20 74 68 61 74 20 75 73 65  tabases that use
1e340 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f   the named.** co
1e350 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
1e360 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34  .  Forms 3 and 4
1e370 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d   rebuild the nam
1e380 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a  ed index or all.
1e390 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63  ** indices assoc
1e3a0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  iated with the n
1e3b0 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23  amed table..*/.#
1e3c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e3d0 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20  IT_REINDEX.void 
1e3e0 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50  sqlite3Reindex(P
1e3f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
1e400 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b  ken *pName1, Tok
1e410 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43  en *pName2){.  C
1e420 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
1e430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1e440 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1e450 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
1e460 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  , or NULL */.  c
1e470 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20  har *z;         
1e480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
1e490 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  me of a table or
1e4a0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73   index */.  cons
1e4b0 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20  t char *zDb;    
1e4c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1e4d0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1e4e0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
1e4f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e500 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74   /* A table in t
1e510 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
1e520 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
1e530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e540 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  An index associa
1e550 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f  ted with pTab */
1e560 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
1e570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e580 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69  * The database i
1e590 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
1e5a0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1e5b0 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20  Parse->db;   /* 
1e5c0 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
1e5d0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b  nection */.  Tok
1e5e0 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20  en *pObjName;   
1e5f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1e600 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
1e610 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69   index to be rei
1e620 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  ndexed */..  /* 
1e630 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  Read the databas
1e640 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20  e schema. If an 
1e650 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65  error occurs, le
1e660 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
1e670 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f  sage.  ** and co
1e680 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  de in pParse and
1e690 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f   return NULL. */
1e6a0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
1e6b0 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
1e6c0 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
1e6d0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
1e6e0 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20    if( pName1==0 
1e6f0 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61  ){.    reindexDa
1e700 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20  tabases(pParse, 
1e710 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  0);.    return;.
1e720 20 20 7d 65 6c 73 65 20 69 66 28 20 4e 45 56 45    }else if( NEVE
1e730 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20  R(pName2==0) || 
1e740 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a  pName2->z==0 ){.
1e750 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b      char *zColl;
1e760 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
1e770 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43  me1->z );.    zC
1e780 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  oll = sqlite3Nam
1e790 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
1e7a0 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a  e->db, pName1);.
1e7b0 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29      if( !zColl )
1e7c0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f   return;.    pCo
1e7d0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
1e7e0 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28  CollSeq(db, ENC(
1e7f0 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a  db), zColl, 0);.
1e800 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
1e810 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 44 61  .      reindexDa
1e820 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20  tabases(pParse, 
1e830 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  zColl);.      sq
1e840 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1e850 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65  zColl);.      re
1e860 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
1e870 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1e880 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20  , zColl);.  }.  
1e890 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
1e8a0 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
1e8b0 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
1e8c0 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69   &pObjName);.  i
1e8d0 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
1e8e0 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  n;.  z = sqlite3
1e8f0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1e900 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69  , pObjName);.  i
1e910 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
1e920 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  zDb = db->aD
1e930 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
1e940 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69  pTab = sqlite3Fi
1e950 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a  ndTable(db, z, z
1e960 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20  Db);.  if( pTab 
1e970 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61  ){.    reindexTa
1e980 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
1e990 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1e9a0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
1e9b0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1e9c0 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
1e9d0 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
1e9e0 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74  z, zDb);.  sqlit
1e9f0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
1ea00 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b  .  if( pIndex ){
1ea10 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
1ea20 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
1ea30 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
1ea40 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69  .    sqlite3Refi
1ea50 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
1ea60 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20  pIndex, -1);.   
1ea70 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
1ea80 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1ea90 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
1eaa0 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f  o identify the o
1eab0 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e  bject to be rein
1eac0 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69  dexed");.}.#endi
1ead0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
1eae0 61 20 64 79 6e 61 6d 69 63 6c 79 20 61 6c 6c 6f  a dynamicly allo
1eaf0 63 61 74 65 64 20 4b 65 79 49 6e 66 6f 20 73 74  cated KeyInfo st
1eb00 72 75 63 74 75 72 65 20 74 68 61 74 20 63 61 6e  ructure that can
1eb10 20 62 65 20 75 73 65 64 0a 2a 2a 20 77 69 74 68   be used.** with
1eb20 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 6f 72 20   OP_OpenRead or 
1eb30 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 74 6f 20  OP_OpenWrite to 
1eb40 61 63 63 65 73 73 20 64 61 74 61 62 61 73 65 20  access database 
1eb50 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a  index pIdx..**.*
1eb60 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
1eb70 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1eb80 65 20 6e 65 77 20 73 74 72 75 63 74 75 72 65 20  e new structure 
1eb90 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20  is returned. In 
1eba0 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 74 68 65  this case.** the
1ebb0 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
1ebc0 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69  nsible for calli
1ebd0 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
1ebe0 28 64 62 2c 20 29 20 6f 6e 20 74 68 65 20 72 65  (db, ) on the re
1ebf0 74 75 72 6e 65 64 20 0a 2a 2a 20 70 6f 69 6e 74  turned .** point
1ec00 65 72 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  er. If an error 
1ec10 6f 63 63 75 72 73 20 28 6f 75 74 20 6f 66 20 6d  occurs (out of m
1ec20 65 6d 6f 72 79 20 6f 72 20 6d 69 73 73 69 6e 67  emory or missing
1ec30 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 2a 2a 20 73   collation .** s
1ec40 65 71 75 65 6e 63 65 29 2c 20 4e 55 4c 4c 20 69  equence), NULL i
1ec50 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
1ec60 68 65 20 73 74 61 74 65 20 6f 66 20 70 50 61 72  he state of pPar
1ec70 73 65 20 75 70 64 61 74 65 64 20 74 6f 20 72 65  se updated to re
1ec80 66 6c 65 63 74 0a 2a 2a 20 74 68 65 20 65 72 72  flect.** the err
1ec90 6f 72 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a  or..*/.KeyInfo *
1eca0 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
1ecb0 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  nfo(Parse *pPars
1ecc0 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  e, Index *pIdx){
1ecd0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
1ece0 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f  nCol = pIdx->nCo
1ecf0 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 42 79 74  lumn;.  int nByt
1ed00 65 73 20 3d 20 73 69 7a 65 6f 66 28 4b 65 79 49  es = sizeof(KeyI
1ed10 6e 66 6f 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a  nfo) + (nCol-1)*
1ed20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
1ed30 20 2b 20 6e 43 6f 6c 3b 0a 20 20 73 71 6c 69 74   + nCol;.  sqlit
1ed40 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1ed50 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  >db;.  KeyInfo *
1ed60 70 4b 65 79 20 3d 20 28 4b 65 79 49 6e 66 6f 20  pKey = (KeyInfo 
1ed70 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
1ed80 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 73  cZero(db, nBytes
1ed90 29 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29  );..  if( pKey )
1eda0 7b 0a 20 20 20 20 70 4b 65 79 2d 3e 64 62 20 3d  {.    pKey->db =
1edb0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20   pParse->db;.   
1edc0 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65   pKey->aSortOrde
1edd0 72 20 3d 20 28 75 38 20 2a 29 26 28 70 4b 65 79  r = (u8 *)&(pKey
1ede0 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a  ->aColl[nCol]);.
1edf0 20 20 20 20 61 73 73 65 72 74 28 20 26 70 4b 65      assert( &pKe
1ee00 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43  y->aSortOrder[nC
1ee10 6f 6c 5d 3d 3d 26 28 28 28 75 38 20 2a 29 70 4b  ol]==&(((u8 *)pK
1ee20 65 79 29 5b 6e 42 79 74 65 73 5d 29 20 29 3b 0a  ey)[nBytes]) );.
1ee30 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1ee40 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
1ee50 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
1ee60 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  Idx->azColl[i];.
1ee70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 43        assert( zC
1ee80 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 4b 65  oll );.      pKe
1ee90 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71  y->aColl[i] = sq
1eea0 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
1eeb0 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  eq(pParse, zColl
1eec0 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61  );.      pKey->a
1eed0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70  SortOrder[i] = p
1eee0 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
1eef0 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b  i];.    }.    pK
1ef00 65 79 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31  ey->nField = (u1
1ef10 36 29 6e 43 6f 6c 3b 0a 20 20 7d 0a 0a 20 20 69  6)nCol;.  }..  i
1ef20 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
1ef30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
1ef40 46 72 65 65 28 64 62 2c 20 70 4b 65 79 29 3b 0a  Free(db, pKey);.
1ef50 20 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20      pKey = 0;.  
1ef60 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b  }.  return pKey;
1ef70 0a 7d 0a                                         .}.