/ Hex Artifact Content
Login

Artifact 95fd8aa1bf81acf15e9ef46b07d1f70111ea88d0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t.h"../*.** This
02f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
0300: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 53 51  ed when a new SQ
0310: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 62  L statement is b
0320: 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62  eginning to.** b
0330: 65 20 70 61 72 73 65 64 2e 20 20 49 6e 69 74 69  e parsed.  Initi
0340: 61 6c 69 7a 65 20 74 68 65 20 70 50 61 72 73 65  alize the pParse
0350: 20 73 74 72 75 63 74 75 72 65 20 61 73 20 6e 65   structure as ne
0360: 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eded..*/.void sq
0370: 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28  lite3BeginParse(
0380: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
0390: 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29 7b  nt explainFlag){
03a0: 0a 20 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  .  pParse->expla
03b0: 69 6e 20 3d 20 28 75 38 29 65 78 70 6c 61 69 6e  in = (u8)explain
03c0: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
03d0: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  nVar = 0;.}..#if
03e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
03f0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0400: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f 63  .** The TableLoc
0410: 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  k structure is o
0420: 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
0430: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0440: 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54 61  () and.** codeTa
0450: 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63 74  bleLocks() funct
0460: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ions..*/.struct 
0470: 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  TableLock {.  in
0480: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
0490: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
04a0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
04b0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f  e table to be lo
04c0: 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  cked */.  int iT
04d0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab;            /
04e0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
04f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0500: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
0510: 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20  8 isWriteLock;  
0520: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
0530: 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c  write lock.  Fal
0540: 73 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f  se for a read lo
0550: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
0560: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
0570: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
0580: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  e */.};../*.** R
0590: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
05a0: 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6c  hat we want to l
05b0: 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20 72  ock a table at r
05c0: 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a 2a  un-time.  .**.**
05d0: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   The table to be
05e0: 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f 74   locked has root
05f0: 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20 69   page iTab and i
0600: 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61 62  s found in datab
0610: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72 65  ase iDb..** A re
0620: 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c 6f  ad or a write lo
0630: 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e 20  ck can be taken 
0640: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73 57  depending on isW
0650: 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ritelock..**.** 
0660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
0670: 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66 61  t records the fa
0680: 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ct that the lock
0690: 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54 68   is desired.  Th
06a0: 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61 6b  e.** code to mak
06b0: 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72  e the lock occur
06c0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
06d0: 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74 6f   a later call to
06e0: 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  .** codeTableLoc
06f0: 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75 72  ks() which occur
0700: 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  s during sqlite3
0710: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
0720: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
0730: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72 73  ableLock(.  Pars
0740: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
0750: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0760: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
0770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0780: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
0790: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
07a0: 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 20  e table to lock 
07b0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
07c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
07d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
07e0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
07f0: 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 73  ocked */.  u8 is
0800: 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f 2a  WriteLock,    /*
0810: 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69 74   True for a writ
0820: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  e lock */.  cons
0830: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 2f  t char *zName  /
0840: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
0850: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
0860: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
0870: 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
0880: 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
0890: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
08a0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 3b  i;.  int nBytes;
08b0: 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b  .  TableLock *p;
08c0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
08d0: 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  0 );..  for(i=0;
08e0: 20 69 3c 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54   i<pToplevel->nT
08f0: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0900: 20 20 20 20 70 20 3d 20 26 70 54 6f 70 6c 65 76      p = &pToplev
0910: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69  el->aTableLock[i
0920: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44  ];.    if( p->iD
0930: 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e 69 54 61  b==iDb && p->iTa
0940: 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20 20 20 20  b==iTab ){.     
0950: 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20   p->isWriteLock 
0960: 3d 20 28 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63  = (p->isWriteLoc
0970: 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b  k || isWriteLock
0980: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
0990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42  .    }.  }..  nB
09a0: 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 54 61  ytes = sizeof(Ta
09b0: 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70 54 6f 70  bleLock) * (pTop
09c0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
09d0: 6b 2b 31 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  k+1);.  pTopleve
09e0: 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 0a  l->aTableLock =.
09f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
0a00: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 54 6f  eallocOrFree(pTo
0a10: 70 6c 65 76 65 6c 2d 3e 64 62 2c 20 70 54 6f 70  plevel->db, pTop
0a20: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
0a30: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a40: 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61  ( pToplevel->aTa
0a50: 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  bleLock ){.    p
0a60: 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61   = &pToplevel->a
0a70: 54 61 62 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c 65  TableLock[pTople
0a80: 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b  vel->nTableLock+
0a90: 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d  +];.    p->iDb =
0aa0: 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61   iDb;.    p->iTa
0ab0: 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d  b = iTab;.    p-
0ac0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69  >isWriteLock = i
0ad0: 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20  sWriteLock;.    
0ae0: 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  p->zName = zName
0af0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
0b00: 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65  Toplevel->nTable
0b10: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70 54  Lock = 0;.    pT
0b20: 6f 70 6c 65 76 65 6c 2d 3e 64 62 2d 3e 6d 61 6c  oplevel->db->mal
0b30: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
0b40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
0b50: 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b   an OP_TableLock
0b60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
0b70: 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b   each table lock
0b80: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61  ed by the.** sta
0b90: 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72  tement (configur
0ba0: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
0bb0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
0bc0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ))..*/.static vo
0bd0: 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  id codeTableLock
0be0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  s(Parse *pParse)
0bf0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0c00: 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56  e *pVdbe; ..  pV
0c10: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dbe = sqlite3Get
0c20: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0c30: 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30  assert( pVdbe!=0
0c40: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65   ); /* sqlite3Ge
0c50: 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69  tVdbe cannot fai
0c60: 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  l: VDBE already 
0c70: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
0c80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
0c90: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69  e->nTableLock; i
0ca0: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f  ++){.    TableLo
0cb0: 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  ck *p = &pParse-
0cc0: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
0cd0: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e      int p1 = p->
0ce0: 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
0cf0: 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65  VdbeAddOp4(pVdbe
0d00: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0d10: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0d20: 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20  isWriteLock,.   
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f     p->zName, P4_
0d50: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
0d60: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63  else.  #define c
0d70: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29  odeTableLocks(x)
0d80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0d90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0da0: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0db0: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0dc0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0dd0: 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45  arsed and a VDBE
0de0: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0df0: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
0e00: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0e10: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
0e20: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
0e30: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
0e40: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
0e50: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0e60: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0e70: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0e80: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0e90: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0ea0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0eb0: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0ec0: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0ed0: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0ee0: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0ef0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
0f00: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
0f10: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
0f20: 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
0f30: 20 2a 76 3b 0a 0a 20 20 64 62 20 3d 20 70 50 61   *v;..  db = pPa
0f40: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64  rse->db;.  if( d
0f50: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0f60: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
0f70: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29  pParse->nested )
0f80: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
0f90: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
0fa0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65 67 69  turn;..  /* Begi
0fb0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
0fc0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
0fd0: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
0fe0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
0ff0: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1000: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1010: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1020: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1030: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1040: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1050: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1060: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
1070: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
1080: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1090: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
10a0: 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  Halt);..    /* T
10b0: 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63  he cookie mask c
10c0: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69 74 20  ontains one bit 
10d0: 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73  for each databas
10e0: 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20  e file open..   
10f0: 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20 66 6f   ** (Bit 0 is fo
1100: 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20 69 73  r main, bit 1 is
1110: 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64 20 73   for temp, and s
1120: 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74 73 20  o forth.)  Bits 
1130: 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 66  are.    ** set f
1140: 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65  or each database
1150: 20 74 68 61 74 20 69 73 20 75 73 65 64 2e 20 20   that is used.  
1160: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1170: 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a 2a 20   start a.    ** 
1180: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65  transaction on e
1190: 61 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73  ach used databas
11a0: 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66 79 20  e and to verify 
11b0: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
11c0: 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68  e.    ** on each
11d0: 20 75 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a   used database..
11e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
11f0: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
1200: 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 79 44 62  o>0 ){.      yDb
1210: 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 20 20 20  Mask mask;.     
1220: 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20   int iDb;.      
1230: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1240: 65 72 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 63  ere(v, pParse->c
1250: 6f 6f 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a 20 20  ookieGoto-1);.  
1260: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 6d      for(iDb=0, m
1270: 61 73 6b 3d 31 3b 20 69 44 62 3c 64 62 2d 3e 6e  ask=1; iDb<db->n
1280: 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44  Db; mask<<=1, iD
1290: 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  b++){.        if
12a0: 28 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65  ( (mask & pParse
12b0: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30  ->cookieMask)==0
12c0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
12d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12e0: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
12f0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1300: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 4f  e3VdbeAddOp2(v,O
1310: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  P_Transaction, i
1320: 44 62 2c 20 28 6d 61 73 6b 20 26 20 70 50 61 72  Db, (mask & pPar
1330: 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d  se->writeMask)!=
1340: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
1350: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
1360: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
1370: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
1380: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
1390: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
13a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13b0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 56 65  eAddOp3(v, OP_Ve
13c0: 72 69 66 79 43 6f 6f 6b 69 65 2c 0a 20 20 20 20  rifyCookie,.    
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 20 20 69 44 62 2c 20 70 50 61          iDb, pPa
13f0: 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65  rse->cookieValue
1400: 5b 69 44 62 5d 2c 0a 20 20 20 20 20 20 20 20 20  [iDb],.         
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
1430: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
1440: 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  tion);.        }
1450: 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
1460: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1470: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
1480: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
1490: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
14a0: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61  ; i<pParse->nVta
14b0: 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  bLock; i++){.   
14c0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 76 74 61         char *vta
14d0: 62 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  b = (char *)sqli
14e0: 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c  te3GetVTable(db,
14f0: 20 70 50 61 72 73 65 2d 3e 61 70 56 74 61 62 4c   pParse->apVtabL
1500: 6f 63 6b 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ock[i]);.       
1510: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1520: 64 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp4(v, OP_VBegi
1530: 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74 61 62  n, 0, 0, 0, vtab
1540: 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
1550: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
1560: 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 20  arse->nVtabLock 
1570: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  = 0;.      }.#en
1580: 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  dif..      /* On
1590: 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69  ce all the cooki
15a0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72  es have been ver
15b0: 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61  ified and transa
15c0: 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a  ctions opened, .
15d0: 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20        ** obtain 
15e0: 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62  the required tab
15f0: 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69  le-locks. This i
1600: 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
1610: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73   the .      ** s
1620: 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74  hared-cache feat
1630: 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  ure is enabled..
1640: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
1650: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50  odeTableLocks(pP
1660: 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  arse);..      /*
1670: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20   Initialize any 
1680: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61  AUTOINCREMENT da
1690: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65  ta structures re
16a0: 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  quired..      */
16b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75  .      sqlite3Au
16c0: 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e  toincrementBegin
16d0: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20  (pParse);..     
16e0: 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a 75 6d   /* Finally, jum
16f0: 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65  p back to the be
1700: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 65  ginning of the e
1710: 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65 2e 20  xecutable code. 
1720: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1730: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1740: 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65  _Goto, 0, pParse
1750: 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29 3b 0a 20  ->cookieGoto);. 
1760: 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20     }.  }...  /* 
1770: 47 65 74 20 74 68 65 20 56 44 42 45 20 70 72 6f  Get the VDBE pro
1780: 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65  gram ready for e
1790: 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20  xecution.  */.  
17a0: 69 66 28 20 76 20 26 26 20 41 4c 57 41 59 53 28  if( v && ALWAYS(
17b0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 29  pParse->nErr==0)
17c0: 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
17d0: 61 69 6c 65 64 20 29 7b 0a 23 69 66 64 65 66 20  ailed ){.#ifdef 
17e0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
17f0: 20 46 49 4c 45 20 2a 74 72 61 63 65 20 3d 20 28   FILE *trace = (
1800: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1810: 54 45 5f 56 64 62 65 54 72 61 63 65 29 21 3d 30  TE_VdbeTrace)!=0
1820: 20 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20   ? stdout : 0;. 
1830: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72     sqlite3VdbeTr
1840: 61 63 65 28 76 2c 20 74 72 61 63 65 29 3b 0a 23  ace(v, trace);.#
1850: 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
1860: 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  ( pParse->iCache
1870: 4c 65 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20  Level==0 );  /* 
1880: 44 69 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d  Disables and re-
1890: 65 6e 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f  enables match */
18a0: 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75  .    /* A minimu
18b0: 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72 20  m of one cursor 
18c0: 69 73 20 72 65 71 75 69 72 65 64 20 69 66 20 61  is required if a
18d0: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73 20  utoincrement is 
18e0: 75 73 65 64 0a 20 20 20 20 2a 20 20 53 65 65 20  used.    *  See 
18f0: 74 69 63 6b 65 74 20 5b 61 36 39 36 33 37 39 63  ticket [a696379c
1900: 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20  1f08866] */.    
1910: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 41 69 6e  if( pParse->pAin
1920: 63 21 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e  c!=0 && pParse->
1930: 6e 54 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65  nTab==0 ) pParse
1940: 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20 20  ->nTab = 1;.    
1950: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
1960: 65 61 64 79 28 76 2c 20 70 50 61 72 73 65 29 3b  eady(v, pParse);
1970: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
1980: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1990: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61     pParse->colNa
19a0: 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65  mesSet = 0;.  }e
19b0: 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  lse{.    pParse-
19c0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  >rc = SQLITE_ERR
19d0: 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65  OR;.  }.  pParse
19e0: 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70 50  ->nTab = 0;.  pP
19f0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a  arse->nMem = 0;.
1a00: 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d    pParse->nSet =
1a10: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56   0;.  pParse->nV
1a20: 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ar = 0;.  pParse
1a30: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30  ->cookieMask = 0
1a40: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  ;.  pParse->cook
1a50: 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f  ieGoto = 0;.}../
1a60: 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70 61 72  *.** Run the par
1a70: 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ser and code gen
1a80: 65 72 61 74 6f 72 20 72 65 63 75 72 73 69 76 65  erator recursive
1a90: 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ly in order to g
1aa0: 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20  enerate.** code 
1ab0: 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74 61 74  for the SQL stat
1ac0: 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f  ement given onto
1ad0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1ae0: 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a  pParse context.*
1af0: 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  * currently unde
1b00: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
1b10: 20 57 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   When the parser
1b20: 20 69 73 20 72 75 6e 20 72 65 63 75 72 73 69 76   is run recursiv
1b30: 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c  ely.** this way,
1b40: 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61   the final OP_Ha
1b50: 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65 6e 64  lt is not append
1b60: 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69 6e 69  ed and other ini
1b70: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61  tialization.** a
1b80: 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  nd finalization 
1b90: 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74 74 65  steps are omitte
1ba0: 64 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20  d because those 
1bb0: 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62 79 20  are handling by 
1bc0: 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74  the.** outermost
1bd0: 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e   parser..**.** N
1be0: 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  ot everything is
1bf0: 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68 69 73   nestable.  This
1c00: 20 66 61 63 69 6c 69 74 79 20 69 73 20 64 65 73   facility is des
1c10: 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69 74 0a  igned to permit.
1c20: 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  ** INSERT, UPDAT
1c30: 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 6f 70  E, and DELETE op
1c40: 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e 73 74  erations against
1c50: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20   SQLITE_MASTER. 
1c60: 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69 66 20   Use.** care if 
1c70: 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20 74 72  you decide to tr
1c80: 79 20 74 6f 20 75 73 65 20 74 68 69 73 20 72 6f  y to use this ro
1c90: 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f  utine for some o
1ca0: 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a  ther purposes..*
1cb0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4e 65  /.void sqlite3Ne
1cc0: 73 74 65 64 50 61 72 73 65 28 50 61 72 73 65 20  stedParse(Parse 
1cd0: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
1ce0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
1cf0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
1d00: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
1d10: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
1d20: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
1d30: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1d40: 0a 23 20 64 65 66 69 6e 65 20 53 41 56 45 5f 53  .# define SAVE_S
1d50: 5a 20 20 28 73 69 7a 65 6f 66 28 50 61 72 73 65  Z  (sizeof(Parse
1d60: 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 50 61 72  ) - offsetof(Par
1d70: 73 65 2c 6e 56 61 72 29 29 0a 20 20 63 68 61 72  se,nVar)).  char
1d80: 20 73 61 76 65 42 75 66 5b 53 41 56 45 5f 53 5a   saveBuf[SAVE_SZ
1d90: 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  ];..  if( pParse
1da0: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
1db0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1dc0: 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20  e->nested<10 ); 
1dd0: 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75   /* Nesting shou
1de0: 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69  ld only be of li
1df0: 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20  mited depth */. 
1e00: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
1e10: 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d  ormat);.  zSql =
1e20: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
1e30: 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  (db, zFormat, ap
1e40: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
1e50: 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
1e60: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20  {.    return;   
1e70: 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74  /* A malloc must
1e80: 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
1e90: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65    }.  pParse->ne
1ea0: 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79  sted++;.  memcpy
1eb0: 28 73 61 76 65 42 75 66 2c 20 26 70 50 61 72 73  (saveBuf, &pPars
1ec0: 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f 53 5a  e->nVar, SAVE_SZ
1ed0: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61  );.  memset(&pPa
1ee0: 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20 53 41  rse->nVar, 0, SA
1ef0: 56 45 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65  VE_SZ);.  sqlite
1f00: 33 52 75 6e 50 61 72 73 65 72 28 70 50 61 72 73  3RunParser(pPars
1f10: 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72 4d 73  e, zSql, &zErrMs
1f20: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
1f30: 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
1f40: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1f50: 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d  e(db, zSql);.  m
1f60: 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d 3e 6e  emcpy(&pParse->n
1f70: 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20 53 41  Var, saveBuf, SA
1f80: 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65  VE_SZ);.  pParse
1f90: 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f  ->nested--;.}../
1fa0: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
1fb0: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
1fc0: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
1fd0: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
1fe0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
1ff0: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
2000: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
2010: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
2020: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
2030: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ** database cont
2040: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
2050: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
2060: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
2070: 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20  ** If zDatabase 
2080: 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61  is 0, all databa
2090: 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64  ses are searched
20a0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61   for the table a
20b0: 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  nd the.** first 
20c0: 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69  matching table i
20d0: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f  s returned.  (No
20e0: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75   checking for du
20f0: 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a  plicate table.**
2100: 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29   names is done.)
2110: 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64    The search ord
2120: 65 72 20 69 73 20 54 45 4d 50 20 66 69 72 73 74  er is TEMP first
2130: 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65  , then MAIN, the
2140: 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61  n any.** auxilia
2150: 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64  ry databases add
2160: 65 64 20 75 73 69 6e 67 20 74 68 65 20 41 54 54  ed using the ATT
2170: 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  ACH command..**.
2180: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
2190: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29  te3LocateTable()
21a0: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
21b0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c  te3FindTable(sql
21c0: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
21d0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
21e0: 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61  st char *zDataba
21f0: 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20  se){.  Table *p 
2200: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
2210: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 61 73 73  int nName;.  ass
2220: 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20 29 3b  ert( zName!=0 );
2230: 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  nName = sqlit
2240: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
2250: 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65  );.  /* All mute
2260: 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  xes are required
2270: 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
2280: 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77  ss.  Make sure w
2290: 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a  e hold them. */.
22a0: 20 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62    assert( zDatab
22b0: 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase!=0 || sqlite
22c0: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
22d0: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20 66  texes(db) );.  f
22e0: 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42  or(i=OMIT_TEMPDB
22f0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
2300: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28  ){.    int j = (
2310: 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20  i<2) ? i^1 : i; 
2320: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
2330: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
2340: 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73      if( zDatabas
2350: 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  e!=0 && sqlite3S
2360: 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65  trICmp(zDatabase
2370: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61  , db->aDb[j].zNa
2380: 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  me) ) continue;.
2390: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
23a0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
23b0: 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a  ld(db, j, 0) );.
23c0: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
23d0: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62  ashFind(&db->aDb
23e0: 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  [j].pSchema->tbl
23f0: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Hash, zName, nNa
2400: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  me);.    if( p )
2410: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
2420: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
2430: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
2440: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
2450: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
2460: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
2470: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
2480: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
2490: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
24a0: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
24b0: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
24c0: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
24d0: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
24e0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
24f0: 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c  t found.  Also l
2500: 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eave an.** error
2510: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
2520: 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
2530: 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
2540: 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
2550: 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74  outine and sqlit
2560: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73  e3FindTable() is
2570: 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f   that this.** ro
2580: 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20  utine leaves an 
2590: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
25a0: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
25b0: 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65   where.** sqlite
25c0: 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65  3FindTable() doe
25d0: 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20  s not..*/.Table 
25e0: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61  *sqlite3LocateTa
25f0: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
2600: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
2610: 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63   context in whic
2620: 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f  h to report erro
2630: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  rs */.  int isVi
2640: 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew,            /
2650: 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69 6e  * True if lookin
2660: 67 20 66 6f 72 20 61 20 56 49 45 57 20 72 61 74  g for a VIEW rat
2670: 68 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c 45  her than a TABLE
2680: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2690: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20   *zName,     /* 
26a0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
26b0: 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  e we are looking
26c0: 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   for */.  const 
26d0: 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20 20  char *zDbase    
26e0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
26f0: 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68 74  database.  Might
2700: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
2710: 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a   Table *p;..  /*
2720: 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
2730: 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
2740: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
2750: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
2760: 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
2770: 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
2780: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
2790: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
27a0: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
27b0: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
27c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
27d0: 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  }..  p = sqlite3
27e0: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
27f0: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  ->db, zName, zDb
2800: 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ase);.  if( p==0
2810: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2820: 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69 65  ar *zMsg = isVie
2830: 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65  w ? "no such vie
2840: 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61  w" : "no such ta
2850: 62 6c 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44  ble";.    if( zD
2860: 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71  base ){.      sq
2870: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2880: 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73  arse, "%s: %s.%s
2890: 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c  ", zMsg, zDbase,
28a0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
28b0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
28c0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
28d0: 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67  , "%s: %s", zMsg
28e0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , zName);.    }.
28f0: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
2900: 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d  kSchema = 1;.  }
2910: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
2920: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
2930: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
2940: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
2950: 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63  bes .** a partic
2960: 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e  ular index given
2970: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
2980: 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  t index.** and t
2990: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
29a0: 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e  atabase that con
29b0: 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e  tains the index.
29c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
29d0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
29e0: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
29f0: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
2a00: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
2a10: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62  d for the.** tab
2a20: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  le and the first
2a30: 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20   matching index 
2a40: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
2a50: 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f  o checking.** fo
2a60: 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65  r duplicate inde
2a70: 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  x names is done.
2a80: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
2a90: 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66  der is.** TEMP f
2aa0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2ab0: 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69   then any auxili
2ac0: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
2ad0: 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ded.** using the
2ae0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
2af0: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
2b00: 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69  e3FindIndex(sqli
2b10: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
2b20: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
2b30: 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
2b40: 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20  Index *p = 0;.  
2b50: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61  int i;.  int nNa
2b60: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2b70: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 2f  en30(zName);.  /
2b80: 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72  * All mutexes ar
2b90: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  e required for s
2ba0: 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d  chema access.  M
2bb0: 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64  ake sure we hold
2bc0: 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65   them. */.  asse
2bd0: 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71  rt( zDb!=0 || sq
2be0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
2bf0: 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
2c00: 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45  .  for(i=OMIT_TE
2c10: 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  MPDB; i<db->nDb;
2c20: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
2c30: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
2c40: 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54   i;  /* Search T
2c50: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
2c60: 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  */.    Schema *p
2c70: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
2c80: 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [j].pSchema;.   
2c90: 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61   assert( pSchema
2ca0: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20   );.    if( zDb 
2cb0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2cc0: 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a  p(zDb, db->aDb[j
2cd0: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
2ce0: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
2cf0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
2d00: 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30  texHeld(db, j, 0
2d10: 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  ) );.    p = sql
2d20: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 53  ite3HashFind(&pS
2d30: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
2d40: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
2d50: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
2d60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
2d70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61  ;.}../*.** Recla
2d80: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73  im the memory us
2d90: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a  ed by an index.*
2da0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
2db0: 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  eeIndex(sqlite3 
2dc0: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a  *db, Index *p){.
2dd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2de0: 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71  MIT_ANALYZE.  sq
2df0: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
2e00: 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a  Samples(db, p);.
2e10: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
2e20: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 43  DbFree(db, p->zC
2e30: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
2e40: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
2e50: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  }../*.** For the
2e60: 20 69 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49   index called zI
2e70: 64 78 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20  dxName which is 
2e80: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74  found in the dat
2e90: 61 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e  abase iDb,.** un
2ea0: 6c 69 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20  like that index 
2eb0: 66 72 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74  from its Table t
2ec0: 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69  hen remove the i
2ed0: 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  ndex from.** the
2ee0: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
2ef0: 65 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d  e and free all m
2f00: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
2f10: 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
2f20: 69 74 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ith the index..*
2f30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
2f40: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
2f50: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
2f60: 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63  int iDb, const c
2f70: 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a  har *zIdxName){.
2f80: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
2f90: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 48 61  .  int len;.  Ha
2fa0: 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73  sh *pHash;..  as
2fb0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
2fc0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
2fd0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48   iDb, 0) );.  pH
2fe0: 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  ash = &db->aDb[i
2ff0: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db].pSchema->idx
3000: 48 61 73 68 3b 0a 20 20 6c 65 6e 20 3d 20 73 71  Hash;.  len = sq
3010: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49  lite3Strlen30(zI
3020: 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65  dxName);.  pInde
3030: 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  x = sqlite3HashI
3040: 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64  nsert(pHash, zId
3050: 78 4e 61 6d 65 2c 20 6c 65 6e 2c 20 30 29 3b 0a  xName, len, 0);.
3060: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e    if( ALWAYS(pIn
3070: 64 65 78 29 20 29 7b 0a 20 20 20 20 69 66 28 20  dex) ){.    if( 
3080: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
3090: 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29  pIndex==pIndex )
30a0: 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
30b0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
30c0: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
30d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30e0: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20   Index *p;.     
30f0: 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f   /* Justificatio
3100: 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3b 20 20  n of ALWAYS();  
3110: 54 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62  The index must b
3120: 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  e on the list of
3130: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 65  .      ** indice
3140: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 20 3d 20  s. */.      p = 
3150: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
3160: 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68  pIndex;.      wh
3170: 69 6c 65 28 20 41 4c 57 41 59 53 28 70 29 20 26  ile( ALWAYS(p) &
3180: 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64  & p->pNext!=pInd
3190: 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  ex ){ p = p->pNe
31a0: 78 74 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  xt; }.      if( 
31b0: 41 4c 57 41 59 53 28 70 20 26 26 20 70 2d 3e 70  ALWAYS(p && p->p
31c0: 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29 20 29 7b  Next==pIndex) ){
31d0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  .        p->pNex
31e0: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
31f0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
3200: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64  .    freeIndex(d
3210: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
3220: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
3230: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
3240: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  ges;.}../*.** Er
3250: 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69  ase all schema i
3260: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
3270: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  the in-memory ha
3280: 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20  sh tables of.** 
3290: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
32a0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
32b0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
32c0: 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20  claim memory.** 
32d0: 62 65 66 6f 72 65 20 74 68 65 20 64 61 74 61 62  before the datab
32e0: 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49 74 20  ase closes.  It 
32f0: 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64  is also called d
3300: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
3310: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65 72  .** if there wer
3320: 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  e schema changes
3330: 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e   during the tran
3340: 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20 61 0a  saction or if a.
3350: 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65  ** schema-cookie
3360: 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75 72 73   mismatch occurs
3370: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30  ..**.** If iDb<0
3380: 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20   then reset the 
3390: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
33a0: 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64  tables for all d
33b0: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73  atabase.** files
33c0: 2e 20 20 49 66 20 69 44 62 3e 3d 30 20 74 68 65  .  If iDb>=0 the
33d0: 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65  n reset the inte
33e0: 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f 72 20  rnal schema for 
33f0: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67  only the.** sing
3400: 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74 65  le file indicate
3410: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
3420: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
3430: 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64  chema(sqlite3 *d
3440: 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69  b, int iDb){.  i
3450: 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 73 73 65 72  nt i, j;.  asser
3460: 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  t( iDb<db->nDb )
3470: 3b 0a 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20  ;..  if( iDb>=0 
3480: 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31  ){.    /* Case 1
3490: 3a 20 20 52 65 73 65 74 20 74 68 65 20 73 69 6e  :  Reset the sin
34a0: 67 6c 65 20 73 63 68 65 6d 61 20 69 64 65 6e 74  gle schema ident
34b0: 69 66 69 65 64 20 62 79 20 69 44 62 20 2a 2f 0a  ified by iDb */.
34c0: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
34d0: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20  b->aDb[iDb];.   
34e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
34f0: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
3500: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
3510: 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e     assert( pDb->
3520: 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20  pSchema!=0 );.  
3530: 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43    sqlite3SchemaC
3540: 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d  lear(pDb->pSchem
3550: 61 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61  a);..    /* If a
3560: 6e 79 20 64 61 74 61 62 61 73 65 20 6f 74 68 65  ny database othe
3570: 72 20 74 68 61 6e 20 54 45 4d 50 20 69 73 20 72  r than TEMP is r
3580: 65 73 65 74 2c 20 74 68 65 6e 20 61 6c 73 6f 20  eset, then also 
3590: 72 65 73 65 74 20 54 45 4d 50 0a 20 20 20 20 2a  reset TEMP.    *
35a0: 2a 20 73 69 6e 63 65 20 54 45 4d 50 20 6d 69 67  * since TEMP mig
35b0: 68 74 20 62 65 20 68 6f 6c 64 69 6e 67 20 74 72  ht be holding tr
35c0: 69 67 67 65 72 73 20 74 68 61 74 20 72 65 66 65  iggers that refe
35d0: 72 65 6e 63 65 20 74 61 62 6c 65 73 20 69 6e 20  rence tables in 
35e0: 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  the.    ** other
35f0: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a   database..    *
3600: 2f 0a 20 20 20 20 69 66 28 20 69 44 62 21 3d 31  /.    if( iDb!=1
3610: 20 29 7b 0a 20 20 20 20 20 20 70 44 62 20 3d 20   ){.      pDb = 
3620: 26 64 62 2d 3e 61 44 62 5b 31 5d 3b 0a 20 20 20  &db->aDb[1];.   
3630: 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e     assert( pDb->
3640: 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20  pSchema!=0 );.  
3650: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
3660: 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68  aClear(pDb->pSch
3670: 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ema);.    }.    
3680: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 2f 2a  return;.  }.  /*
3690: 20 43 61 73 65 20 32 20 28 66 72 6f 6d 20 68 65   Case 2 (from he
36a0: 72 65 20 74 6f 20 74 68 65 20 65 6e 64 29 3a 20  re to the end): 
36b0: 52 65 73 65 74 20 61 6c 6c 20 73 63 68 65 6d 61  Reset all schema
36c0: 73 20 66 6f 72 20 61 6c 6c 20 61 74 74 61 63 68  s for all attach
36d0: 65 64 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  ed.  ** database
36e0: 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  s. */.  assert( 
36f0: 69 44 62 3c 30 20 29 3b 0a 20 20 73 71 6c 69 74  iDb<0 );.  sqlit
3700: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
3710: 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  db);.  for(i=0; 
3720: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
3730: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
3740: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
3750: 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
3760: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3770: 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62  3SchemaClear(pDb
3780: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
3790: 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67  }.  }.  db->flag
37a0: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
37b0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71  ernChanges;.  sq
37c0: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c  lite3VtabUnlockL
37d0: 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ist(db);.  sqlit
37e0: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
37f0: 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  db);..  /* If on
3800: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
3810: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
3820: 61 73 65 20 66 69 6c 65 73 20 68 61 73 20 62 65  ase files has be
3830: 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20  en closed,.  ** 
3840: 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 6d  then remove them
3850: 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c 69   from the auxili
3860: 61 72 79 20 64 61 74 61 62 61 73 65 20 6c 69 73  ary database lis
3870: 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65 0a  t.  We take the.
3880: 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79    ** opportunity
3890: 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72 65   to do this here
38a0: 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6a   since we have j
38b0: 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c 20  ust deleted all 
38c0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68 65  of the.  ** sche
38d0: 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 20 61  ma hash tables a
38e0: 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f 20  nd therefore do 
38f0: 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b 65  not have to make
3900: 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20 2a   any changes.  *
3910: 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73  * to any of thos
3920: 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
3930: 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62   for(i=j=2; i<db
3940: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
3950: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
3960: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
3970: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
3980: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
3990: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
39a0: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
39b0: 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b   pDb->zName = 0;
39c0: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
39d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
39e0: 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  <i ){.      db->
39f0: 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62  aDb[j] = db->aDb
3a00: 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  [i];.    }.    j
3a10: 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ++;.  }.  memset
3a20: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c  (&db->aDb[j], 0,
3a30: 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a   (db->nDb-j)*siz
3a40: 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29  eof(db->aDb[j]))
3a50: 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b  ;.  db->nDb = j;
3a60: 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d  .  if( db->nDb<=
3a70: 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62  2 && db->aDb!=db
3a80: 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20  ->aDbStatic ){. 
3a90: 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44     memcpy(db->aD
3aa0: 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62  bStatic, db->aDb
3ab0: 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61  , 2*sizeof(db->a
3ac0: 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c  Db[0]));.    sql
3ad0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 64  ite3DbFree(db, d
3ae0: 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d  b->aDb);.    db-
3af0: 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74  >aDb = db->aDbSt
3b00: 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  atic;.  }.}../*.
3b10: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3b20: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
3b30: 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a   commit occurs..
3b40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
3b50: 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
3b60: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
3b70: 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  ){.  db->flags &
3b80: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  = ~SQLITE_Intern
3b90: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
3ba0: 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79 20  * Delete memory 
3bb0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
3bc0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f  e column names o
3bd0: 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
3be0: 77 20 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65 2e  w (the.** Table.
3bf0: 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a 2a  aCol[] array)..*
3c00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
3c10: 6c 69 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  liteDeleteColumn
3c20: 4e 61 6d 65 73 28 73 71 6c 69 74 65 33 20 2a 64  Names(sqlite3 *d
3c30: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
3c40: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f  ){.  int i;.  Co
3c50: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73  lumn *pCol;.  as
3c60: 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20  sert( pTable!=0 
3c70: 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d  );.  if( (pCol =
3c80: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d   pTable->aCol)!=
3c90: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
3ca0: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
3cb0: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
3cc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
3cd0: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e  ree(db, pCol->zN
3ce0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
3cf0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
3d00: 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  , pCol->pDflt);.
3d10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
3d20: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44  ree(db, pCol->zD
3d30: 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  flt);.      sqli
3d40: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
3d50: 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20  ol->zType);.    
3d60: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3d70: 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29  db, pCol->zColl)
3d80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
3d90: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
3da0: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d  able->aCol);.  }
3db0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
3dc0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61   the memory data
3dd0: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
3de0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
3df0: 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20  given.** Table. 
3e00: 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
3e10: 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20  made to disk by 
3e20: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
3e30: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3e40: 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68   just deletes th
3e50: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
3e60: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75  .  It does not u
3e70: 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62  nlink.** the tab
3e80: 6c 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  le data structur
3e90: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
3ea0: 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64  table.  But it d
3eb0: 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d  oes destroy.** m
3ec0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
3ed0: 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20   of the indices 
3ee0: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
3ef0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3f00: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a   .** the table..
3f10: 2a 2a 0a 2a 2a 20 54 68 65 20 64 62 20 70 61 72  **.** The db par
3f20: 61 6d 65 74 65 72 20 69 73 20 6f 70 74 69 6f 6e  ameter is option
3f30: 61 6c 2e 20 20 49 74 20 69 73 20 6e 65 65 64 65  al.  It is neede
3f40: 64 20 69 66 20 74 68 65 20 54 61 62 6c 65 20 6f  d if the Table o
3f50: 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69  bject .** contai
3f60: 6e 73 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d  ns lookaside mem
3f70: 6f 72 79 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a  ory.  (Table obj
3f80: 65 63 74 73 20 69 6e 20 74 68 65 20 73 63 68 65  ects in the sche
3f90: 6d 61 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a  ma do not use.**
3fa0: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
3fb0: 79 2c 20 62 75 74 20 73 6f 6d 65 20 65 70 68 65  y, but some ephe
3fc0: 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65  meral Table obje
3fd0: 63 74 73 20 64 6f 2e 29 20 20 4f 72 20 74 68 65  cts do.)  Or the
3fe0: 0a 2a 2a 20 64 62 20 70 61 72 61 6d 65 74 65 72  .** db parameter
3ff0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74   can be used wit
4000: 68 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  h db->pnBytesFre
4010: 65 64 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68  ed to measure th
4020: 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64  e memory.** used
4030: 20 62 79 20 74 68 65 20 54 61 62 6c 65 20 6f 62   by the Table ob
4040: 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ject..*/.void sq
4050: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
4060: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
4070: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
4080: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a  Index *pIndex, *
4090: 70 4e 65 78 74 3b 0a 20 20 54 45 53 54 4f 4e 4c  pNext;.  TESTONL
40a0: 59 28 20 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64  Y( int nLookasid
40b0: 65 3b 20 29 20 2f 2a 20 55 73 65 64 20 74 6f 20  e; ) /* Used to 
40c0: 76 65 72 69 66 79 20 6c 6f 6f 6b 61 73 69 64 65  verify lookaside
40d0: 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 20 73 63   not used for sc
40e0: 68 65 6d 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72  hema */..  asser
40f0: 74 28 20 21 70 54 61 62 6c 65 20 7c 7c 20 70 54  t( !pTable || pT
4100: 61 62 6c 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  able->nRef>0 );.
4110: 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c  .  /* Do not del
4120: 65 74 65 20 74 68 65 20 74 61 62 6c 65 20 75 6e  ete the table un
4130: 74 69 6c 20 74 68 65 20 72 65 66 65 72 65 6e 63  til the referenc
4140: 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  e count reaches 
4150: 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 21  zero. */.  if( !
4160: 70 54 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b  pTable ) return;
4170: 0a 20 20 69 66 28 20 28 28 21 64 62 20 7c 7c 20  .  if( ((!db || 
4180: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
4190: 3d 3d 30 29 20 26 26 20 28 2d 2d 70 54 61 62 6c  ==0) && (--pTabl
41a0: 65 2d 3e 6e 52 65 66 29 3e 30 29 20 29 20 72 65  e->nRef)>0) ) re
41b0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 52 65 63 6f  turn;..  /* Reco
41c0: 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rd the number of
41d0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f   outstanding loo
41e0: 6b 61 73 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f  kaside allocatio
41f0: 6e 73 20 69 6e 20 73 63 68 65 6d 61 20 54 61 62  ns in schema Tab
4200: 6c 65 73 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74  les.  ** prior t
4210: 6f 20 64 6f 69 6e 67 20 61 6e 79 20 66 72 65 65  o doing any free
4220: 28 29 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20  () operations.  
4230: 53 69 6e 63 65 20 73 63 68 65 6d 61 20 54 61 62  Since schema Tab
4240: 6c 65 73 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20  les do not use. 
4250: 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74   ** lookaside, t
4260: 68 69 73 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c  his number shoul
4270: 64 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f  d not change. */
4280: 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 6e 4c 6f  .  TESTONLY( nLo
4290: 6f 6b 61 73 69 64 65 20 3d 20 28 64 62 20 26 26  okaside = (db &&
42a0: 20 28 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61   (pTable->tabFla
42b0: 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
42c0: 6c 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20  l)==0) ?.       
42d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42e0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
42f0: 6e 4f 75 74 20 3a 20 30 20 29 3b 0a 0a 20 20 2f  nOut : 0 );..  /
4300: 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64  * Delete all ind
4310: 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
4320: 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e  with this table.
4330: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78   */.  for(pIndex
4340: 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65   = pTable->pInde
4350: 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  x; pIndex; pInde
4360: 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  x=pNext){.    pN
4370: 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  ext = pIndex->pN
4380: 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ext;.    assert(
4390: 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
43a0: 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d  ==pTable->pSchem
43b0: 61 20 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62  a );.    if( !db
43c0: 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46   || db->pnBytesF
43d0: 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  reed==0 ){.     
43e0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
43f0: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20  Index->zName; . 
4400: 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 20 28 20       TESTONLY ( 
4410: 49 6e 64 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20  Index *pOld = ) 
4420: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
4430: 74 28 0a 09 20 20 26 70 49 6e 64 65 78 2d 3e 70  t(..  &pIndex->p
4440: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
4450: 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53   zName, sqlite3S
4460: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 2c 20  trlen30(zName), 
4470: 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  0.      );.     
4480: 20 61 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c   assert( db==0 |
4490: 7c 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  | sqlite3SchemaM
44a0: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20  utexHeld(db, 0, 
44b0: 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
44c0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
44d0: 28 20 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20 7c  ( pOld==pIndex |
44e0: 7c 20 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20 20  | pOld==0 );.   
44f0: 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78   }.    freeIndex
4500: 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  (db, pIndex);.  
4510: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  }..  /* Delete a
4520: 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  ny foreign keys 
4530: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 69 73  attached to this
4540: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c   table. */.  sql
4550: 69 74 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c  ite3FkDelete(db,
4560: 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20   pTable);..  /* 
4570: 44 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65  Delete the Table
4580: 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c   structure itsel
4590: 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  f..  */.  sqlite
45a0: 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  DeleteColumnName
45b0: 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20  s(db, pTable);. 
45c0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
45d0: 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  b, pTable->zName
45e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
45f0: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a  ee(db, pTable->z
4600: 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74  ColAff);.  sqlit
4610: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
4620: 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  b, pTable->pSele
4630: 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ct);.#ifndef SQL
4640: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
4650: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4660: 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c  Delete(db, pTabl
4670: 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 65 6e 64  e->pCheck);.#end
4680: 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
4690: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
46a0: 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61  BLE.  sqlite3Vta
46b0: 62 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c  bClear(db, pTabl
46c0: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  e);.#endif.  sql
46d0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
46e0: 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65  Table);..  /* Ve
46f0: 72 69 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f  rify that no loo
4700: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61  kaside memory wa
4710: 73 20 75 73 65 64 20 62 79 20 73 63 68 65 6d 61  s used by schema
4720: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73   tables */.  ass
4730: 65 72 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d  ert( nLookaside=
4740: 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65  =0 || nLookaside
4750: 3d 3d 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ==db->lookaside.
4760: 6e 4f 75 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nOut );.}../*.**
4770: 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65   Unlink the give
4780: 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  n table from the
4790: 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64   hash tables and
47a0: 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a   the delete the.
47b0: 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  ** table structu
47c0: 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20  re with all its 
47d0: 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65  indices and fore
47e0: 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69  ign keys..*/.voi
47f0: 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41  d sqlite3UnlinkA
4800: 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71  ndDeleteTable(sq
4810: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
4820: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
4830: 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62  zTabName){.  Tab
4840: 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62  le *p;.  Db *pDb
4850: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  ;..  assert( db!
4860: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
4870: 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
4880: 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
4890: 74 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20  t( zTabName );. 
48a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
48b0: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
48c0: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
48d0: 20 74 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e   testcase( zTabN
48e0: 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a  ame[0]==0 );  /*
48f0: 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62   Zero-length tab
4900: 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c  le names are all
4910: 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20  owed */.  pDb = 
4920: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
4930: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
4940: 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63  Insert(&pDb->pSc
4950: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a  hema->tblHash, z
4960: 54 61 62 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  TabName,.       
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4980: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
4990: 28 7a 54 61 62 4e 61 6d 65 29 2c 30 29 3b 0a 20  (zTabName),0);. 
49a0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
49b0: 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62  ble(db, p);.  db
49c0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
49d0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
49e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
49f0: 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20  a token, return 
4a00: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f  a string that co
4a10: 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65  nsists of the te
4a20: 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f  xt of that.** to
4a30: 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68  ken.  Space to h
4a40: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
4a50: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62   string.** is ob
4a60: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
4a70: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
4a80: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
4a90: 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  the calling.** f
4aa0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  unction..**.** A
4ab0: 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72  ny quotation mar
4ac0: 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c  ks (ex:  "name",
4ad0: 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c   'name', [name],
4ae0: 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74   or `name`) that
4af0: 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65  .** surround the
4b00: 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b   body of the tok
4b10: 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a  en are removed..
4b20: 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65  **.** Tokens are
4b30: 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e   often just poin
4b40: 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72  ters into the or
4b50: 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20  iginal SQL text 
4b60: 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f  and so.** are no
4b70: 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  t \000 terminate
4b80: 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65  d and are not pe
4b90: 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72  rsistent.  The r
4ba0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a  eturned string.*
4bb0: 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e  * is \000 termin
4bc0: 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73  ated and is pers
4bd0: 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20  istent..*/.char 
4be0: 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d  *sqlite3NameFrom
4bf0: 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64  Token(sqlite3 *d
4c00: 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  b, Token *pName)
4c10: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
4c20: 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
4c30: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
4c40: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
4c50: 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a   (char*)pName->z
4c60: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20  , pName->n);.   
4c70: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
4c80: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  zName);.  }else{
4c90: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a  .    zName = 0;.
4ca0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61    }.  return zNa
4cb0: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  me;.}../*.** Ope
4cc0: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
4cd0: 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64  ter table stored
4ce0: 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d   in database num
4cf0: 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77  ber iDb for.** w
4d00: 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c  riting. The tabl
4d10: 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e  e is opened usin
4d20: 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76  g cursor 0..*/.v
4d30: 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d  oid sqlite3OpenM
4d40: 61 73 74 65 72 54 61 62 6c 65 28 50 61 72 73 65  asterTable(Parse
4d50: 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20   *p, int iDb){. 
4d60: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
4d70: 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20  e3GetVdbe(p);.  
4d80: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
4d90: 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f  (p, iDb, MASTER_
4da0: 52 4f 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f  ROOT, 1, SCHEMA_
4db0: 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 73  TABLE(iDb));.  s
4dc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
4dd0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
4de0: 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  , 0, MASTER_ROOT
4df0: 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , iDb);.  sqlite
4e00: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
4e10: 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 35 2c 20   -1, (char *)5, 
4e20: 50 34 5f 49 4e 54 33 32 29 3b 20 20 2f 2a 20 35  P4_INT32);  /* 5
4e30: 20 63 6f 6c 75 6d 6e 20 74 61 62 6c 65 20 2a 2f   column table */
4e40: 0a 20 20 69 66 28 20 70 2d 3e 6e 54 61 62 3d 3d  .  if( p->nTab==
4e50: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 54 61 62  0 ){.    p->nTab
4e60: 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
4e70: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4e 61  ** Parameter zNa
4e80: 6d 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e  me points to a n
4e90: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 62 75  ul-terminated bu
4ea0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
4eb0: 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61  the name.** of a
4ec0: 20 64 61 74 61 62 61 73 65 20 28 22 6d 61 69 6e   database ("main
4ed0: 22 2c 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65  ", "temp" or the
4ee0: 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61   name of an atta
4ef0: 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 0a 2a  ched db). This.*
4f00: 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
4f10: 6e 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  ns the index of 
4f20: 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61  the named databa
4f30: 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c  se in db->aDb[],
4f40: 20 6f 72 0a 2a 2a 20 2d 31 20 69 66 20 74 68 65   or.** -1 if the
4f50: 20 6e 61 6d 65 64 20 64 62 20 63 61 6e 6e 6f 74   named db cannot
4f60: 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e   be found..*/.in
4f70: 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  t sqlite3FindDbN
4f80: 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ame(sqlite3 *db,
4f90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
4fa0: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d  me){.  int i = -
4fb0: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  1;         /* Da
4fc0: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f  tabase number */
4fd0: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a  .  if( zName ){.
4fe0: 20 20 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 20      Db *pDb;.   
4ff0: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
5000: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
5010: 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e  .    for(i=(db->
5020: 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d  nDb-1), pDb=&db-
5030: 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69  >aDb[i]; i>=0; i
5040: 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20  --, pDb--){.    
5050: 20 20 69 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d    if( (!OMIT_TEM
5060: 50 44 42 20 7c 7c 20 69 21 3d 31 20 29 20 26 26  PDB || i!=1 ) &&
5070: 20 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65   n==sqlite3Strle
5080: 6e 33 30 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20  n30(pDb->zName) 
5090: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d  && .          0=
50a0: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
50b0: 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  pDb->zName, zNam
50c0: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  e) ){.        br
50d0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
50e0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
50f0: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  i;.}../*.** The 
5100: 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e  token *pName con
5110: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f  tains the name o
5120: 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69  f a database (ei
5130: 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a  ther "main" or.*
5140: 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  * "temp" or the 
5150: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
5160: 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f  hed db). This ro
5170: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
5180: 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68  e.** index of th
5190: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  e named database
51a0: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f   in db->aDb[], o
51b0: 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  r -1 if the name
51c0: 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f  d db .** does no
51d0: 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20  t exist..*/.int 
51e0: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71  sqlite3FindDb(sq
51f0: 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e  lite3 *db, Token
5200: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *pName){.  int 
5210: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
5220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5230: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
5240: 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ber */.  char *z
5250: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
5260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5270: 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61   Name we are sea
5280: 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  rching for */.  
5290: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
52a0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
52b0: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73   pName);.  i = s
52c0: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
52d0: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73  (db, zName);.  s
52e0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
52f0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
5300: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74  n i;.}../* The t
5310: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20  able or view or 
5320: 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20  trigger name is 
5330: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
5340: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
5350: 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20  s.** pName1 and 
5360: 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74  pName2. If the t
5370: 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75  able name was fu
5380: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66  lly qualified, f
5390: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
53a0: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
53b0: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a  xx.yyy (...);.**
53c0: 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31   .** Then pName1
53d0: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
53e0: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
53f0: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
5400: 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74  hand if.** the t
5410: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
5420: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
5430: 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52  , i.e.:.**.** CR
5440: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
5450: 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ..);.**.** Then 
5460: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
5470: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
5480: 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54  2 is ""..**.** T
5490: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
54a0: 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70   the *ppUnqual p
54b0: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
54c0: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
54d0: 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65  ame1 or.** pName
54e0: 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74  2) that stores t
54f0: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74  he unqualified t
5500: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20  able name.  The 
5510: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
5520: 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69  database "xxx" i
5530: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
5540: 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  nt sqlite3TwoPar
5550: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
5560: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
5570: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
5580: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
5590: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
55a0: 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20  pName1,      /* 
55b0: 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65  The "xxx" in the
55c0: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
55d0: 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f  or "xxx" */.  To
55e0: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
55f0: 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69    /* The "yyy" i
5600: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
5610: 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  yyy" */.  Token 
5620: 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a  **pUnqual     /*
5630: 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61   Write the unqua
5640: 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61  lified object na
5650: 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  me here */.){.  
5660: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
5670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
5680: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
5690: 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  the object */.  
56a0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
56b0: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
56c0: 20 41 4c 57 41 59 53 28 70 4e 61 6d 65 32 21 3d   ALWAYS(pName2!=
56d0: 30 29 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e  0) && pName2->n>
56e0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  0 ){.    if( db-
56f0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20  >init.busy ) {. 
5700: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
5710: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f  rMsg(pParse, "co
5720: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 22 29  rrupt database")
5730: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
5740: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65  nErr++;.      re
5750: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
5760: 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e     *pUnqual = pN
5770: 61 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20  ame2;.    iDb = 
5780: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62  sqlite3FindDb(db
5790: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69  , pName1);.    i
57a0: 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20  f( iDb<0 ){.    
57b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
57c0: 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f  g(pParse, "unkno
57d0: 77 6e 20 64 61 74 61 62 61 73 65 20 25 54 22 2c  wn database %T",
57e0: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20   pName1);.      
57f0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
5800: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
5810: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
5820: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
5830: 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64  init.iDb==0 || d
5840: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a  b->init.busy );.
5850: 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e      iDb = db->in
5860: 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e  it.iDb;.    *pUn
5870: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20  qual = pName1;. 
5880: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b   }.  return iDb;
5890: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
58a0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
58b0: 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 55  o check if the U
58c0: 54 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d  TF-8 string zNam
58d0: 65 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20  e is a legal.** 
58e0: 75 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  unqualified name
58f0: 20 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d   for a new schem
5900: 61 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c  a object (table,
5910: 20 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a   index, view or.
5920: 2a 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c  ** trigger). All
5930: 20 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c   names are legal
5940: 20 65 78 63 65 70 74 20 74 68 6f 73 65 20 74 68   except those th
5950: 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 74 68  at begin with th
5960: 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c  e string.** "sql
5970: 69 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c  ite_" (in upper,
5980: 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20   lower or mixed 
5990: 63 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74  case). This port
59a0: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73  ion of the names
59b0: 70 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72  pace.** is reser
59c0: 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  ved for internal
59d0: 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   use..*/.int sql
59e0: 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
59f0: 61 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ame(Parse *pPars
5a00: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
5a10: 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50  Name){.  if( !pP
5a20: 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  arse->db->init.b
5a30: 75 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  usy && pParse->n
5a40: 65 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20  ested==0 .      
5a50: 20 20 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e      && (pParse->
5a60: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
5a70: 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d  TE_WriteSchema)=
5a80: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  =0.          && 
5a90: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43  0==sqlite3StrNIC
5aa0: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
5ab0: 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73  e_", 7) ){.    s
5ac0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5ad0: 50 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e  Parse, "object n
5ae0: 61 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72  ame reserved for
5af0: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25   internal use: %
5b00: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
5b10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
5b20: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
5b30: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
5b40: 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73  /*.** Begin cons
5b50: 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74  tructing a new t
5b60: 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74  able representat
5b70: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  ion in memory.  
5b80: 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66  This is.** the f
5b90: 69 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20  irst of several 
5ba0: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
5bb0: 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20  that get called 
5bc0: 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74  in response.** t
5bd0: 6f 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  o a CREATE TABLE
5be0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20   statement.  In 
5bf0: 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73  particular, this
5c00: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
5c10: 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69  ed.** after seei
5c20: 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54  ng tokens "CREAT
5c30: 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61  E" and "TABLE" a
5c40: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  nd the table nam
5c50: 65 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a  e. The isTemp.**
5c60: 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66   flag is true if
5c70: 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c   the table shoul
5c80: 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  d be stored in t
5c90: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
5ca0: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e  abase.** file in
5cb0: 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20  stead of in the 
5cc0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
5cd0: 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  le.  This is nor
5ce0: 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a  mally the case.*
5cf0: 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50  * when the "TEMP
5d00: 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22  " or "TEMPORARY"
5d10: 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20   keyword occurs 
5d20: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52  in between.** CR
5d30: 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a  EATE and TABLE..
5d40: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61  **.** The new ta
5d50: 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e  ble record is in
5d60: 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75  itialized and pu
5d70: 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65  t in pParse->pNe
5d80: 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f  wTable..** As mo
5d90: 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  re of the CREATE
5da0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
5db0: 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69   is parsed, addi
5dc0: 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a  tional action.**
5dd0: 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62   routines will b
5de0: 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20  e called to add 
5df0: 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  more information
5e00: 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e   to this record.
5e10: 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
5e20: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
5e30: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  LE statement, th
5e40: 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
5e50: 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  e() routine.** i
5e60: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70  s called to comp
5e70: 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75  lete the constru
5e80: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77  ction of the new
5e90: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a   table record..*
5ea0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74  /.void sqlite3St
5eb0: 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73  artTable(.  Pars
5ec0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
5ed0: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
5ee0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
5ef0: 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61  1,   /* First pa
5f00: 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f  rt of the name o
5f10: 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  f the table or v
5f20: 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  iew */.  Token *
5f30: 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63  pName2,   /* Sec
5f40: 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ond part of the 
5f50: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
5f60: 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69  e or view */.  i
5f70: 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20  nt isTemp,      
5f80: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
5f90: 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20  is a TEMP table 
5fa0: 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c  */.  int isView,
5fb0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
5fc0: 20 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20   this is a VIEW 
5fd0: 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75  */.  int isVirtu
5fe0: 61 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66  al,   /* True if
5ff0: 20 74 68 69 73 20 69 73 20 61 20 56 49 52 54 55   this is a VIRTU
6000: 41 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  AL table */.  in
6010: 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f  t noErr        /
6020: 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20  * Do nothing if 
6030: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78  table already ex
6040: 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ists */.){.  Tab
6050: 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68  le *pTable;.  ch
6060: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f  ar *zName = 0; /
6070: 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * The name of th
6080: 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20  e new table */. 
6090: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
60a0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
60b0: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b  e *v;.  int iDb;
60c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
60d0: 62 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63  base number to c
60e0: 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  reate the table 
60f0: 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  in */.  Token *p
6100: 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75  Name;    /* Unqu
6110: 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
6120: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65  the table to cre
6130: 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ate */..  /* The
6140: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
6150: 61 6d 65 20 74 6f 20 63 72 65 61 74 65 20 69 73  ame to create is
6160: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
6170: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65  routine via toke
6180: 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61  ns.  ** pName1 a
6190: 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68  nd pName2. If th
61a0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73  e table name was
61b0: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
61c0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20  , for example:. 
61d0: 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20   **.  ** CREATE 
61e0: 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e  TABLE xxx.yyy (.
61f0: 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ..);.  ** .  ** 
6200: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
6210: 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20  et to "xxx" and 
6220: 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e  pName2 "yyy". On
6230: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
6240: 69 66 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  if.  ** the tabl
6250: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
6260: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
6270: 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  .e.:.  **.  ** C
6280: 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28  REATE TABLE yyy(
6290: 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ...);.  **.  ** 
62a0: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
62b0: 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20  et to "yyy" and 
62c0: 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20  pName2 is ""..  
62d0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  **.  ** The call
62e0: 20 62 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20   below sets the 
62f0: 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f  pName pointer to
6300: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f   point at the to
6310: 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20  ken (pName1 or. 
6320: 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74   ** pName2) that
6330: 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75   stores the unqu
6340: 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61  alified table na
6350: 6d 65 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65  me. The variable
6360: 20 69 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74   iDb is.  ** set
6370: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
6380: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
6390: 61 74 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  at the table or 
63a0: 76 69 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20  view is to be.  
63b0: 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20  ** created in.. 
63c0: 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69   */.  iDb = sqli
63d0: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
63e0: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
63f0: 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
6400: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
6410: 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d 49  turn;.  if( !OMI
6420: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
6430: 6d 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e  mp && pName2->n>
6440: 30 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20  0 && iDb!=1 ){. 
6450: 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e     /* If creatin
6460: 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20  g a temp table, 
6470: 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74  the name may not
6480: 20 62 65 20 71 75 61 6c 69 66 69 65 64 2e 20 55   be qualified. U
6490: 6e 6c 65 73 73 20 0a 20 20 20 20 2a 2a 20 74 68  nless .    ** th
64a0: 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
64b0: 69 73 20 22 74 65 6d 70 22 20 61 6e 79 77 61 79  is "temp" anyway
64c0: 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  .  */.    sqlite
64d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
64e0: 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62  , "temporary tab
64f0: 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  le name must be 
6500: 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20  unqualified");. 
6510: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
6520: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
6530: 42 20 26 26 20 69 73 54 65 6d 70 20 29 20 69 44  B && isTemp ) iD
6540: 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65  b = 1;..  pParse
6550: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a  ->sNameToken = *
6560: 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d  pName;.  zName =
6570: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
6580: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
6590: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
65a0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
65b0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
65c0: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
65d0: 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  me(pParse, zName
65e0: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65  ) ){.    goto be
65f0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6600: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69  .  }.  if( db->i
6610: 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54  nit.iDb==1 ) isT
6620: 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  emp = 1;.#ifndef
6630: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
6640: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73  HORIZATION.  ass
6650: 65 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31  ert( (isTemp & 1
6660: 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b  )==isTemp );.  {
6670: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
6680: 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64     char *zDb = d
6690: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
66a0: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
66b0: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
66c0: 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
66d0: 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
66e0: 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29  isTemp), 0, zDb)
66f0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
6700: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
6710: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6720: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
6730: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
6740: 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20   && isTemp ){.  
6750: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
6760: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
6770: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  VIEW;.      }els
6780: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
6790: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
67a0: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20  VIEW;.      }.  
67b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
67c0: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
67d0: 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  && isTemp ){.   
67e0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
67f0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
6800: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
6810: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
6820: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
6830: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20  TABLE;.      }. 
6840: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73     }.    if( !is
6850: 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74  Virtual && sqlit
6860: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
6870: 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c  se, code, zName,
6880: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
6890: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
68a0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
68b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
68c0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e   Make sure the n
68d0: 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f  ew table name do
68e0: 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77  es not collide w
68f0: 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  ith an existing.
6900: 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
6910: 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  ble name in the 
6920: 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20  same database.  
6930: 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d  Issue an error m
6940: 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69  essage if.  ** i
6950: 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65  t does. The exce
6960: 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20  ption is if the 
6970: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
6980: 70 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65  parsed was passe
6990: 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c  d.  ** to an sql
69a0: 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
69b0: 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61  b() call. In tha
69c0: 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20  t case only the 
69d0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a  column names.  *
69e0: 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c  * and types will
69f0: 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65   be used, so the
6a00: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
6a10: 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70   test for namesp
6a20: 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69  ace.  ** collisi
6a30: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
6a40: 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42  !IN_DECLARE_VTAB
6a50: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44   ){.    char *zD
6a60: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
6a70: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
6a80: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
6a90: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
6aa0: 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  rse) ){.      go
6ab0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
6ac0: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
6ad0: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  pTable = sqlite3
6ae0: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
6af0: 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69  ame, zDb);.    i
6b00: 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  f( pTable ){.   
6b10: 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b     if( !noErr ){
6b20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6b30: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6b40: 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61   "table %T alrea
6b50: 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d  dy exists", pNam
6b60: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
6b70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6b80: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
6b90: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
6ba0: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
6bb0: 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
6bc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
6bd0: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
6be0: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
6bf0: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
6c00: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
6c10: 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20   zDb)!=0 ){.    
6c20: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
6c30: 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
6c40: 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69   is already an i
6c50: 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20  ndex named %s", 
6c60: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
6c70: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
6c80: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
6c90: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
6ca0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
6cb0: 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
6cc0: 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  ));.  if( pTable
6cd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  ==0 ){.    db->m
6ce0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
6cf0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
6d00: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
6d10: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
6d20: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67  ++;.    goto beg
6d30: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
6d40: 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e    }.  pTable->zN
6d50: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70  ame = zName;.  p
6d60: 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d  Table->iPKey = -
6d70: 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63  1;.  pTable->pSc
6d80: 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69  hema = db->aDb[i
6d90: 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70  Db].pSchema;.  p
6da0: 54 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b  Table->nRef = 1;
6db0: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 45  .  pTable->nRowE
6dc0: 73 74 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20  st = 1000000;.  
6dd0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
6de0: 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  pNewTable==0 );.
6df0: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
6e00: 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20  ble = pTable;.. 
6e10: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
6e20: 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f  he magic sqlite_
6e30: 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75  sequence table u
6e40: 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65  sed by autoincre
6e50: 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  ment,.  ** then 
6e60: 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72  record a pointer
6e70: 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69   to this table i
6e80: 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
6e90: 61 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  ase structure.  
6ea0: 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52  ** so that INSER
6eb0: 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74  T can find the t
6ec0: 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a  able easily..  *
6ed0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
6ee0: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
6ef0: 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72 73  ENT.  if( !pPars
6f00: 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72  e->nested && str
6f10: 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  cmp(zName, "sqli
6f20: 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30  te_sequence")==0
6f30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
6f40: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
6f50: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
6f60: 30 29 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65  0) );.    pTable
6f70: 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54  ->pSchema->pSeqT
6f80: 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d  ab = pTable;.  }
6f90: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65  .#endif..  /* Be
6fa0: 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74  gin generating t
6fb0: 68 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  he code that wil
6fc0: 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62  l insert the tab
6fd0: 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20  le record into. 
6fe0: 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   ** the SQLITE_M
6ff0: 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f  ASTER table.  No
7000: 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72  te in particular
7010: 20 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f   that we must go
7020: 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20   ahead.  ** and 
7030: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63  allocate the rec
7040: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
7050: 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e  he table entry n
7060: 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a  ow.  Before any.
7070: 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59    ** PRIMARY KEY
7080: 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f   or UNIQUE keywo
7090: 72 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20  rds are parsed. 
70a0: 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20   Those keywords 
70b0: 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20  will cause.  ** 
70c0: 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72  indices to be cr
70d0: 65 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61  eated and the ta
70e0: 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20  ble record must 
70f0: 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20  come before the 
7100: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20  .  ** indices.  
7110: 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72  Hence, the recor
7120: 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  d number for the
7130: 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61   table must be a
7140: 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f  llocated.  ** no
7150: 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  w..  */.  if( !d
7160: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
7170: 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  (v = sqlite3GetV
7180: 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20  dbe(pParse))!=0 
7190: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20  ){.    int j1;. 
71a0: 20 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61     int fileForma
71b0: 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c  t;.    int reg1,
71c0: 20 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20   reg2, reg3;.   
71d0: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
71e0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
71f0: 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 23 69  se, 0, iDb);..#i
7200: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7210: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
7220: 20 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c     if( isVirtual
7230: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7240: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
7250: 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d  P_VBegin);.    }
7260: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
7270: 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d  If the file form
7280: 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20  at and encoding 
7290: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
72a0: 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65  have not been se
72b0: 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74  t, .    ** set t
72c0: 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a  hem now..    */.
72d0: 20 20 20 20 72 65 67 31 20 3d 20 70 50 61 72 73      reg1 = pPars
72e0: 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b  e->regRowid = ++
72f0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
7300: 20 20 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d    reg2 = pParse-
7310: 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61  >regRoot = ++pPa
7320: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
7330: 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  eg3 = ++pParse->
7340: 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
7350: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
7360: 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44  P_ReadCookie, iD
7370: 62 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46  b, reg3, BTREE_F
7380: 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20  ILE_FORMAT);.   
7390: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
73a0: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
73b0: 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
73c0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
73d0: 49 66 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 66  If, reg3);.    f
73e0: 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d  ileFormat = (db-
73f0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
7400: 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d  LegacyFileFmt)!=
7410: 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  0 ?.            
7420: 20 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45        1 : SQLITE
7430: 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  _MAX_FILE_FORMAT
7440: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7450: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
7460: 74 65 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61  teger, fileForma
7470: 74 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71  t, reg3);.    sq
7480: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
7490: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
74a0: 20 69 44 62 2c 20 42 54 52 45 45 5f 46 49 4c 45   iDb, BTREE_FILE
74b0: 5f 46 4f 52 4d 41 54 2c 20 72 65 67 33 29 3b 0a  _FORMAT, reg3);.
74c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
74d0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
74e0: 67 65 72 2c 20 45 4e 43 28 64 62 29 2c 20 72 65  ger, ENC(db), re
74f0: 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g3);.    sqlite3
7500: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7510: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
7520: 20 42 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f   BTREE_TEXT_ENCO
7530: 44 49 4e 47 2c 20 72 65 67 33 29 3b 0a 20 20 20  DING, reg3);.   
7540: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
7550: 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20  Here(v, j1);..  
7560: 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63    /* This just c
7570: 72 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68  reates a place-h
7580: 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20  older record in 
7590: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
75a0: 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  r table..    ** 
75b0: 54 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74  The record creat
75c0: 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  ed does not cont
75d0: 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74  ain anything yet
75e0: 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65  .  It will be re
75f0: 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79  placed.    ** by
7600: 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20   the real entry 
7610: 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  in code generate
7620: 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54  d at sqlite3EndT
7630: 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  able()..    **. 
7640: 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20     ** The rowid 
7650: 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72  for the new entr
7660: 79 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  y is left in reg
7670: 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65  ister pParse->re
7680: 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54  gRowid..    ** T
7690: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
76a0: 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ber of the new t
76b0: 61 62 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20  able is left in 
76c0: 72 65 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52  reg pParse->regR
76d0: 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  oot..    ** The 
76e0: 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70  rowid and root p
76f0: 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65  age number value
7700: 73 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  s are needed by 
7710: 74 68 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20  the code that.  
7720: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54    ** sqlite3EndT
7730: 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61  able will genera
7740: 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21  te..    */.#if !
7750: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7760: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
7770: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7780: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
7790: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 7c      if( isView |
77a0: 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20  | isVirtual ){. 
77b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
77c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
77d0: 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a  eger, 0, reg2);.
77e0: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
77f0: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c  .    {.      sql
7800: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7810: 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65  , OP_CreateTable
7820: 2c 20 69 44 62 2c 20 72 65 67 32 29 3b 0a 20 20  , iDb, reg2);.  
7830: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
7840: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70  penMasterTable(p
7850: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
7860: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7870: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
7880: 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20  d, 0, reg1);.   
7890: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
78a0: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
78b0: 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c  , reg3);.    sql
78c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
78d0: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20  , OP_Insert, 0, 
78e0: 72 65 67 33 2c 20 72 65 67 31 29 3b 0a 20 20 20  reg3, reg1);.   
78f0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7900: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
7910: 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69  PPEND);.    sqli
7920: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
7930: 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a   OP_Close);.  }.
7940: 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f  .  /* Normal (no
7950: 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e  n-error) return.
7960: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20   */.  return;.. 
7970: 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
7980: 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20  occurs, we jump 
7990: 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61  here */.begin_ta
79a0: 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c  ble_error:.  sql
79b0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
79c0: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Name);.  return;
79d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d  .}../*.** This m
79e0: 61 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20  acro is used to 
79f0: 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 72 69  compare two stri
7a00: 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d 69 6e  ngs in a case-in
7a10: 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65 72  sensitive manner
7a20: 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69 67 68  ..** It is sligh
7a30: 74 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e 20  tly faster than 
7a40: 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 53  calling sqlite3S
7a50: 74 72 49 43 6d 70 28 29 20 64 69 72 65 63 74 6c  trICmp() directl
7a60: 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63  y, but.** produc
7a70: 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a  es larger code..
7a80: 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54  **.** WARNING: T
7a90: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74  his macro is not
7aa0: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
7ab0: 20 74 68 65 20 73 74 72 63 6d 70 28 29 20 66 61   the strcmp() fa
7ac0: 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75  mily. It.** retu
7ad0: 72 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 20  rns true if the 
7ae0: 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72 65 20  two strings are 
7af0: 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69 73 65  equal, otherwise
7b00: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69   false..*/.#defi
7b10: 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20 79 29  ne STRICMP(x, y)
7b20: 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72   (\.sqlite3Upper
7b30: 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e  ToLower[*(unsign
7b40: 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d  ed char *)(x)]==
7b50: 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70 70 65     \.sqlite3Uppe
7b60: 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67  rToLower[*(unsig
7b70: 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29 5d 20  ned char *)(y)] 
7b80: 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74 65 33      \.&& sqlite3
7b90: 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c 28 79  StrICmp((x)+1,(y
7ba0: 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a  )+1)==0 )../*.**
7bb0: 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d   Add a new colum
7bc0: 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  n to the table c
7bd0: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
7be0: 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a  onstructed..**.*
7bf0: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
7c00: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
7c10: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f  once for each co
7c20: 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  lumn declaration
7c30: 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20  .** in a CREATE 
7c40: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
7c50: 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
7c60: 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65  ble() gets calle
7c70: 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65  d.** first to ge
7c80: 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20  t things going. 
7c90: 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   Then this routi
7ca0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
7cb0: 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e   each.** column.
7cc0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7cd0: 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20  AddColumn(Parse 
7ce0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
7cf0: 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  pName){.  Table 
7d00: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
7d10: 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e  har *z;.  Column
7d20: 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65   *pCol;.  sqlite
7d30: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
7d40: 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70  db;.  if( (p = p
7d50: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
7d60: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23  )==0 ) return;.#
7d70: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
7d80: 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 6e 43  LUMN.  if( p->nC
7d90: 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  ol+1>db->aLimit[
7da0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
7db0: 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  UMN] ){.    sqli
7dc0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
7dd0: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
7de0: 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d  lumns on %s", p-
7df0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
7e00: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
7e10: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d    z = sqlite3Nam
7e20: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
7e30: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  Name);.  if( z==
7e40: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
7e50: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
7e60: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
7e70: 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43  STRICMP(z, p->aC
7e80: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a  ol[i].zName) ){.
7e90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7ea0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64  orMsg(pParse, "d
7eb0: 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20  uplicate column 
7ec0: 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20  name: %s", z);. 
7ed0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
7ee0: 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20  ee(db, z);.     
7ef0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
7f00: 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f   }.  if( (p->nCo
7f10: 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20  l & 0x7)==0 ){. 
7f20: 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b     Column *aNew;
7f30: 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69  .    aNew = sqli
7f40: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
7f50: 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c  p->aCol,(p->nCol
7f60: 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43  +8)*sizeof(p->aC
7f70: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  ol[0]));.    if(
7f80: 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
7f90: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7fa0: 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65  db, z);.      re
7fb0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
7fc0: 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a  p->aCol = aNew;.
7fd0: 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d    }.  pCol = &p-
7fe0: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a  >aCol[p->nCol];.
7ff0: 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30    memset(pCol, 0
8000: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  , sizeof(p->aCol
8010: 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a  [0]));.  pCol->z
8020: 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a  Name = z;. .  /*
8030: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
8040: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
8050: 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65  columns have the
8060: 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74   default affinit
8070: 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49  y.  ** 'NONE'. I
8080: 66 20 74 68 65 72 65 20 69 73 20 61 20 74 79 70  f there is a typ
8090: 65 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65  e specified, the
80a0: 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  n sqlite3AddColu
80b0: 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20  mnType() will.  
80c0: 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78  ** be called nex
80d0: 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61  t to set pCol->a
80e0: 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c  ffinity correctl
80f0: 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e  y..  */.  pCol->
8100: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
8110: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d  E_AFF_NONE;.  p-
8120: 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nCol++;.}../*.*
8130: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8140: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
8150: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
8160: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
8170: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
8180: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
8190: 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22  t.  A "NOT NULL"
81a0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a   constraint has.
81b0: 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20  ** been seen on 
81c0: 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20  a column.  This 
81d0: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
81e0: 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e   notNull flag on
81f0: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  .** the column c
8200: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
8210: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  onstruction..*/.
8220: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e  void sqlite3AddN
8230: 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50  otNull(Parse *pP
8240: 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f  arse, int onErro
8250: 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  r){.  Table *p;.
8260: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
8270: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
8280: 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e  ==0 || NEVER(p->
8290: 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74 75 72 6e  nCol<1) ) return
82a0: 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e  ;.  p->aCol[p->n
82b0: 43 6f 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d  Col-1].notNull =
82c0: 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 7d 0a   (u8)onError;.}.
82d0: 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20  ./*.** Scan the 
82e0: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65  column type name
82f0: 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e   zType (length n
8300: 54 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e  Type) and return
8310: 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   the.** associat
8320: 65 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65  ed affinity type
8330: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
8340: 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65  tine does a case
8350: 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61  -independent sea
8360: 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72  rch of zType for
8370: 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69   the .** substri
8380: 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ngs in the follo
8390: 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f  wing table. If o
83a0: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
83b0: 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64  ings is.** found
83c0: 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
83d0: 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20  ing affinity is 
83e0: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79  returned. If zTy
83f0: 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d  pe contains.** m
8400: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20  ore than one of 
8410: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20  the substrings, 
8420: 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74  entries toward t
8430: 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68  he top of .** th
8440: 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69  e table take pri
8450: 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70  ority. For examp
8460: 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20  le, if zType is 
8470: 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53  'BLOBINT', .** S
8480: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
8490: 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  R is returned..*
84a0: 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20  *.** Substring  
84b0: 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a     | Affinity.**
84c0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
84d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84e0: 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20  -.** 'INT'      
84f0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
8500: 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52  INTEGER.** 'CHAR
8510: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
8520: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43  E_AFF_TEXT.** 'C
8530: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
8540: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
8550: 20 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c   'TEXT'        |
8560: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
8570: 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20  .** 'BLOB'      
8580: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e    | SQLITE_AFF_N
8590: 4f 4e 45 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20  ONE.** 'REAL'   
85a0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
85b0: 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27  F_REAL.** 'FLOA'
85c0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
85d0: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f  _AFF_REAL.** 'DO
85e0: 55 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  UB'        | SQL
85f0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a  ITE_AFF_REAL.**.
8600: 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  ** If none of th
8610: 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20  e substrings in 
8620: 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20  the above table 
8630: 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51  are found,.** SQ
8640: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
8650: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
8660: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66  .char sqlite3Aff
8670: 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20  inityType(const 
8680: 63 68 61 72 20 2a 7a 49 6e 29 7b 0a 20 20 75 33  char *zIn){.  u3
8690: 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  2 h = 0;.  char 
86a0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
86b0: 5f 4e 55 4d 45 52 49 43 3b 0a 0a 20 20 69 66 28  _NUMERIC;..  if(
86c0: 20 7a 49 6e 20 29 20 77 68 69 6c 65 28 20 7a 49   zIn ) while( zI
86d0: 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20  n[0] ){.    h = 
86e0: 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33  (h<<8) + sqlite3
86f0: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a  UpperToLower[(*z
8700: 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a  In)&0xff];.    z
8710: 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d  In++;.    if( h=
8720: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27  =(('c'<<24)+('h'
8730: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
8740: 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20  r') ){          
8750: 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20     /* CHAR */.  
8760: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
8770: 5f 41 46 46 5f 54 45 58 54 3b 20 0a 20 20 20 20  _AFF_TEXT; .    
8780: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
8790: 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  c'<<24)+('l'<<16
87a0: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20  )+('o'<<8)+'b') 
87b0: 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42  ){       /* CLOB
87c0: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
87d0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
87e0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
87f0: 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65  ==(('t'<<24)+('e
8800: 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b  '<<16)+('x'<<8)+
8810: 27 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a  't') ){       /*
8820: 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61   TEXT */.      a
8830: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
8840: 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20  TEXT;.    }else 
8850: 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34  if( h==(('b'<<24
8860: 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27  )+('l'<<16)+('o'
8870: 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20  <<8)+'b')       
8880: 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20     /* BLOB */.  
8890: 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53        && (aff==S
88a0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
88b0: 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  C || aff==SQLITE
88c0: 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20  _AFF_REAL) ){.  
88d0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
88e0: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66 6e 64  _AFF_NONE;.#ifnd
88f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
8900: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
8910: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
8920: 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c  ('r'<<24)+('e'<<
8930: 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27  16)+('a'<<8)+'l'
8940: 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45  )          /* RE
8950: 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26  AL */.        &&
8960: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
8970: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
8980: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
8990: 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c  FF_REAL;.    }el
89a0: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c  se if( h==(('f'<
89b0: 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28  <24)+('l'<<16)+(
89c0: 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20  'o'<<8)+'a')    
89d0: 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f        /* FLOA */
89e0: 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d  .        && aff=
89f0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
8a00: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66  RIC ){.      aff
8a10: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   = SQLITE_AFF_RE
8a20: 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  AL;.    }else if
8a30: 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b  ( h==(('d'<<24)+
8a40: 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c  ('o'<<16)+('u'<<
8a50: 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20  8)+'b')         
8a60: 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20   /* DOUB */.    
8a70: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
8a80: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
8a90: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
8aa0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23  LITE_AFF_REAL;.#
8ab0: 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20  endif.    }else 
8ac0: 69 66 28 20 28 68 26 30 78 30 30 46 46 46 46 46  if( (h&0x00FFFFF
8ad0: 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28  F)==(('i'<<16)+(
8ae0: 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20  'n'<<8)+'t') ){ 
8af0: 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20     /* INT */.   
8b00: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8b10: 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  AFF_INTEGER;.   
8b20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8b30: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 66    }..  return af
8b40: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  f;.}../*.** This
8b50: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
8b60: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
8b70: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
8b80: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
8b90: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
8ba0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  E statement.  Th
8bb0: 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69  e pFirst token i
8bc0: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74  s the first.** t
8bd0: 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75  oken in the sequ
8be0: 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74  ence of tokens t
8bf0: 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65  hat describe the
8c00: 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20   type of the.** 
8c10: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
8c20: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
8c30: 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20  ion.   pLast is 
8c40: 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a  the last token.*
8c50: 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63  * in the sequenc
8c60: 65 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e 66  e.  Use this inf
8c70: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73  ormation to cons
8c80: 74 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a  truct a string.*
8c90: 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  * that contains 
8ca0: 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20  the typename of 
8cb0: 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73  the column and s
8cc0: 74 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e 67  tore that string
8cd0: 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f  .** in zType..*/
8ce0: 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64   .void sqlite3Ad
8cf0: 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73  dColumnType(Pars
8d00: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
8d10: 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c   *pType){.  Tabl
8d20: 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  e *p;.  Column *
8d30: 70 43 6f 6c 3b 0a 0a 20 20 70 20 3d 20 70 50 61  pCol;..  p = pPa
8d40: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
8d50: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45    if( p==0 || NE
8d60: 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29  VER(p->nCol<1) )
8d70: 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20   return;.  pCol 
8d80: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43  = &p->aCol[p->nC
8d90: 6f 6c 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ol-1];.  assert(
8da0: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20   pCol->zType==0 
8db0: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  );.  pCol->zType
8dc0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
8dd0: 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
8de0: 64 62 2c 20 70 54 79 70 65 29 3b 0a 20 20 70 43  db, pType);.  pC
8df0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
8e00: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
8e10: 70 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b  pe(pCol->zType);
8e20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78  .}../*.** The ex
8e30: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
8e40: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
8e50: 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
8e60: 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e  tly added column
8e70: 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65  .** of the table
8e80: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
8e90: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
8ea0: 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c  *.** Default val
8eb0: 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d  ue expressions m
8ec0: 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e  ust be constant.
8ed0: 20 20 52 61 69 73 65 20 61 6e 20 65 78 63 65 70    Raise an excep
8ee0: 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20  tion if this.** 
8ef0: 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e  is not the case.
8f00: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
8f10: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
8f20: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
8f30: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
8f40: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
8f50: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
8f60: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
8f70: 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c  sqlite3AddDefaul
8f80: 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50  tValue(Parse *pP
8f90: 61 72 73 65 2c 20 45 78 70 72 53 70 61 6e 20 2a  arse, ExprSpan *
8fa0: 70 53 70 61 6e 29 7b 0a 20 20 54 61 62 6c 65 20  pSpan){.  Table 
8fb0: 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *p;.  Column *pC
8fc0: 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ol;.  sqlite3 *d
8fd0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
8fe0: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
8ff0: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
9000: 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20  !=0 ){.    pCol 
9010: 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e  = &(p->aCol[p->n
9020: 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28  Col-1]);.    if(
9030: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
9040: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
9050: 6e 28 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 20  n(pSpan->pExpr) 
9060: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9070: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9080: 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20   "default value 
9090: 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69  of column [%s] i
90a0: 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c  s not constant",
90b0: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d  .          pCol-
90c0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  >zName);.    }el
90d0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63  se{.      /* A c
90e0: 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69 73 20  opy of pExpr is 
90f0: 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  used instead of 
9100: 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73  the original, as
9110: 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a   pExpr contains.
9120: 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20        ** tokens 
9130: 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f  that point to vo
9140: 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 20 54  latile memory. T
9150: 68 65 20 27 73 70 61 6e 27 20 6f 66 20 74 68 65  he 'span' of the
9160: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
9170: 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
9180: 20 62 79 20 70 72 61 67 6d 61 20 74 61 62 6c 65   by pragma table
9190: 5f 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a  _info..      */.
91a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
91b0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  rDelete(db, pCol
91c0: 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->pDflt);.      
91d0: 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71  pCol->pDflt = sq
91e0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
91f0: 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c 20 45   pSpan->pExpr, E
9200: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
9210: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
9220: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44  ree(db, pCol->zD
9230: 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c  flt);.      pCol
9240: 2d 3e 7a 44 66 6c 74 20 3d 20 73 71 6c 69 74 65  ->zDflt = sqlite
9250: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28  3DbStrNDup(db, (
9260: 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74  char*)pSpan->zSt
9270: 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  art,.           
9280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9290: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
92a0: 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53  pSpan->zEnd - pS
92b0: 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20  pan->zStart));. 
92c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
92d0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
92e0: 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 3b 0a   pSpan->pExpr);.
92f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61  }../*.** Designa
9300: 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  te the PRIMARY K
9310: 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  EY for the table
9320: 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  .  pList is a li
9330: 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20  st of names .** 
9340: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
9350: 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79  form the primary
9360: 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20   key.  If pList 
9370: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
9380: 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74  e.** most recent
9390: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20  ly added column 
93a0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
93b0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
93c0: 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63  .**.** A table c
93d0: 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  an have at most 
93e0: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  one primary key.
93f0: 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61    If the table a
9400: 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20  lready has.** a 
9410: 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64  primary key (and
9420: 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63   this is the sec
9430: 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29  ond primary key)
9440: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a   then create an.
9450: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
9460: 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  If the PRIMARY K
9470: 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c  EY is on a singl
9480: 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64  e column whose d
9490: 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47  atatype is INTEG
94a0: 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77  ER,.** then we w
94b0: 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74  ill try to use t
94c0: 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  hat column as th
94d0: 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68  e rowid.  Set th
94e0: 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a  e Table.iPKey.**
94f0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61   field of the ta
9500: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
9510: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65  uction to be the
9520: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
9530: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
9540: 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61   KEY column.  Ta
9550: 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74  ble.iPKey is set
9560: 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20   to -1 if there 
9570: 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52  is.** no INTEGER
9580: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a   PRIMARY KEY..**
9590: 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69  .** If the key i
95a0: 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52  s not an INTEGER
95b0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68   PRIMARY KEY, th
95c0: 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  en create a uniq
95d0: 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20  ue.** index for 
95e0: 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64  the key.  No ind
95f0: 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f  ex is created fo
9600: 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  r INTEGER PRIMAR
9610: 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20  Y KEYs..*/.void 
9620: 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72  sqlite3AddPrimar
9630: 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  yKey(.  Parse *p
9640: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
9650: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
9660: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
9670: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66  t,  /* List of f
9680: 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65  ield names to be
9690: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
96a0: 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
96b0: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
96c0: 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20  th a uniqueness 
96d0: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e  conflict */.  in
96e0: 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20  t autoInc,      
96f0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41  /* True if the A
9700: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79  UTOINCREMENT key
9710: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
9720: 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
9730: 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  er     /* SQLITE
9740: 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54  _SO_ASC or SQLIT
9750: 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a  E_SO_DESC */.){.
9760: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
9770: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
9780: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65  e;.  char *zType
9790: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c   = 0;.  int iCol
97a0: 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20   = -1, i;.  if( 
97b0: 70 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45  pTab==0 || IN_DE
97c0: 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74  CLARE_VTAB ) got
97d0: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
97e0: 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  it;.  if( pTab->
97f0: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61  tabFlags & TF_Ha
9800: 73 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20  sPrimaryKey ){. 
9810: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
9820: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
9830: 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20    "table \"%s\" 
9840: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
9850: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20  e primary key", 
9860: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
9870: 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b    goto primary_k
9880: 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70  ey_exit;.  }.  p
9890: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
98a0: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
98b0: 79 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  y;.  if( pList==
98c0: 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  0 ){.    iCol = 
98d0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a  pTab->nCol - 1;.
98e0: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
98f0: 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d  Col].isPrimKey =
9900: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
9910: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
9920: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
9930: 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30        for(iCol=0
9940: 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ; iCol<pTab->nCo
9950: 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
9960: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
9970: 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
9980: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i].zName, pTab->
9990: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
99a0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
99b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
99c0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
99d0: 20 69 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e   if( iCol<pTab->
99e0: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
99f0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
9a00: 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a  .isPrimKey = 1;.
9a10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9a20: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78    if( pList->nEx
9a30: 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31  pr>1 ) iCol = -1
9a40: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  ;.  }.  if( iCol
9a50: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
9a60: 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54  ->nCol ){.    zT
9a70: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
9a80: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
9a90: 7d 0a 20 20 69 66 28 20 7a 54 79 70 65 20 26 26  }.  if( zType &&
9aa0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
9ab0: 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22  zType, "INTEGER"
9ac0: 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20  )==0.        && 
9ad0: 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54  sortOrder==SQLIT
9ae0: 45 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20  E_SO_ASC ){.    
9af0: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43  pTab->iPKey = iC
9b00: 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65  ol;.    pTab->ke
9b10: 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72  yConf = (u8)onEr
9b20: 72 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ror;.    assert(
9b30: 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61   autoInc==0 || a
9b40: 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20  utoInc==1 );.   
9b50: 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
9b60: 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75  |= autoInc*TF_Au
9b70: 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 7d  toincrement;.  }
9b80: 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63  else if( autoInc
9b90: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
9ba0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
9bb0: 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65  EMENT.    sqlite
9bc0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
9bd0: 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  , "AUTOINCREMENT
9be0: 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64   is only allowed
9bf0: 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20   on an ".       
9c00: 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59  "INTEGER PRIMARY
9c10: 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20   KEY");.#endif. 
9c20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65   }else{.    Inde
9c30: 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71  x *p;.    p = sq
9c40: 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
9c50: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30  (pParse, 0, 0, 0
9c60: 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72  , pList, onError
9c70: 2c 20 30 2c 20 30 2c 20 73 6f 72 74 4f 72 64 65  , 0, 0, sortOrde
9c80: 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 0);.    if( p
9c90: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74   ){.      p->aut
9ca0: 6f 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20 20 20  oIndex = 2;.    
9cb0: 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b  }.    pList = 0;
9cc0: 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65  .  }..primary_ke
9cd0: 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65  y_exit:.  sqlite
9ce0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
9cf0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73  pParse->db, pLis
9d00: 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  t);.  return;.}.
9d10: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
9d20: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
9d30: 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  t to the table c
9d40: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
9d50: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  onstruction..*/.
9d60: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
9d70: 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a  heckConstraint(.
9d80: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9d90: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
9da0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
9db0: 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a   *pCheckExpr  /*
9dc0: 20 54 68 65 20 63 68 65 63 6b 20 65 78 70 72 65   The check expre
9dd0: 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e  ssion */.){.#ifn
9de0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9df0: 43 48 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70  CHECK.  Table *p
9e00: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
9e10: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
9e20: 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41  Tab && !IN_DECLA
9e30: 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 70  RE_VTAB ){.    p
9e40: 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71  Tab->pCheck = sq
9e50: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
9e60: 65 6e 64 28 70 50 61 72 73 65 2c 20 70 54 61 62  end(pParse, pTab
9e70: 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68 65 63 6b  ->pCheck, pCheck
9e80: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
9e90: 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e  Parse->constrain
9ea0: 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20 20 20 20  tName.n ){.     
9eb0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9ec0: 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  SetName(pParse, 
9ed0: 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 26 70  pTab->pCheck, &p
9ee0: 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e  Parse->constrain
9ef0: 74 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20 7d  tName, 1);.    }
9f00: 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
9f10: 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45    {.    sqlite3E
9f20: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
9f30: 2d 3e 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72  ->db, pCheckExpr
9f40: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
9f50: 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  Set the collatio
9f60: 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68  n function of th
9f70: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
9f80: 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c  parsed table col
9f90: 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f  umn.** to the Co
9fa0: 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a  llSeq given..*/.
9fb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
9fc0: 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73 65  ollateType(Parse
9fd0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
9fe0: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c  *pToken){.  Tabl
9ff0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
a000: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20   char *zColl;   
a010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
a020: 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63  quoted name of c
a030: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
a040: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
a050: 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20  db;..  if( (p = 
a060: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
a070: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
a080: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
a090: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
a0a0: 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71  db;.  zColl = sq
a0b0: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
a0c0: 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a  en(db, pToken);.
a0d0: 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72    if( !zColl ) r
a0e0: 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71  eturn;..  if( sq
a0f0: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
a100: 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  eq(pParse, zColl
a110: 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  ) ){.    Index *
a120: 70 49 64 78 3b 0a 20 20 20 20 70 2d 3e 61 43 6f  pIdx;.    p->aCo
a130: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f  l[i].zColl = zCo
a140: 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66  ll;.  .    /* If
a150: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64   the column is d
a160: 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d  eclared as "<nam
a170: 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43  e> PRIMARY KEY C
a180: 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a  OLLATE <type>",.
a190: 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69      ** then an i
a1a0: 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65  ndex may have be
a1b0: 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68  en created on th
a1c0: 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65  is column before
a1d0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c   the.    ** coll
a1e0: 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61  ation type was a
a1f0: 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68  dded. Correct th
a200: 69 73 20 69 66 20 69 74 20 69 73 20 74 68 65 20  is if it is the 
a210: 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
a220: 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e   for(pIdx=p->pIn
a230: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
a240: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
a250: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
a260: 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ->nColumn==1 );.
a270: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
a280: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29  aiColumn[0]==i )
a290: 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  {.        pIdx->
a2a0: 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61  azColl[0] = p->a
a2b0: 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[i].zColl;.  
a2c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
a2d0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
a2e0: 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c  DbFree(db, zColl
a2f0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
a300: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
a310: 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74  turns the collat
a320: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
a330: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
a340: 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e   text.** encodin
a350: 67 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  g identified by 
a360: 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65  the string zName
a370: 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a  , length nName..
a380: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71  **.** If the req
a390: 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  uested collation
a3a0: 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74   sequence is not
a3b0: 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e   available, or n
a3c0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  ot available.** 
a3d0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
a3e0: 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c  native encoding,
a3f0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
a400: 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65  actory is invoke
a410: 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20  d to.** request 
a420: 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61  it. If the colla
a430: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65  tion factory doe
a440: 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63  s not supply suc
a450: 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a  h a sequence,.**
a460: 20 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63   and the sequenc
a470: 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69  e is available i
a480: 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65  n another text e
a490: 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68  ncoding, then th
a4a0: 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  at is.** returne
a4b0: 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  d instead..**.**
a4c0: 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20   If no versions 
a4d0: 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  of the requested
a4e0: 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75   collations sequ
a4f0: 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61 62  ence are availab
a500: 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65  le, or.** anothe
a510: 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  r error occurs, 
a520: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
a530: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65   and an error me
a540: 73 73 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e  ssage written in
a550: 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a  to.** pParse..**
a560: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
a570: 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
a580: 6f 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64  ound sqlite3Find
a590: 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73  CollSeq().  This
a5a0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f   routine.** invo
a5b0: 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  kes the collatio
a5c0: 6e 20 66 61 63 74 6f 72 79 20 69 66 20 74 68 65  n factory if the
a5d0: 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e   named collation
a5e0: 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
a5f0: 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65  .** and generate
a600: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
a610: 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  ge..**.** See al
a620: 73 6f 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43  so: sqlite3FindC
a630: 6f 6c 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65  ollSeq(), sqlite
a640: 33 47 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f  3GetCollSeq().*/
a650: 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65  .CollSeq *sqlite
a660: 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50  3LocateCollSeq(P
a670: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
a680: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
a690: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
a6a0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
a6b0: 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  u8 enc = ENC(db)
a6c0: 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79 20  ;.  u8 initbusy 
a6d0: 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b  = db->init.busy;
a6e0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
a6f0: 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71  l;..  pColl = sq
a700: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
a710: 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c  (db, enc, zName,
a720: 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66   initbusy);.  if
a730: 28 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28  ( !initbusy && (
a740: 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c  !pColl || !pColl
a750: 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70  ->xCmp) ){.    p
a760: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
a770: 74 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63  tCollSeq(db, enc
a780: 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b  , pColl, zName);
a790: 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20  .    if( !pColl 
a7a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a7b0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
a7c0: 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74   "no such collat
a7d0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25 73  ion sequence: %s
a7e0: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  ", zName);.    }
a7f0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
a800: 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Coll;.}.../*.** 
a810: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
a820: 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e  at will incremen
a830: 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  t the schema coo
a840: 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  kie..**.** The s
a850: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20  chema cookie is 
a860: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
a870: 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d  e when the schem
a880: 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74  a for the.** dat
a890: 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20  abase changes.  
a8a0: 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65 6d  After each schem
a8b0: 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f  a change, the co
a8c0: 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68  okie value.** ch
a8d0: 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70  anges.  When a p
a8e0: 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65 61  rocess first rea
a8f0: 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69 74  ds the schema it
a900: 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20   records the.** 
a910: 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66  cookie.  Thereaf
a920: 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74  ter, whenever it
a930: 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20   goes to access 
a940: 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a  the database,.**
a950: 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20 63   it checks the c
a960: 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75  ookie to make su
a970: 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68 61  re the schema ha
a980: 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a  s not changed.**
a990: 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61   since it was la
a9a0: 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54  st read..**.** T
a9b0: 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20  his plan is not 
a9c0: 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65  completely bulle
a9d0: 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20  t-proof.  It is 
a9e0: 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20  possible for.** 
a9f0: 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68  the schema to ch
aa00: 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69  ange multiple ti
aa10: 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20  mes and for the 
aa20: 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20  cookie to be.** 
aa30: 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f  set back to prio
aa40: 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63  r value.  But sc
aa50: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65  hema changes are
aa60: 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61   infrequent.** a
aa70: 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  nd the probabili
aa80: 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68  ty of hitting th
aa90: 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61  e same cookie va
aaa0: 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31  lue is only.** 1
aab0: 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e   chance in 2^32.
aac0: 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65 20    So we're safe 
aad0: 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20  enough..*/.void 
aae0: 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
aaf0: 6b 69 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  kie(Parse *pPars
ab00: 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69  e, int iDb){.  i
ab10: 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
ab20: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
ab30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  );.  sqlite3 *db
ab40: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
ab50: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
ab60: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
ab70: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
ab80: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
ab90: 44 62 2c 20 30 29 20 29 3b 0a 20 20 73 71 6c 69  Db, 0) );.  sqli
aba0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
abb0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d   OP_Integer, db-
abc0: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
abd0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
abe0: 2b 31 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74  +1, r1);.  sqlit
abf0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ac00: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
ac10: 62 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f  b, BTREE_SCHEMA_
ac20: 56 45 52 53 49 4f 4e 2c 20 72 31 29 3b 0a 20 20  VERSION, r1);.  
ac30: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
ac40: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
ac50: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73  );.}../*.** Meas
ac60: 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ure the number o
ac70: 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65  f characters nee
ac80: 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68  ded to output th
ac90: 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74  e given.** ident
aca0: 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62  ifier.  The numb
acb0: 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c  er returned incl
acc0: 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20  udes any quotes 
acd0: 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73  used.** but does
ace0: 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65   not include the
acf0: 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72   null terminator
ad00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69  ..**.** The esti
ad10: 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61  mate is conserva
ad20: 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20  tive.  It might 
ad30: 62 65 20 6c 61 72 67 65 72 20 74 68 61 74 20 77  be larger that w
ad40: 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79  hat is.** really
ad50: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
ad60: 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67  ic int identLeng
ad70: 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  th(const char *z
ad80: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f  ){.  int n;.  fo
ad90: 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20  r(n=0; *z; n++, 
ada0: 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a  z++){.    if( *z
adb0: 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a  =='"' ){ n++; }.
adc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b    }.  return n +
add0: 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   2;.}../*.** The
ade0: 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72   first parameter
adf0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
ae00: 20 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65   an output buffe
ae10: 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a  r. The second .*
ae20: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  * parameter is a
ae30: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
ae40: 6e 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74  nteger that cont
ae50: 61 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20  ains the offset 
ae60: 61 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77  at.** which to w
ae70: 72 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  rite into the ou
ae80: 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 69  tput buffer. Thi
ae90: 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65  s function copie
aea0: 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72  s the.** nul-ter
aeb0: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70  minated string p
aec0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65  ointed to by the
aed0: 20 74 68 69 72 64 20 70 61 72 61 6d 65 74 65 72   third parameter
aee0: 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a  , zSignedIdent,.
aef0: 2a 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  ** to the specif
af00: 69 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68  ied offset in th
af10: 65 20 62 75 66 66 65 72 20 61 6e 64 20 75 70 64  e buffer and upd
af20: 61 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65  ates *pIdx to re
af30: 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69  fer.** to the fi
af40: 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20 74  rst byte after t
af50: 68 65 20 6c 61 73 74 20 62 79 74 65 20 77 72 69  he last byte wri
af60: 74 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75  tten before retu
af70: 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  rning..** .** If
af80: 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67   the string zSig
af90: 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74  nedIdent consist
afa0: 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c  s entirely of al
afb0: 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63  pha-numeric.** c
afc0: 68 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20  haracters, does 
afd0: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  not begin with a
afe0: 20 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f   digit and is no
aff0: 74 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64  t an SQL keyword
b000: 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20  ,.** then it is 
b010: 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75  copied to the ou
b020: 74 70 75 74 20 62 75 66 66 65 72 20 65 78 61 63  tput buffer exac
b030: 74 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74  tly as it is. Ot
b040: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69  herwise,.** it i
b050: 73 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64  s quoted using d
b060: 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f  ouble-quotes..*/
b070: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65  .static void ide
b080: 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69  ntPut(char *z, i
b090: 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a  nt *pIdx, char *
b0a0: 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20  zSignedIdent){. 
b0b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
b0c0: 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e  zIdent = (unsign
b0d0: 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64  ed char*)zSigned
b0e0: 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20  Ident;.  int i, 
b0f0: 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20  j, needQuote;.  
b100: 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f  i = *pIdx;..  fo
b110: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
b120: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; j++){.    if( 
b130: 21 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28  !sqlite3Isalnum(
b140: 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49  zIdent[j]) && zI
b150: 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62  dent[j]!='_' ) b
b160: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64  reak;.  }.  need
b170: 51 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49  Quote = sqlite3I
b180: 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d  sdigit(zIdent[0]
b190: 29 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77  ) || sqlite3Keyw
b1a0: 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20  ordCode(zIdent, 
b1b0: 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28  j)!=TK_ID;.  if(
b1c0: 20 21 6e 65 65 64 51 75 6f 74 65 20 29 7b 0a 20   !needQuote ){. 
b1d0: 20 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 7a     needQuote = z
b1e0: 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 7d 0a 0a 20  Ident[j];.  }.. 
b1f0: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
b200: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
b210: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
b220: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a  [j]; j++){.    z
b230: 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a  [i++] = zIdent[j
b240: 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e  ];.    if( zIden
b250: 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b  t[j]=='"' ) z[i+
b260: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20  +] = '"';.  }.  
b270: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
b280: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
b290: 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64  z[i] = 0;.  *pId
b2a0: 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x = i;.}../*.** 
b2b0: 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54  Generate a CREAT
b2c0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
b2d0: 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  t appropriate fo
b2e0: 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74  r the given.** t
b2f0: 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f  able.  Memory to
b300: 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f   hold the text o
b310: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
b320: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66  is obtained.** f
b330: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
b340: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
b350: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
b360: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
b370: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72  .static char *cr
b380: 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71  eateTableStmt(sq
b390: 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65  lite3 *db, Table
b3a0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b   *p){.  int i, k
b3b0: 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74  , n;.  char *zSt
b3c0: 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70  mt;.  char *zSep
b3d0: 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b  , *zSep2, *zEnd;
b3e0: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
b3f0: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  n = 0;.  for(
b400: 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20  pCol = p->aCol, 
b410: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
b420: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
b430: 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67    n += identLeng
b440: 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20  th(pCol->zName) 
b450: 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  + 5;.  }.  n += 
b460: 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a  identLength(p->z
b470: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35  Name);.  if( n<5
b480: 30 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d  0 ){ .    zSep =
b490: 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d   "";.    zSep2 =
b4a0: 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d   ",";.    zEnd =
b4b0: 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   ")";.  }else{. 
b4c0: 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22     zSep = "\n  "
b4d0: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
b4e0: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20  \n  ";.    zEnd 
b4f0: 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e  = "\n)";.  }.  n
b500: 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43   += 35 + 6*p->nC
b510: 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71  ol;.  zStmt = sq
b520: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
b530: 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53  (0, n);.  if( zS
b540: 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62  tmt==0 ){.    db
b550: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
b560: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   1;.    return 0
b570: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
b580: 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d  snprintf(n, zStm
b590: 74 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  t, "CREATE TABLE
b5a0: 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74   ");.  k = sqlit
b5b0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74  e3Strlen30(zStmt
b5c0: 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53  );.  identPut(zS
b5d0: 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d  tmt, &k, p->zNam
b5e0: 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d  e);.  zStmt[k++]
b5f0: 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43   = '(';.  for(pC
b600: 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b  ol=p->aCol, i=0;
b610: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c   i<p->nCol; i++,
b620: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74   pCol++){.    st
b630: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
b640: 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d  * const azType[]
b650: 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20   = {.        /* 
b660: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
b670: 20 20 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20     */ " TEXT",. 
b680: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
b690: 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20 2a 2f 20  _AFF_NONE    */ 
b6a0: 22 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  "",.        /* S
b6b0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
b6c0: 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20  C */ " NUM",.   
b6d0: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
b6e0: 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20  FF_INTEGER */ " 
b6f0: 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  INT",.        /*
b700: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
b710: 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20      */ " REAL". 
b720: 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65     };.    int le
b730: 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  n;.    const cha
b740: 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73  r *zType;..    s
b750: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
b760: 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20  n-k, &zStmt[k], 
b770: 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20  zSep);.    k += 
b780: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
b790: 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20  &zStmt[k]);.    
b7a0: 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20  zSep = zSep2;.  
b7b0: 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74    identPut(zStmt
b7c0: 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  , &k, pCol->zNam
b7d0: 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
b7e0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53  pCol->affinity-S
b7f0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 3e  QLITE_AFF_TEXT >
b800: 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  = 0 );.    asser
b810: 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  t( pCol->affinit
b820: 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  y-SQLITE_AFF_TEX
b830: 54 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61 7a  T < ArraySize(az
b840: 54 79 70 65 29 20 29 3b 0a 20 20 20 20 74 65 73  Type) );.    tes
b850: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
b860: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
b870: 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65  F_TEXT );.    te
b880: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
b890: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
b8a0: 46 46 5f 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 74  FF_NONE );.    t
b8b0: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
b8c0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
b8d0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20  AFF_NUMERIC );. 
b8e0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
b8f0: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
b900: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
b910: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
b920: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
b930: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
b940: 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79   );.    .    zTy
b950: 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c  pe = azType[pCol
b960: 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c  ->affinity - SQL
b970: 49 54 45 5f 41 46 46 5f 54 45 58 54 5d 3b 0a 20  ITE_AFF_TEXT];. 
b980: 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33     len = sqlite3
b990: 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b  Strlen30(zType);
b9a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f  .    assert( pCo
b9b0: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
b9c0: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 0a 20 20  ITE_AFF_NONE .  
b9d0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f            || pCo
b9e0: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c  l->affinity==sql
b9f0: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
ba00: 28 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20 6d  (zType) );.    m
ba10: 65 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c  emcpy(&zStmt[k],
ba20: 20 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20   zType, len);.  
ba30: 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20    k += len;.    
ba40: 61 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a  assert( k<=n );.
ba50: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e    }.  sqlite3_sn
ba60: 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74  printf(n-k, &zSt
ba70: 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e  mt[k], "%s", zEn
ba80: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74  d);.  return zSt
ba90: 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  mt;.}../*.** Thi
baa0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
bab0: 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  led to report th
bac0: 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74  e final ")" that
bad0: 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61   terminates.** a
bae0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
baf0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
bb00: 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  he table structu
bb10: 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63  re that other ac
bb20: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61  tion routines ha
bb30: 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67  ve been building
bb40: 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
bb50: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  the internal has
bb60: 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69  h tables, assumi
bb70: 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76  ng no errors hav
bb80: 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a  e.** occurred..*
bb90: 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f  *.** An entry fo
bba0: 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d  r the table is m
bbb0: 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65  ade in the maste
bbc0: 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c  r table on disk,
bbd0: 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20   unless.** this 
bbe0: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
bbf0: 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74  able or db->init
bc00: 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20  .busy==1.  When 
bc10: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
bc20: 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20  .** it means we 
bc30: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
bc40: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
bc50: 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a  ble because we j
bc60: 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64  ust.** connected
bc70: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
bc80: 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
bc90: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
bca0: 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e  ble has.** recen
bcb0: 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20  tly changed, so 
bcc0: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
bcd0: 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  is table already
bce0: 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68   exists in.** th
bcf0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
bd00: 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f  table.  We do no
bd10: 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65  t want to create
bd20: 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a   it again..**.**
bd30: 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20   If the pSelect 
bd40: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
bd50: 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74  NULL, it means t
bd60: 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hat this routine
bd70: 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74  .** was called t
bd80: 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65  o create a table
bd90: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
bda0: 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41  a .** "CREATE TA
bdb0: 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  BLE ... AS SELEC
bdc0: 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74  T ..." statement
bdd0: 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  .  The column na
bde0: 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  mes of.** the ne
bdf0: 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74  w table will mat
be00: 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ch the result se
be10: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  t of the SELECT.
be20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
be30: 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73  EndTable(.  Pars
be40: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
be50: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
be60: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
be70: 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20  *pCons,         
be80: 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b    /* The ',' tok
be90: 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  en after the las
bea0: 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a  t column defn. *
beb0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c  /.  Token *pEnd,
bec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
bed0: 68 65 20 66 69 6e 61 6c 20 27 29 27 20 74 6f 6b  he final ')' tok
bee0: 65 6e 20 69 6e 20 74 68 65 20 43 52 45 41 54 45  en in the CREATE
bef0: 20 54 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c 65   TABLE */.  Sele
bf00: 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
bf10: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72      /* Select fr
bf20: 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e  om a "CREATE ...
bf30: 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29   AS SELECT" */.)
bf40: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
bf50: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
bf60: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
bf70: 69 44 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e  iDb;..  if( (pEn
bf80: 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d  d==0 && pSelect=
bf90: 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  =0) || db->mallo
bfa0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
bfb0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 20 3d  eturn;.  }.  p =
bfc0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
bfd0: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  le;.  if( p==0 )
bfe0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
bff0: 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
c000: 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29  sy || !pSelect )
c010: 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  ;..  iDb = sqlit
c020: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
c030: 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b  db, p->pSchema);
c040: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c050: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a  _OMIT_CHECK.  /*
c060: 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69   Resolve names i
c070: 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73  n all CHECK cons
c080: 74 72 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f  traint expressio
c090: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ns..  */.  if( p
c0a0: 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20  ->pCheck ){.    
c0b0: 53 72 63 4c 69 73 74 20 73 53 72 63 3b 20 20 20  SrcList sSrc;   
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0d0: 2f 2a 20 46 61 6b 65 20 53 72 63 4c 69 73 74 20  /* Fake SrcList 
c0e0: 66 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  for pParse->pNew
c0f0: 54 61 62 6c 65 20 2a 2f 0a 20 20 20 20 4e 61 6d  Table */.    Nam
c100: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20  eContext sNC;   
c110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c120: 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
c130: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
c140: 6c 65 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69  le */.    ExprLi
c150: 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  st *pList;      
c160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
c170: 74 20 6f 66 20 61 6c 6c 20 43 48 45 43 4b 20 63  t of all CHECK c
c180: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
c190: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
c1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1b0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
c1c0: 72 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74  r */..    memset
c1d0: 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
c1e0: 28 73 4e 43 29 29 3b 0a 20 20 20 20 6d 65 6d 73  (sNC));.    mems
c1f0: 65 74 28 26 73 53 72 63 2c 20 30 2c 20 73 69 7a  et(&sSrc, 0, siz
c200: 65 6f 66 28 73 53 72 63 29 29 3b 0a 20 20 20 20  eof(sSrc));.    
c210: 73 53 72 63 2e 6e 53 72 63 20 3d 20 31 3b 0a 20  sSrc.nSrc = 1;. 
c220: 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 7a 4e 61     sSrc.a[0].zNa
c230: 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 20  me = p->zName;. 
c240: 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 70 54 61     sSrc.a[0].pTa
c250: 62 20 3d 20 70 3b 0a 20 20 20 20 73 53 72 63 2e  b = p;.    sSrc.
c260: 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d  a[0].iCursor = -
c270: 31 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73  1;.    sNC.pPars
c280: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
c290: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 26  sNC.pSrcList = &
c2a0: 73 53 72 63 3b 0a 20 20 20 20 73 4e 43 2e 69 73  sSrc;.    sNC.is
c2b0: 43 68 65 63 6b 20 3d 20 31 3b 0a 20 20 20 20 70  Check = 1;.    p
c2c0: 4c 69 73 74 20 3d 20 70 2d 3e 70 43 68 65 63 6b  List = p->pCheck
c2d0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
c2e0: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
c2f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
c300: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
c310: 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 4c 69  rNames(&sNC, pLi
c320: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  st->a[i].pExpr) 
c330: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
c340: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
c350: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  .  }.#endif /* !
c360: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
c370: 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20  MIT_CHECK) */.. 
c380: 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69   /* If the db->i
c390: 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69 74  nit.busy is 1 it
c3a0: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
c3b0: 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66  ading the SQL of
c3c0: 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69  f the.  ** "sqli
c3d0: 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73  te_master" or "s
c3e0: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
c3f0: 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  r" table on the 
c400: 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f  disk..  ** So do
c410: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
c420: 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45  e disk again.  E
c430: 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20  xtract the root 
c440: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
c450: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66   for the table f
c460: 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74  rom the db->init
c470: 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20  .newTnum field. 
c480: 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65   (The page numbe
c490: 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61  r.  ** should ha
c4a0: 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72  ve been put ther
c4b0: 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f  e by the sqliteO
c4c0: 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a  penCb routine.).
c4d0: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
c4e0: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
c4f0: 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e  p->tnum = db->in
c500: 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a  it.newTnum;.  }.
c510: 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69  .  /* If not ini
c520: 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20  tializing, then 
c530: 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20  create a record 
c540: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
c550: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51  e.  ** in the SQ
c560: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
c570: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
c580: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
c590: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52  this is a TEMPOR
c5a0: 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65  ARY table, write
c5b0: 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20   the entry into 
c5c0: 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20  the auxiliary.  
c5d0: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  ** file instead 
c5e0: 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  of into the main
c5f0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
c600: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
c610: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
c620: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65   int n;.    Vdbe
c630: 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   *v;.    char *z
c640: 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65  Type;    /* "vie
c650: 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f  w" or "table" */
c660: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
c670: 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f  2;   /* "VIEW" o
c680: 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20  r "TABLE" */.   
c690: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20   char *zStmt;   
c6a0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20   /* Text of the 
c6b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20  CREATE TABLE or 
c6c0: 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
c6d0: 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20  ement */..    v 
c6e0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
c6f0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
c700: 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
c710: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c  return;..    sql
c720: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
c730: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a  , OP_Close, 0);.
c740: 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20  .    /* .    ** 
c750: 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65  Initialize zType
c760: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69 65   for the new vie
c770: 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20 20  w or table..    
c780: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53  */.    if( p->pS
c790: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
c7a0: 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74    /* A regular t
c7b0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54  able */.      zT
c7c0: 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20  ype = "table";. 
c7d0: 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54       zType2 = "T
c7e0: 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53  ABLE";.#ifndef S
c7f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
c800: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c810: 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20   /* A view */.  
c820: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65      zType = "vie
c830: 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32  w";.      zType2
c840: 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69   = "VIEW";.#endi
c850: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
c860: 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45  If this is a CRE
c870: 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20  ATE TABLE xx AS 
c880: 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63  SELECT ..., exec
c890: 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20  ute the SELECT. 
c8a0: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
c8b0: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
c8c0: 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72  new table. The r
c8d0: 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20  oot-page number 
c8e0: 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  for the.    ** n
c8f0: 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20 72  ew table is in r
c900: 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e  egister pParse->
c910: 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a  regRoot..    **.
c920: 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20      ** Once the 
c930: 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20  SELECT has been 
c940: 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33  coded by sqlite3
c950: 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20  Select(), it is 
c960: 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74  in a.    ** suit
c970: 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75  able state to qu
c980: 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ery for the colu
c990: 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70  mn names and typ
c9a0: 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20  es to be used.  
c9b0: 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20    ** by the new 
c9c0: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  table..    **.  
c9d0: 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61    ** A shared-ca
c9e0: 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69  che write-lock i
c9f0: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74  s not required t
ca00: 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e  o write to the n
ca10: 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a  ew table,.    **
ca20: 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63   as a schema-loc
ca30: 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  k must have alre
ca40: 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ady been obtaine
ca50: 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20  d to create it. 
ca60: 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73  Since.    ** a s
ca70: 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75  chema-lock exclu
ca80: 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61  des all other da
ca90: 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74 68  tabase users, th
caa0: 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75  e write-lock wou
cab0: 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64  ld.    ** be red
cac0: 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20  undant..    */. 
cad0: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
cae0: 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  {.      SelectDe
caf0: 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 54  st dest;.      T
cb00: 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 0a  able *pSelTab;..
cb10: 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
cb20: 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20  rse->nTab==1);. 
cb30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cb40: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
cb50: 6e 57 72 69 74 65 2c 20 31 2c 20 70 50 61 72 73  nWrite, 1, pPars
cb60: 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62 29  e->regRoot, iDb)
cb70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
cb80: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31  dbeChangeP5(v, 1
cb90: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
cba0: 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20  >nTab = 2;.     
cbb0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
cbc0: 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
cbd0: 54 5f 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20  T_Table, 1);.   
cbe0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
cbf0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
cc00: 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
cc10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cc20: 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31  1(v, OP_Close, 1
cc30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
cc40: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
cc50: 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 20          pSelTab 
cc60: 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
cc70: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
cc80: 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  e, pSelect);.   
cc90: 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62       if( pSelTab
cca0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
ccb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
ccc0: 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
ccd0: 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53      p->nCol = pS
cce0: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
ccf0: 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70       p->aCol = p
cd00: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
cd10: 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e        pSelTab->n
cd20: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Col = 0;.       
cd30: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
cd40: 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
cd50: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
cd60: 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20  b, pSelTab);.   
cd70: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
cd80: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
cd90: 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
cda0: 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65  the CREATE state
cdb0: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20  ment */.    if( 
cdc0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
cdd0: 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54   zStmt = createT
cde0: 61 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 29 3b  ableStmt(db, p);
cdf0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ce00: 20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64    n = (int)(pEnd
ce10: 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e  ->z - pParse->sN
ce20: 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b  ameToken.z) + 1;
ce30: 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73  .      zStmt = s
ce40: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
ce50: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 43 52  , .          "CR
ce60: 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a  EATE %s %.*s", z
ce70: 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65  Type2, n, pParse
ce80: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20  ->sNameToken.z. 
ce90: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
cea0: 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72     /* A slot for
ceb0: 20 74 68 65 20 72 65 63 6f 72 64 20 68 61 73 20   the record has 
cec0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
ced0: 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a 20  ocated in the . 
cee0: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53     ** SQLITE_MAS
cef0: 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20 6a  TER table.  We j
cf00: 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64 61  ust need to upda
cf10: 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69 74  te that slot wit
cf20: 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65  h all.    ** the
cf30: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27   information we'
cf40: 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 0a 20 20  ve collected..  
cf50: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
cf60: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
cf70: 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54  se,.      "UPDAT
cf80: 45 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20  E %Q.%s ".      
cf90: 20 20 20 22 53 45 54 20 74 79 70 65 3d 27 25 73     "SET type='%s
cfa0: 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f  ', name=%Q, tbl_
cfb0: 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67  name=%Q, rootpag
cfc0: 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a  e=#%d, sql=%Q ".
cfd0: 20 20 20 20 20 20 20 22 57 48 45 52 45 20 72 6f         "WHERE ro
cfe0: 77 69 64 3d 23 25 64 22 2c 0a 20 20 20 20 20 20  wid=#%d",.      
cff0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
d000: 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
d010: 28 69 44 62 29 2c 0a 20 20 20 20 20 20 7a 54 79  (iDb),.      zTy
d020: 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61  pe,.      p->zNa
d030: 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61  me,.      p->zNa
d040: 6d 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65  me,.      pParse
d050: 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20  ->regRoot,.     
d060: 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70 50   zStmt,.      pP
d070: 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20  arse->regRowid. 
d080: 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
d090: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d  3DbFree(db, zStm
d0a0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  t);.    sqlite3C
d0b0: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
d0c0: 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64  se, iDb);..#ifnd
d0d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
d0e0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
d0f0: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
d100: 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63   if we need to c
d110: 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f  reate an sqlite_
d120: 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66  sequence table f
d130: 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e  or.    ** keepin
d140: 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69  g track of autoi
d150: 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20  ncrement keys.. 
d160: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
d170: 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41  >tabFlags & TF_A
d180: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a  utoincrement ){.
d190: 20 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20        Db *pDb = 
d1a0: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
d1b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
d1c0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
d1d0: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
d1e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  );.      if( pDb
d1f0: 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54  ->pSchema->pSeqT
d200: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
d210: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
d220: 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
d230: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41        "CREATE TA
d240: 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65  BLE %Q.sqlite_se
d250: 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29  quence(name,seq)
d260: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 62  ",.          pDb
d270: 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20  ->zName.        
d280: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d290: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
d2a0: 52 65 70 61 72 73 65 20 65 76 65 72 79 74 68 69  Reparse everythi
d2b0: 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75 72  ng to update our
d2c0: 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73   internal data s
d2d0: 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20  tructures */.   
d2e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
d2f0: 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20  arseSchemaOp(v, 
d300: 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iDb,.           
d310: 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
d320: 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65  tf(db, "tbl_name
d330: 3d 27 25 71 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65  ='%q'", p->zName
d340: 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  ));.  }...  /* A
d350: 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  dd the table to 
d360: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
d370: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
d380: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
d390: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
d3a0: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 54 61  t.busy ){.    Ta
d3b0: 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53  ble *pOld;.    S
d3c0: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
d3d0: 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20   p->pSchema;.   
d3e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d3f0: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
d400: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
d410: 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65     pOld = sqlite
d420: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 53 63  3HashInsert(&pSc
d430: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70  hema->tblHash, p
d440: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
d450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d460: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
d470: 6c 65 6e 33 30 28 70 2d 3e 7a 4e 61 6d 65 29 2c  len30(p->zName),
d480: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  p);.    if( pOld
d490: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
d4a0: 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a  ( p==pOld );  /*
d4b0: 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
d4c0: 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20  e failed inside 
d4d0: 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a  HashInsert() */.
d4e0: 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
d4f0: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
d500: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
d510: 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77      pParse->pNew
d520: 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64  Table = 0;.    d
d530: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
d540: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
d550: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
d560: 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c  E_OMIT_ALTERTABL
d570: 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70 53  E.    if( !p->pS
d580: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63  elect ){.      c
d590: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
d5a0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
d5b0: 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f  )pParse->sNameTo
d5c0: 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74  ken.z;.      int
d5d0: 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61 73   nName;.      as
d5e0: 73 65 72 74 28 20 21 70 53 65 6c 65 63 74 20 26  sert( !pSelect &
d5f0: 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64 20  & pCons && pEnd 
d600: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
d610: 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  ns->z==0 ){.    
d620: 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64      pCons = pEnd
d630: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d640: 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28 28 63  nName = (int)((c
d650: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6e  onst char *)pCon
d660: 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20  s->z - zName);. 
d670: 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66       p->addColOf
d680: 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71 6c 69  fset = 13 + sqli
d690: 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28 7a  te3Utf8CharLen(z
d6a0: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
d6b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
d6c0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
d6d0: 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
d6e0: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
d6f0: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  s this routine i
d700: 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74  n order to creat
d710: 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a  e a new VIEW.*/.
d720: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
d730: 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65 20  teView(.  Parse 
d740: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
d750: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
d760: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
d770: 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54  pBegin,     /* T
d780: 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20  he CREATE token 
d790: 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65 20  that begins the 
d7a0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
d7b0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
d7c0: 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74    /* The token t
d7d0: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  hat holds the na
d7e0: 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a  me of the view *
d7f0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
d800: 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f  2,     /* The to
d810: 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ken that holds t
d820: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
d830: 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  iew */.  Select 
d840: 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41  *pSelect,   /* A
d850: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
d860: 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f  t that will beco
d870: 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20  me the new view 
d880: 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c  */.  int isTemp,
d890: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
d8a0: 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20  for a TEMPORARY 
d8b0: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  view */.  int no
d8c0: 45 72 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Err          /* 
d8d0: 53 75 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d  Suppress error m
d8e0: 65 73 73 61 67 65 73 20 69 66 20 56 49 45 57 20  essages if VIEW 
d8f0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
d900: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
d910: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73  .  int n;.  cons
d920: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b  t char *z;.  Tok
d930: 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78  en sEnd;.  DbFix
d940: 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e  er sFix;.  Token
d950: 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69   *pName = 0;.  i
d960: 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65  nt iDb;.  sqlite
d970: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
d980: 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  db;..  if( pPars
d990: 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20  e->nVar>0 ){.   
d9a0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
d9b0: 28 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65  (pParse, "parame
d9c0: 74 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c  ters are not all
d9d0: 6f 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b  owed in views");
d9e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
d9f0: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
da00: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
da10: 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
da20: 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73  StartTable(pPars
da30: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
da40: 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c  2, isTemp, 1, 0,
da50: 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70   noErr);.  p = p
da60: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
da70: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
da80: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
da90: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
daa0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
dab0: 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
dac0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54  ;.  }.  sqlite3T
dad0: 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
dae0: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
daf0: 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44  2, &pName);.  iD
db00: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
db10: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e  aToIndex(db, p->
db20: 70 53 63 68 65 6d 61 29 3b 0a 20 20 69 66 28 20  pSchema);.  if( 
db30: 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
db40: 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
db50: 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65  b, "view", pName
db60: 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  ).    && sqlite3
db70: 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c  FixSelect(&sFix,
db80: 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20   pSelect).  ){. 
db90: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
dba0: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
dbb0: 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ct);.    return;
dbc0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
dbd0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e  a copy of the en
dbe0: 74 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74  tire SELECT stat
dbf0: 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e  ement that defin
dc00: 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a  es the view..  *
dc10: 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63  * This will forc
dc20: 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74  e all the Expr.t
dc30: 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f  oken.z values to
dc40: 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a   be dynamically.
dc50: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72    ** allocated r
dc60: 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74  ather than point
dc70: 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74   to the input st
dc80: 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61  ring - which mea
dc90: 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  ns that.  ** the
dca0: 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61  y will persist a
dcb0: 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  fter the current
dcc0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20   sqlite3_exec() 
dcd0: 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20  call returns..  
dce0: 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20  */.  p->pSelect 
dcf0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
dd00: 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20  up(db, pSelect, 
dd10: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b  EXPRDUP_REDUCE);
dd20: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
dd30: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
dd40: 63 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ct);.  if( db->m
dd50: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
dd60: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
dd70: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
dd80: 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  usy ){.    sqlit
dd90: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
dda0: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b  ames(pParse, p);
ddb0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
ddc0: 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
ddd0: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
dde0: 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45  tement.  Make sE
ddf0: 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a  nd point to.  **
de00: 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20   the end..  */. 
de10: 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e   sEnd = pParse->
de20: 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66  sLastToken;.  if
de30: 28 20 41 4c 57 41 59 53 28 73 45 6e 64 2e 7a 5b  ( ALWAYS(sEnd.z[
de40: 30 5d 21 3d 30 29 20 26 26 20 73 45 6e 64 2e 7a  0]!=0) && sEnd.z
de50: 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20  [0]!=';' ){.    
de60: 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e  sEnd.z += sEnd.n
de70: 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d  ;.  }.  sEnd.n =
de80: 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28   0;.  n = (int)(
de90: 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d  sEnd.z - pBegin-
dea0: 3e 7a 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69  >z);.  z = pBegi
deb0: 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 41  n->z;.  while( A
dec0: 4c 57 41 59 53 28 6e 3e 30 29 20 26 26 20 73 71  LWAYS(n>0) && sq
ded0: 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 6e  lite3Isspace(z[n
dee0: 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  -1]) ){ n--; }. 
def0: 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31   sEnd.z = &z[n-1
df00: 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b  ];.  sEnd.n = 1;
df10: 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74  ..  /* Use sqlit
df20: 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20  e3EndTable() to 
df30: 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20  add the view to 
df40: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
df50: 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  R table */.  sql
df60: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61  ite3EndTable(pPa
df70: 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30  rse, 0, &sEnd, 0
df80: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23  );.  return;.}.#
df90: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
dfa0: 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69  OMIT_VIEW */..#i
dfb0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
dfc0: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
dfd0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
dfe0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
dff0: 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62  E)./*.** The Tab
e000: 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61  le structure pTa
e010: 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ble is really a 
e020: 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74  VIEW.  Fill in t
e030: 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  he names of.** t
e040: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
e050: 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54  e view in the pT
e060: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20  able structure. 
e070: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
e080: 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e  er.** of errors.
e090: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73    If an error is
e0a0: 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65   seen leave an e
e0b0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
e0c0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
e0d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
e0e0: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
e0f0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
e100: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
e110: 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61  .  Table *pSelTa
e120: 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74  b;   /* A fake t
e130: 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  able from which 
e140: 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c  we get the resul
e150: 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63  t set */.  Selec
e160: 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20  t *pSel;     /* 
e170: 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  Copy of the SELE
e180: 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  CT that implemen
e190: 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  ts the view */. 
e1a0: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20   int nErr = 0;  
e1b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
e1c0: 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
e1d0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ed */.  int n;  
e1e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
e1f0: 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74  porarily holds t
e200: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
e210: 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f  sors assigned */
e220: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
e230: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a   pParse->db;  /*
e240: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
e250: 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20  tion for malloc 
e260: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
e270: 28 2a 78 41 75 74 68 29 28 76 6f 69 64 2a 2c 69  (*xAuth)(void*,i
e280: 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  nt,const char*,c
e290: 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74  onst char*,const
e2a0: 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61   char*,const cha
e2b0: 72 2a 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  r*);..  assert( 
e2c0: 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64  pTable );..#ifnd
e2d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
e2e0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
e2f0: 28 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c  ( sqlite3VtabCal
e300: 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c  lConnect(pParse,
e310: 20 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20   pTable) ){.    
e320: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
e330: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49  ROR;.  }.  if( I
e340: 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29  sVirtual(pTable)
e350: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
e360: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
e370: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
e380: 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43  /* A positive nC
e390: 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c  ol means the col
e3a0: 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74  umns names for t
e3b0: 68 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a  his view are.  *
e3c0: 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e  * already known.
e3d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
e3e0: 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74  le->nCol>0 ) ret
e3f0: 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e  urn 0;..  /* A n
e400: 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20  egative nCol is 
e410: 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72  a special marker
e420: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65   meaning that we
e430: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20   are currently. 
e440: 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f   ** trying to co
e450: 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e  mpute the column
e460: 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65   names.  If we e
e470: 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  nter this routin
e480: 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65  e with.  ** a ne
e490: 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20  gative nCol, it 
e4a0: 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72  means two or mor
e4b0: 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c  e views form a l
e4c0: 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  oop, like this:.
e4d0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52    **.  **     CR
e4e0: 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53  EATE VIEW one AS
e4f0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
e500: 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  wo;.  **     CRE
e510: 41 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20  ATE VIEW two AS 
e520: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e  SELECT * FROM on
e530: 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74  e;.  **.  ** Act
e540: 75 61 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f 72  ually, the error
e550: 20 61 62 6f 76 65 20 69 73 20 6e 6f 77 20 63 61   above is now ca
e560: 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65  ught prior to re
e570: 61 63 68 69 6e 67 20 74 68 69 73 20 70 6f 69 6e  aching this poin
e580: 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20  t..  ** But the 
e590: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20 69  following test i
e5a0: 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e  s still importan
e5b0: 74 20 61 73 20 69 74 20 64 6f 65 73 20 63 6f 6d  t as it does com
e5c0: 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65  e up.  ** in the
e5d0: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a   following:.  **
e5e0: 20 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54   .  **     CREAT
e5f0: 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31  E TABLE main.ex1
e600: 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52  (a);.  **     CR
e610: 45 41 54 45 20 54 45 4d 50 20 56 49 45 57 20 65  EATE TEMP VIEW e
e620: 78 31 20 41 53 20 53 45 4c 45 43 54 20 61 20 46  x1 AS SELECT a F
e630: 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20  ROM ex1;.  **   
e640: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
e650: 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20  temp.ex1;.  */. 
e660: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
e670: 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  l<0 ){.    sqlit
e680: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
e690: 65 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63  e, "view %s is c
e6a0: 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65  ircularly define
e6b0: 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  d", pTable->zNam
e6c0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
e6d0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
e6e0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20  pTable->nCol>=0 
e6f0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67  );..  /* If we g
e700: 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
e710: 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f  means we need to
e720: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62   compute the tab
e730: 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e  le names..  ** N
e740: 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c  ote that the cal
e750: 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75  l to sqlite3Resu
e760: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20  ltSetOfSelect() 
e770: 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a  will expand any.
e780: 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74    ** "*" element
e790: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73  s in the results
e7a0: 20 73 65 74 20 6f 66 20 74 68 65 20 76 69 65 77   set of the view
e7b0: 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e   and will assign
e7c0: 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f   cursors.  ** to
e7d0: 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66   the elements of
e7e0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
e7f0: 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74  .  But we do not
e800: 20 77 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e   want these chan
e810: 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70  ges.  ** to be p
e820: 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68  ermanent.  So th
e830: 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73  e computation is
e840: 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20   done on a copy 
e850: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  of the SELECT.  
e860: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  ** statement tha
e870: 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69  t defines the vi
e880: 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ew..  */.  asser
e890: 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  t( pTable->pSele
e8a0: 63 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73  ct );.  pSel = s
e8b0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
e8c0: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  db, pTable->pSel
e8d0: 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ect, 0);.  if( p
e8e0: 53 65 6c 20 29 7b 0a 20 20 20 20 75 38 20 65 6e  Sel ){.    u8 en
e8f0: 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 20 3d 20  ableLookaside = 
e900: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45  db->lookaside.bE
e910: 6e 61 62 6c 65 64 3b 0a 20 20 20 20 6e 20 3d 20  nabled;.    n = 
e920: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20  pParse->nTab;.  
e930: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
e940: 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
e950: 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63  arse, pSel->pSrc
e960: 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  );.    pTable->n
e970: 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 64 62  Col = -1;.    db
e980: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61  ->lookaside.bEna
e990: 62 6c 65 64 20 3d 20 30 3b 0a 23 69 66 6e 64 65  bled = 0;.#ifnde
e9a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
e9b0: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
e9c0: 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75 74  xAuth = db->xAut
e9d0: 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68  h;.    db->xAuth
e9e0: 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61   = 0;.    pSelTa
e9f0: 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
ea00: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
ea10: 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  rse, pSel);.    
ea20: 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74  db->xAuth = xAut
ea30: 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 53 65  h;.#else.    pSe
ea40: 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
ea50: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
ea60: 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23  pParse, pSel);.#
ea70: 65 6e 64 69 66 0a 20 20 20 20 64 62 2d 3e 6c 6f  endif.    db->lo
ea80: 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64  okaside.bEnabled
ea90: 20 3d 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69   = enableLookasi
eaa0: 64 65 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  de;.    pParse->
eab0: 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66  nTab = n;.    if
eac0: 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20  ( pSelTab ){.   
ead0: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c     assert( pTabl
eae0: 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  e->aCol==0 );.  
eaf0: 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
eb00: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c   = pSelTab->nCol
eb10: 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ;.      pTable->
eb20: 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
eb30: 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c  aCol;.      pSel
eb40: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
eb50: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43       pSelTab->aC
eb60: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ol = 0;.      sq
eb70: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
eb80: 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20  (db, pSelTab);. 
eb90: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
eba0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
ebb0: 65 6c 64 28 64 62 2c 20 30 2c 20 70 54 61 62 6c  eld(db, 0, pTabl
ebc0: 65 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  e->pSchema) );. 
ebd0: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63       pTable->pSc
ebe0: 68 65 6d 61 2d 3e 66 6c 61 67 73 20 7c 3d 20 44  hema->flags |= D
ebf0: 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a  B_UnresetViews;.
ec00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ec10: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
ec20: 30 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b  0;.      nErr++;
ec30: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
ec40: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
ec50: 62 2c 20 70 53 65 6c 29 3b 0a 20 20 7d 20 65 6c  b, pSel);.  } el
ec60: 73 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b  se {.    nErr++;
ec70: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
ec80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
ec90: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72  */.  return nErr
eca0: 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;  .}.#endif /* 
ecb0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
ecc0: 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
ecd0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
ece0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
ecf0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
ed00: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
ed10: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f  .** Clear the co
ed20: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
ed30: 65 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61  every VIEW in da
ed40: 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73  tabase idx..*/.s
ed50: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
ed60: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71  eViewResetAll(sq
ed70: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
ed80: 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  dx){.  HashElem 
ed90: 2a 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *i;.  assert( sq
eda0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
edb0: 48 65 6c 64 28 64 62 2c 20 69 64 78 2c 20 30 29  Held(db, idx, 0)
edc0: 20 29 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73   );.  if( !DbHas
edd0: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
ede0: 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
edf0: 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  s) ) return;.  f
ee00: 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
ee10: 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64  irst(&db->aDb[id
ee20: 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  x].pSchema->tblH
ee30: 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65  ash); i;i=sqlite
ee40: 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20  HashNext(i)){.  
ee50: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
ee60: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
ee70: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
ee80: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
ee90: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 43 6f    sqliteDeleteCo
eea0: 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54  lumnNames(db, pT
eeb0: 61 62 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ab);.      pTab-
eec0: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >aCol = 0;.     
eed0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b   pTab->nCol = 0;
eee0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43  .    }.  }.  DbC
eef0: 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c  learProperty(db,
ef00: 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
ef10: 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a  Views);.}.#else.
ef20: 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56  # define sqliteV
ef30: 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29  iewResetAll(A,B)
ef40: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
ef50: 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
ef60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
ef70: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
ef80: 20 74 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a   the VDBE to adj
ef90: 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ust the internal
efa0: 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20   schema.** used 
efb0: 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74  by SQLite when t
efc0: 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d  he btree layer m
efd0: 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f  oves a table roo
efe0: 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72  t page. The.** r
eff0: 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61  oot-page of a ta
f000: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20  ble or index in 
f010: 64 61 74 61 62 61 73 65 20 69 44 62 20 68 61 73  database iDb has
f020: 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46   changed from iF
f030: 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a  rom.** to iTo..*
f040: 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31 37 32  *.** Ticket #172
f050: 38 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c 20 74  8:  The symbol t
f060: 61 62 6c 65 20 6d 69 67 68 74 20 73 74 69 6c 6c  able might still
f070: 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61   contain informa
f080: 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65  tion.** on table
f090: 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73  s and/or indices
f0a0: 20 74 68 61 74 20 61 72 65 20 74 68 65 20 70 72   that are the pr
f0b0: 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 64  ocess of being d
f0c0: 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f  eleted..** If yo
f0d0: 75 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f  u are unlucky, o
f0e0: 6e 65 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65  ne of those dele
f0f0: 74 65 64 20 69 6e 64 69 63 65 73 20 6f 72 20 74  ted indices or t
f100: 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68  ables might.** h
f110: 61 76 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f  ave the same roo
f120: 74 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20  tpage number as 
f130: 74 68 65 20 72 65 61 6c 20 74 61 62 6c 65 20 6f  the real table o
f140: 72 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a  r index that is.
f150: 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20  ** being moved. 
f160: 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73 74   So we cannot st
f170: 6f 70 20 73 65 61 72 63 68 69 6e 67 20 61 66 74  op searching aft
f180: 65 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  er the first mat
f190: 63 68 20 0a 2a 2a 20 62 65 63 61 75 73 65 20 74  ch .** because t
f1a0: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 6d  he first match m
f1b0: 69 67 68 74 20 62 65 20 66 6f 72 20 6f 6e 65 20  ight be for one 
f1c0: 6f 66 20 74 68 65 20 64 65 6c 65 74 65 64 20 69  of the deleted i
f1d0: 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62  ndices.** or tab
f1e0: 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74 68 65 20  les and not the 
f1f0: 74 61 62 6c 65 2f 69 6e 64 65 78 20 74 68 61 74  table/index that
f200: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 62 65 69   is actually bei
f210: 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20  ng moved..** We 
f220: 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f  must continue lo
f230: 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20  oping until all 
f240: 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63  tables and indic
f250: 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70  es with.** rootp
f260: 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20  age==iFrom have 
f270: 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 74  been converted t
f280: 6f 20 68 61 76 65 20 61 20 72 6f 6f 74 70 61 67  o have a rootpag
f290: 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f  e of iTo.** in o
f2a0: 72 64 65 72 20 74 6f 20 62 65 20 63 65 72 74 61  rder to be certa
f2b0: 69 6e 20 74 68 61 74 20 77 65 20 67 6f 74 20 74  in that we got t
f2c0: 68 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f  he right one..*/
f2d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f2e0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
f2f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74  void sqlite3Root
f300: 50 61 67 65 4d 6f 76 65 64 28 73 71 6c 69 74 65  PageMoved(sqlite
f310: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20  3 *db, int iDb, 
f320: 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
f330: 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  To){.  HashElem 
f340: 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a  *pElem;.  Hash *
f350: 70 48 61 73 68 3b 0a 20 20 44 62 20 2a 70 44 62  pHash;.  Db *pDb
f360: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
f370: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
f380: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
f390: 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  );.  pDb = &db->
f3a0: 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 48 61 73  aDb[iDb];.  pHas
f3b0: 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d  h = &pDb->pSchem
f3c0: 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f  a->tblHash;.  fo
f3d0: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
f3e0: 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20  shFirst(pHash); 
f3f0: 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
f400: 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
f410: 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  m)){.    Table *
f420: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
f430: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
f440: 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d    if( pTab->tnum
f450: 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
f460: 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54   pTab->tnum = iT
f470: 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  o;.    }.  }.  p
f480: 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63  Hash = &pDb->pSc
f490: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20  hema->idxHash;. 
f4a0: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
f4b0: 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68  eHashFirst(pHash
f4c0: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
f4d0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
f4e0: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65  Elem)){.    Inde
f4f0: 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65  x *pIdx = sqlite
f500: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
f510: 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74  .    if( pIdx->t
f520: 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  num==iFrom ){.  
f530: 20 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d      pIdx->tnum =
f540: 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   iTo;.    }.  }.
f550: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
f560: 57 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72  Write code to er
f570: 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 77 69  ase the table wi
f580: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  th root-page iTa
f590: 62 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73  ble from databas
f5a0: 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77  e iDb..** Also w
f5b0: 72 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64  rite code to mod
f5c0: 69 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ify the sqlite_m
f5d0: 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
f5e0: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a  internal schema.
f5f0: 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67  ** if a root-pag
f600: 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62  e of another tab
f610: 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74  le is moved by t
f620: 68 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77  he btree-layer w
f630: 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67  hilst.** erasing
f640: 20 69 54 61 62 6c 65 20 28 74 68 69 73 20 63 61   iTable (this ca
f650: 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e  n happen with an
f660: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
f670: 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74  abase)..*/ .stat
f680: 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52  ic void destroyR
f690: 6f 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a 70  ootPage(Parse *p
f6a0: 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c  Parse, int iTabl
f6b0: 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56  e, int iDb){.  V
f6c0: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
f6d0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
f6e0: 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69  .  int r1 = sqli
f6f0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
f700: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
f710: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
f720: 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65  _Destroy, iTable
f730: 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20 20 73 71  , r1, iDb);.  sq
f740: 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50  lite3MayAbort(pP
f750: 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53  arse);.#ifndef S
f760: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
f770: 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65  ACUUM.  /* OP_De
f780: 73 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20  stroy stores an 
f790: 69 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49  in integer r1. I
f7a0: 66 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20  f this integer. 
f7b0: 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   ** is non-zero,
f7c0: 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
f7d0: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
f7e0: 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65   of a table move
f7f0: 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69  d to.  ** locati
f800: 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66  on iTable. The f
f810: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f  ollowing code mo
f820: 64 69 66 69 65 73 20 74 68 65 20 73 71 6c 69 74  difies the sqlit
f830: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74  e_master table t
f840: 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74  o.  ** reflect t
f850: 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  his..  **.  ** T
f860: 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65  he "#NNN" in the
f870: 20 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61   SQL is a specia
f880: 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20  l constant that 
f890: 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76  means whatever v
f8a0: 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20  alue.  ** is in 
f8b0: 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53  register NNN.  S
f8c0: 65 65 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73  ee grammar rules
f8d0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
f8e0: 20 74 68 65 20 54 4b 5f 52 45 47 49 53 54 45 52   the TK_REGISTER
f8f0: 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20  .  ** token for 
f900: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
f910: 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73  mation..  */.  s
f920: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
f930: 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
f940: 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45  "UPDATE %Q.%s SE
f950: 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48  T rootpage=%d WH
f960: 45 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74  ERE #%d AND root
f970: 70 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20  page=#%d",.     
f980: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
f990: 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
f9a0: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69  MA_TABLE(iDb), i
f9b0: 54 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a  Table, r1, r1);.
f9c0: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
f9d0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
f9e0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f  Parse, r1);.}../
f9f0: 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20  *.** Write VDBE 
fa00: 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61  code to erase ta
fa10: 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c  ble pTab and all
fa20: 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69   associated indi
fa30: 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20  ces on disk..** 
fa40: 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74  Code to update t
fa50: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
fa60: 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65   tables and inte
fa70: 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69  rnal schema defi
fa80: 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61  nitions.** in ca
fa90: 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62  se a root-page b
faa0: 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74  elonging to anot
fab0: 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76  her table is mov
fac0: 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20  ed by the btree 
fad0: 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f  layer.** is also
fae0: 20 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e   added (this can
faf0: 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20   happen with an 
fb00: 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
fb10: 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  base)..*/.static
fb20: 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62   void destroyTab
fb30: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
fb40: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  , Table *pTab){.
fb50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
fb60: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
fb70: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
fb80: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
fb90: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
fba0: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
fbb0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 64 65 73 74  pSchema);.  dest
fbc0: 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
fbd0: 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  se, pTab->tnum, 
fbe0: 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78  iDb);.  for(pIdx
fbf0: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
fc00: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
fc10: 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74  pNext){.    dest
fc20: 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
fc30: 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  se, pIdx->tnum, 
fc40: 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  iDb);.  }.#else.
fc50: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
fc60: 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f  base may be auto
fc70: 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20  -vacuum capable 
fc80: 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  (if SQLITE_OMIT_
fc90: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20  AUTOVACUUM.  ** 
fca0: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c  is not defined),
fcb0: 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f   then it is impo
fcc0: 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50  rtant to call OP
fcd0: 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a  _Destroy on the.
fce0: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69    ** table and i
fcf0: 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20  ndex root-pages 
fd00: 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69  in order, starti
fd10: 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65  ng with the nume
fd20: 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61  rically .  ** la
fd30: 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
fd40: 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61  number. This gua
fd50: 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e  rantees that non
fd60: 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61  e of the root-pa
fd70: 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64  ges.  ** to be d
fd80: 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f  estroyed is relo
fd90: 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c  cated by an earl
fda0: 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20  ier OP_Destroy. 
fdb0: 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a  i.e. if the.  **
fdc0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20   following were 
fdd0: 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  coded:.  **.  **
fde0: 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a   OP_Destroy 4 0.
fdf0: 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50    ** ....  ** OP
fe00: 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a  _Destroy 5 0.  *
fe10: 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20  *.  ** and root 
fe20: 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20  page 5 happened 
fe30: 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73  to be the larges
fe40: 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
fe50: 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64  er in the.  ** d
fe60: 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f  atabase, then ro
fe70: 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20  ot page 5 would 
fe80: 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65  be moved to page
fe90: 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20   4 by the .  ** 
fea0: 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22  "OP_Destroy 4 0"
feb0: 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62   opcode. The sub
fec0: 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74  sequent "OP_Dest
fed0: 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68  roy 5 0" would h
fee0: 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c  it.  ** a free-l
fef0: 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  ist page..  */. 
ff00: 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62   int iTab = pTab
ff10: 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44  ->tnum;.  int iD
ff20: 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20  estroyed = 0;.. 
ff30: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
ff40: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
ff50: 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d    int iLargest =
ff60: 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65   0;..    if( iDe
ff70: 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54  stroyed==0 || iT
ff80: 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b  ab<iDestroyed ){
ff90: 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20  .      iLargest 
ffa0: 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20  = iTab;.    }.  
ffb0: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
ffc0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
ffd0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
ffe0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78  {.      int iIdx
fff0: 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20   = pIdx->tnum;. 
10000 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
10010 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
10020 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
10030 20 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79     if( (iDestroy
10040 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69  ed==0 || (iIdx<i
10050 44 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69  Destroyed)) && i
10060 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a  Idx>iLargest ){.
10070 20 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74          iLargest
10080 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d   = iIdx;.      }
10090 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
100a0 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20  Largest==0 ){.  
100b0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
100c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
100d0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
100e0 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
100f0 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
10100 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 64 65  chema);.      de
10110 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
10120 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20  arse, iLargest, 
10130 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73  iDb);.      iDes
10140 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73  troyed = iLarges
10150 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  t;.    }.  }.#en
10160 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  dif.}../*.** Rem
10170 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  ove entries from
10180 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
10190 4e 20 74 61 62 6c 65 73 20 28 66 6f 72 20 4e 20  N tables (for N 
101a0 69 6e 20 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61  in (1,2,3)).** a
101b0 66 74 65 72 20 61 20 44 52 4f 50 20 49 4e 44 45  fter a DROP INDE
101c0 58 20 6f 72 20 44 52 4f 50 20 54 41 42 4c 45 20  X or DROP TABLE 
101d0 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74  command..*/.stat
101e0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 43  ic void sqlite3C
101f0 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 0a  learStatTables(.
10200 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
10210 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10220 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
10230 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20  */.  int iDb,   
10240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10250 68 65 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62  he database numb
10260 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  er */.  const ch
10270 61 72 20 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f  ar *zType,     /
10280 2a 20 22 69 64 78 22 20 6f 72 20 22 74 62 6c 22  * "idx" or "tbl"
10290 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
102a0 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20   *zName      /* 
102b0 4e 61 6d 65 20 6f 66 20 69 6e 64 65 78 20 6f 72  Name of index or
102c0 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69   table */.){.  i
102d0 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
102e0 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50  ar *zDbName = pP
102f0 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
10300 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 66 6f 72 28  b].zName;.  for(
10310 69 3d 31 3b 20 69 3c 3d 33 3b 20 69 2b 2b 29 7b  i=1; i<=3; i++){
10320 0a 20 20 20 20 63 68 61 72 20 7a 54 61 62 5b 32  .    char zTab[2
10330 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  4];.    sqlite3_
10340 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
10350 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73 71 6c 69  zTab),zTab,"sqli
10360 74 65 5f 73 74 61 74 25 64 22 2c 69 29 3b 0a 20  te_stat%d",i);. 
10370 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
10380 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
10390 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e 61 6d  db, zTab, zDbNam
103a0 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  e) ){.      sqli
103b0 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
103c0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
103d0 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
103e0 73 20 57 48 45 52 45 20 25 73 3d 25 51 22 2c 0a  s WHERE %s=%Q",.
103f0 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c          zDbName,
10400 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20 7a 4e   zTab, zType, zN
10410 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ame.      );.   
10420 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
10430 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
10440 20 64 72 6f 70 20 61 20 74 61 62 6c 65 2e 0a 2a   drop a table..*
10450 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
10460 64 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  deDropTable(Pars
10470 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
10480 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 44 62 2c   *pTab, int iDb,
10490 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20   int isView){.  
104a0 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
104b0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
104c0 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72 20 2a  >db;.  Trigger *
104d0 70 54 72 69 67 67 65 72 3b 0a 20 20 44 62 20 2a  pTrigger;.  Db *
104e0 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
104f0 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  Db];..  v = sqli
10500 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
10510 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
10520 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  =0 );.  sqlite3B
10530 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
10540 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
10550 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
10560 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
10570 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69  TABLE.  if( IsVi
10580 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
10590 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
105a0 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp0(v, OP_VBegi
105b0 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  n);.  }.#endif..
105c0 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72    /* Drop all tr
105d0 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65  iggers associate
105e0 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
105f0 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20   being dropped. 
10600 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67 65 6e  Code.  ** is gen
10610 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65  erated to remove
10620 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71   entries from sq
10630 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f  lite_master and/
10640 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74  or.  ** sqlite_t
10650 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65  emp_master if re
10660 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  quired..  */.  p
10670 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65  Trigger = sqlite
10680 33 54 72 69 67 67 65 72 4c 69 73 74 28 70 50 61  3TriggerList(pPa
10690 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 77 68  rse, pTab);.  wh
106a0 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29 7b  ile( pTrigger ){
106b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72  .    assert( pTr
106c0 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d  igger->pSchema==
106d0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c  pTab->pSchema ||
106e0 20 0a 20 20 20 20 20 20 20 20 70 54 72 69 67 67   .        pTrigg
106f0 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d  er->pSchema==db-
10700 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
10710 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 72  );.    sqlite3Dr
10720 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61  opTriggerPtr(pPa
10730 72 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a  rse, pTrigger);.
10740 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
10750 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a  Trigger->pNext;.
10760 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
10770 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
10780 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f  REMENT.  /* Remo
10790 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f  ve any entries o
107a0 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71  f the sqlite_seq
107b0 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f  uence table asso
107c0 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 2a 2a  ciated with.  **
107d0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
107e0 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69   dropped. This i
107f0 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68  s done before th
10800 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70  e table is dropp
10810 65 64 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 62  ed.  ** at the b
10820 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63  tree level, in c
10830 61 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73  ase the sqlite_s
10840 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e 65  equence table ne
10850 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65  eds to.  ** move
10860 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
10870 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61  the drop (can ha
10880 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63  ppen in auto-vac
10890 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a  uum mode)..  */.
108a0 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46    if( pTab->tabF
108b0 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
108c0 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73  crement ){.    s
108d0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
108e0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
108f0 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
10900 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
10910 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a  WHERE name=%Q",.
10920 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
10930 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20  , pTab->zName.  
10940 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a    );.  }.#endif.
10950 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53  .  /* Drop all S
10960 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
10970 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74  le and index ent
10980 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20  ries that refer 
10990 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c  to the.  ** tabl
109a0 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e  e. The program n
109b0 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  ame loops throug
109c0 68 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  h the master tab
109d0 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20  le and deletes. 
109e0 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68   ** every row th
109f0 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  at refers to a t
10a00 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65  able of the same
10a10 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65   name as the one
10a20 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70   being.  ** drop
10a30 70 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72  ped. Triggers ar
10a40 65 20 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61  e handled sepera
10a50 74 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74  tely because a t
10a60 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20  rigger can be.  
10a70 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  ** created in th
10a80 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
10a90 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
10aa0 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65   table in anothe
10ab0 72 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  r.  ** database.
10ac0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e  .  */.  sqlite3N
10ad0 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
10ae0 65 2c 20 0a 20 20 20 20 20 20 22 44 45 4c 45 54  e, .      "DELET
10af0 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
10b00 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61  RE tbl_name=%Q a
10b10 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67 67 65  nd type!='trigge
10b20 72 27 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e  r'",.      pDb->
10b30 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
10b40 42 4c 45 28 69 44 62 29 2c 20 70 54 61 62 2d 3e  BLE(iDb), pTab->
10b50 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 69  zName);.  if( !i
10b60 73 56 69 65 77 20 26 26 20 21 49 73 56 69 72 74  sView && !IsVirt
10b70 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
10b80 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50   destroyTable(pP
10b90 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d  arse, pTab);.  }
10ba0 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68  ..  /* Remove th
10bb0 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72  e table entry fr
10bc0 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65  om SQLite's inte
10bd0 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20  rnal schema and 
10be0 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20  modify.  ** the 
10bf0 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20  schema cookie.. 
10c00 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74   */.  if( IsVirt
10c10 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
10c20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10c30 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f  p4(v, OP_VDestro
10c40 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54  y, iDb, 0, 0, pT
10c50 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
10c60 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
10c70 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f  AddOp4(v, OP_Dro
10c80 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20  pTable, iDb, 0, 
10c90 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  0, pTab->zName, 
10ca0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 68 61  0);.  sqlite3Cha
10cb0 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
10cc0 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , iDb);.  sqlite
10cd0 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c  ViewResetAll(db,
10ce0 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iDb);.}../*.** 
10cf0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10d00 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65  called to do the
10d10 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20   work of a DROP 
10d20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
10d30 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65  .** pName is the
10d40 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
10d50 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64  le to be dropped
10d60 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
10d70 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65  3DropTable(Parse
10d80 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
10d90 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73  t *pName, int is
10da0 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29  View, int noErr)
10db0 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
10dc0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
10dd0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
10de0 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
10df0 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  b;..  if( db->ma
10e00 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
10e10 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
10e20 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73  _table;.  }.  as
10e30 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
10e40 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  rr==0 );.  asser
10e50 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
10e60 31 20 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72  1 );.  if( noErr
10e70 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45   ) db->suppressE
10e80 72 72 2b 2b 3b 0a 20 20 70 54 61 62 20 3d 20 73  rr++;.  pTab = s
10e90 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
10ea0 65 28 70 50 61 72 73 65 2c 20 69 73 56 69 65 77  e(pParse, isView
10eb0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
10ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
10ed0 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
10ee0 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  , pName->a[0].zD
10ef0 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20  atabase);.  if( 
10f00 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70  noErr ) db->supp
10f10 72 65 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66  ressErr--;..  if
10f20 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
10f30 20 69 66 28 20 6e 6f 45 72 72 20 29 20 73 71 6c   if( noErr ) sql
10f40 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61  ite3CodeVerifyNa
10f50 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  medSchema(pParse
10f60 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  , pName->a[0].zD
10f70 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 67 6f  atabase);.    go
10f80 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
10f90 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  le;.  }.  iDb = 
10fa0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
10fb0 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
10fc0 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72  Schema);.  asser
10fd0 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
10fe0 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f  <db->nDb );..  /
10ff0 2a 20 49 66 20 70 54 61 62 20 69 73 20 61 20 76  * If pTab is a v
11000 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61  irtual table, ca
11010 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  ll ViewGetColumn
11020 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72  Names() to ensur
11030 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69  e.  ** it is ini
11040 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
11050 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
11060 54 61 62 29 20 26 26 20 73 71 6c 69 74 65 33 56  Tab) && sqlite3V
11070 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
11080 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
11090 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
110a0 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
110b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
110c0 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
110d0 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
110e0 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ode;.    const c
110f0 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
11100 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20  MA_TABLE(iDb);. 
11110 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
11120 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
11130 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  ].zName;.    con
11140 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d  st char *zArg2 =
11150 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
11160 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
11170 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
11180 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
11190 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  )){.      goto e
111a0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
111b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
111c0 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66  View ){.      if
111d0 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
111e0 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  & iDb==1 ){.    
111f0 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
11200 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57  E_DROP_TEMP_VIEW
11210 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11220 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
11230 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a  LITE_DROP_VIEW;.
11240 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
11250 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
11260 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c  UALTABLE.    }el
11270 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  se if( IsVirtual
11280 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
11290 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
112a0 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20  OP_VTABLE;.     
112b0 20 7a 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33   zArg2 = sqlite3
112c0 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54  GetVTable(db, pT
112d0 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65  ab)->pMod->zName
112e0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
112f0 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  se{.      if( !O
11300 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
11310 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
11320 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
11330 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20  OP_TEMP_TABLE;. 
11340 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11350 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
11360 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20  E_DROP_TABLE;.  
11370 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
11380 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
11390 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
113a0 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
113b0 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20  zArg2, zDb) ){. 
113c0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
113d0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
113e0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
113f0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
11400 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
11410 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c   pTab->zName, 0,
11420 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
11430 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
11440 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ble;.    }.  }.#
11450 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69  endif.  if( sqli
11460 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62  te3StrNICmp(pTab
11470 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  ->zName, "sqlite
11480 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26  _", 7)==0 .    &
11490 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  & sqlite3StrNICm
114a0 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22  p(pTab->zName, "
114b0 73 71 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31  sqlite_stat", 11
114c0 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
114d0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
114e0 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
114f0 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  y not be dropped
11500 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
11510 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
11520 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a  rop_table;.  }..
11530 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11540 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e  MIT_VIEW.  /* En
11550 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20  sure DROP TABLE 
11560 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61  is not used on a
11570 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20   view, and DROP 
11580 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64  VIEW is not used
11590 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65  .  ** on a table
115a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56  ..  */.  if( isV
115b0 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
115c0 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  lect==0 ){.    s
115d0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
115e0 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
115f0 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65   TABLE to delete
11600 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62   table %s", pTab
11610 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
11620 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
11630 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69  le;.  }.  if( !i
11640 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
11650 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
11660 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
11670 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
11680 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76  VIEW to delete v
11690 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  iew %s", pTab->z
116a0 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
116b0 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
116c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
116d0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
116e0 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61  to remove the ta
116f0 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  ble from the mas
11700 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ter table.  ** o
11710 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76  n disk..  */.  v
11720 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
11730 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
11740 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
11750 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
11760 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
11770 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
11780 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73  3ClearStatTables
11790 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74  (pParse, iDb, "t
117a0 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  bl", pTab->zName
117b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 6b  );.    sqlite3Fk
117c0 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65  DropTable(pParse
117d0 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a  , pName, pTab);.
117e0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44      sqlite3CodeD
117f0 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ropTable(pParse,
11800 20 70 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69   pTab, iDb, isVi
11810 65 77 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64  ew);.  }..exit_d
11820 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c  rop_table:.  sql
11830 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
11840 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a  e(db, pName);.}.
11850 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
11860 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
11870 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f   create a new fo
11880 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65  reign key on the
11890 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e   table.** curren
118a0 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
118b0 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f  uction.  pFromCo
118c0 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  l determines whi
118d0 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  ch columns.** in
118e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
118f0 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  le point to the 
11900 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66  foreign key.  If
11910 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65   pFromCol==0 the
11920 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65  n.** connect the
11930 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74   key to the last
11940 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64   column inserted
11950 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61  .  pTo is the na
11960 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62  me of.** the tab
11970 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20  le referred to. 
11980 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73   pToCol is a lis
11990 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  t of tables in t
119a0 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20  he other.** pTo 
119b0 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66  table that the f
119c0 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74  oreign key point
119d0 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e  s to.  flags con
119e0 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66  tains all.** inf
119f0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
11a00 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f  he conflict reso
11a10 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
11a20 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69  s specified.** i
11a30 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c  n the ON DELETE,
11a40 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f   ON UPDATE and O
11a50 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73  N INSERT clauses
11a60 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20  ..**.** An FKey 
11a70 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
11a80 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74  ated and added t
11a90 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
11aa0 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63  ently.** under c
11ab0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74  onstruction in t
11ac0 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  he pParse->pNewT
11ad0 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a  able field..**.*
11ae0 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  * The foreign ke
11af0 79 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d  y is set for IMM
11b00 45 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e  EDIATE processin
11b10 67 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74  g.  A subsequent
11b20 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69   call.** to sqli
11b30 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  te3DeferForeignK
11b40 65 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67  ey() might chang
11b50 65 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52  e this to DEFERR
11b60 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ED..*/.void sqli
11b70 74 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e  te3CreateForeign
11b80 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Key(.  Parse *pP
11b90 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
11ba0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
11bb0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46  /.  ExprList *pF
11bc0 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75  romCol,  /* Colu
11bd0 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c  mns in this tabl
11be0 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  e that point to 
11bf0 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
11c00 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20   Token *pTo,    
11c10 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
11c20 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
11c30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
11c40 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f  pToCol,    /* Co
11c50 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68  lumns in the oth
11c60 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  er table */.  in
11c70 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
11c80 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72     /* Conflict r
11c90 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
11ca0 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71  thms. */.){.  sq
11cb0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
11cc0 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20  se->db;.#ifndef 
11cd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
11ce0 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a  IGN_KEY.  FKey *
11cf0 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 46 4b 65  pFKey = 0;.  FKe
11d00 79 20 2a 70 4e 65 78 74 54 6f 3b 0a 20 20 54 61  y *pNextTo;.  Ta
11d10 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d  ble *p = pParse-
11d20 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e  >pNewTable;.  in
11d30 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69  t nByte;.  int i
11d40 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20  ;.  int nCol;.  
11d50 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65  char *z;..  asse
11d60 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20  rt( pTo!=0 );.  
11d70 69 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44  if( p==0 || IN_D
11d80 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f  ECLARE_VTAB ) go
11d90 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28  to fk_end;.  if(
11da0 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
11db0 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
11dc0 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66  ->nCol-1;.    if
11dd0 28 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30 29 20  ( NEVER(iCol<0) 
11de0 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20  ) goto fk_end;. 
11df0 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26     if( pToCol &&
11e00 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d   pToCol->nExpr!=
11e10 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
11e20 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
11e30 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20  e, "foreign key 
11e40 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20 20  on %s".         
11e50 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e  " should referen
11e60 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75  ce only one colu
11e70 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c  mn of table %T",
11e80 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  .         p->aCo
11e90 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70  l[iCol].zName, p
11ea0 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  To);.      goto 
11eb0 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  fk_end;.    }.  
11ec0 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65    nCol = 1;.  }e
11ed0 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26  lse if( pToCol &
11ee0 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21  & pToCol->nExpr!
11ef0 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72  =pFromCol->nExpr
11f00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
11f10 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
11f20 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20          "number 
11f30 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f  of columns in fo
11f40 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e  reign key does n
11f50 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d  ot match the num
11f60 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20  ber of ".       
11f70 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65   "columns in the
11f80 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c   referenced tabl
11f90 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b  e");.    goto fk
11fa0 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  _end;.  }else{. 
11fb0 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43     nCol = pFromC
11fc0 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20  ol->nExpr;.  }. 
11fd0 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
11fe0 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f 6c 2d  *pFKey) + (nCol-
11ff0 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d  1)*sizeof(pFKey-
12000 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d  >aCol[0]) + pTo-
12010 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54  >n + 1;.  if( pT
12020 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28  oCol ){.    for(
12030 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e  i=0; i<pToCol->n
12040 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
12050 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74    nByte += sqlit
12060 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f  e3Strlen30(pToCo
12070 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b  l->a[i].zName) +
12080 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
12090 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 44  pFKey = sqlite3D
120a0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
120b0 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70  nByte );.  if( p
120c0 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67  FKey==0 ){.    g
120d0 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a  oto fk_end;.  }.
120e0 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d    pFKey->pFrom =
120f0 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65   p;.  pFKey->pNe
12100 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65  xtFrom = p->pFKe
12110 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29  y;.  z = (char*)
12120 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f  &pFKey->aCol[nCo
12130 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f  l];.  pFKey->zTo
12140 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a   = z;.  memcpy(z
12150 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e  , pTo->z, pTo->n
12160 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d  );.  z[pTo->n] =
12170 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71   0;.  sqlite3Deq
12180 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20  uote(z);.  z += 
12190 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65  pTo->n+1;.  pFKe
121a0 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a  y->nCol = nCol;.
121b0 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
121c0 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e  0 ){.    pFKey->
121d0 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[0].iFrom = 
121e0 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c  p->nCol-1;.  }el
121f0 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  se{.    for(i=0;
12200 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
12210 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
12220 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
12230 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
12240 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
12250 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a  trICmp(p->aCol[j
12260 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f  ].zName, pFromCo
12270 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  l->a[i].zName)==
12280 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
12290 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46  FKey->aCol[i].iF
122a0 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  rom = j;.       
122b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
122c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
122d0 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c    if( j>=p->nCol
122e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
122f0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
12300 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  se, .          "
12310 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c  unknown column \
12320 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e  "%s\" in foreign
12330 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22   key definition"
12340 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  , .          pFr
12350 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
12360 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
12370 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d   fk_end;.      }
12380 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
12390 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66   pToCol ){.    f
123a0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
123b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
123c0 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
123d0 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  n30(pToCol->a[i]
123e0 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  .zName);.      p
123f0 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43  FKey->aCol[i].zC
12400 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65  ol = z;.      me
12410 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e  mcpy(z, pToCol->
12420 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a  a[i].zName, n);.
12430 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a        z[n] = 0;.
12440 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a        z += n+1;.
12450 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65      }.  }.  pFKe
12460 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20  y->isDeferred = 
12470 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74  0;.  pFKey->aAct
12480 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66 6c  ion[0] = (u8)(fl
12490 61 67 73 20 26 20 30 78 66 66 29 3b 20 20 20 20  ags & 0xff);    
124a0 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44 45          /* ON DE
124b0 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20  LETE action */. 
124c0 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b   pFKey->aAction[
124d0 31 5d 20 3d 20 28 75 38 29 28 28 66 6c 61 67 73  1] = (u8)((flags
124e0 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 29 3b   >> 8 ) & 0xff);
124f0 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45      /* ON UPDATE
12500 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73   action */..  as
12510 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
12520 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
12530 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 20   0, p->pSchema) 
12540 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20 28  );.  pNextTo = (
12550 46 4b 65 79 20 2a 29 73 71 6c 69 74 65 33 48 61  FKey *)sqlite3Ha
12560 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63  shInsert(&p->pSc
12570 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c 20  hema->fkeyHash, 
12580 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54  .      pFKey->zT
12590 6f 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  o, sqlite3Strlen
125a0 33 30 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2c 20  30(pFKey->zTo), 
125b0 28 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20 20  (void *)pFKey.  
125c0 29 3b 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f  );.  if( pNextTo
125d0 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 64  ==pFKey ){.    d
125e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
125f0 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b  = 1;.    goto fk
12600 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
12610 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20 20 20 61  pNextTo ){.    a
12620 73 73 65 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e  ssert( pNextTo->
12630 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20  pPrevTo==0 );.  
12640 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f    pFKey->pNextTo
12650 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20   = pNextTo;.    
12660 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f  pNextTo->pPrevTo
12670 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20   = pFKey;.  }.. 
12680 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72   /* Link the for
12690 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20  eign key to the 
126a0 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73  table as the las
126b0 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70  t step..  */.  p
126c0 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b  ->pFKey = pFKey;
126d0 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66  .  pFKey = 0;..f
126e0 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33  k_end:.  sqlite3
126f0 44 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79  DbFree(db, pFKey
12700 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  );.#endif /* !de
12710 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
12720 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a  T_FOREIGN_KEY) *
12730 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  /.  sqlite3ExprL
12740 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 46  istDelete(db, pF
12750 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  romCol);.  sqlit
12760 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
12770 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a  (db, pToCol);.}.
12780 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
12790 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
127a0 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20  en an INITIALLY 
127b0 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49  IMMEDIATE or INI
127c0 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
127d0 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65  ** clause is see
127e0 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66  n as part of a f
127f0 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
12800 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65  ition.  The isDe
12810 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65  ferred.** parame
12820 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49  ter is 1 for INI
12830 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20  TIALLY DEFERRED 
12840 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41  and 0 for INITIA
12850 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a  LLY IMMEDIATE..*
12860 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f  * The behavior o
12870 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
12880 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65  tly created fore
12890 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73  ign key is adjus
128a0 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  ted.** according
128b0 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
128c0 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  te3DeferForeignK
128d0 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ey(Parse *pParse
128e0 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64  , int isDeferred
128f0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
12900 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
12910 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  EY.  Table *pTab
12920 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b  ;.  FKey *pFKey;
12930 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70  .  if( (pTab = p
12940 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
12950 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d  )==0 || (pFKey =
12960 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30   pTab->pFKey)==0
12970 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
12980 65 72 74 28 20 69 73 44 65 66 65 72 72 65 64 3d  ert( isDeferred=
12990 3d 30 20 7c 7c 20 69 73 44 65 66 65 72 72 65 64  =0 || isDeferred
129a0 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d  ==1 ); /* EV: R-
129b0 33 30 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20  30323-21917 */. 
129c0 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72   pFKey->isDeferr
129d0 65 64 20 3d 20 28 75 38 29 69 73 44 65 66 65 72  ed = (u8)isDefer
129e0 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  red;.#endif.}../
129f0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
12a00 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61  de that will era
12a10 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e  se and refill in
12a20 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73  dex *pIdx.  This
12a30 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69   is.** used to i
12a40 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c  nitialize a newl
12a50 79 20 63 72 65 61 74 65 64 20 69 6e 64 65 78 20  y created index 
12a60 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20  or to recompute 
12a70 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
12a80 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65  f an index in re
12a90 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e  sponse to a REIN
12aa0 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  DEX command..**.
12ab0 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67  ** if memRootPag
12ac0 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76  e is not negativ
12ad0 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
12ae0 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65   the index is ne
12af0 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20  wly.** created. 
12b00 20 54 68 65 20 72 65 67 69 73 74 65 72 20 73 70   The register sp
12b10 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f  ecified by memRo
12b20 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  otPage contains 
12b30 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
12b40 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
12b50 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f  ndex.  If memRoo
12b60 74 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  tPage is negativ
12b70 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69  e, then.** the i
12b80 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
12b90 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20  sts and must be 
12ba0 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 62  cleared before b
12bb0 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e  eing refilled an
12bc0 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61  d.** the root pa
12bd0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
12be0 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20   index is taken 
12bf0 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75  from pIndex->tnu
12c00 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
12c10 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49  d sqlite3RefillI
12c20 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
12c30 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  se, Index *pInde
12c40 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61  x, int memRootPa
12c50 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ge){.  Table *pT
12c60 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61  ab = pIndex->pTa
12c70 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62  ble;  /* The tab
12c80 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64 65 78  le that is index
12c90 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ed */.  int iTab
12ca0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
12cb0 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20  +;     /* Btree 
12cc0 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  cursor used for 
12cd0 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49  pTab */.  int iI
12ce0 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
12cf0 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65  b++;     /* Btre
12d00 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f  e cursor used fo
12d10 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  r pIndex */.  in
12d20 74 20 69 53 6f 72 74 65 72 3b 20 20 20 20 20 20  t iSorter;      
12d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12d40 43 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 62 79  Cursor opened by
12d50 20 4f 70 65 6e 53 6f 72 74 65 72 20 28 69 66 20   OpenSorter (if 
12d60 69 6e 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74  in use) */.  int
12d70 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20   addr1;         
12d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
12d90 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66  ddress of top of
12da0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
12db0 64 64 72 32 3b 20 20 20 20 20 20 20 20 20 20 20  ddr2;           
12dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
12dd0 72 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20  ress to jump to 
12de0 66 6f 72 20 6e 65 78 74 20 69 74 65 72 61 74 69  for next iterati
12df0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d  on */.  int tnum
12e00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12e10 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
12e20 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a  age of index */.
12e30 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e50 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
12e60 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74  e into this virt
12e70 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20  ual machine */. 
12e80 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20   KeyInfo *pKey; 
12e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ea0 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69  /* KeyInfo for i
12eb0 6e 64 65 78 20 2a 2f 0a 23 69 66 64 65 66 20 53  ndex */.#ifdef S
12ec0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 52 47 45  QLITE_OMIT_MERGE
12ed0 5f 53 4f 52 54 0a 20 20 69 6e 74 20 72 65 67 49  _SORT.  int regI
12ee0 64 78 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20  dxKey;          
12ef0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
12f00 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ers containing t
12f10 68 65 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  he index key */.
12f20 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 72 65 67  #endif.  int reg
12f30 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
12f40 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
12f50 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65  ter holding asse
12f60 6d 62 6c 69 65 64 20 69 6e 64 65 78 20 72 65 63  mblied index rec
12f70 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
12f80 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
12f90 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  b;      /* The d
12fa0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12fb0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20  on */.  int iDb 
12fc0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
12fd0 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  oIndex(db, pInde
12fe0 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69  x->pSchema);..#i
12ff0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13000 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
13010 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
13020 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
13030 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70  QLITE_REINDEX, p
13040 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c  Index->zName, 0,
13050 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
13060 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20  Db].zName ) ){. 
13070 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
13080 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75  endif..  /* Requ
13090 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
130a0 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f   on the table to
130b0 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70   perform this op
130c0 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  eration */.  sql
130d0 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
130e0 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
130f0 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e  >tnum, 1, pTab->
13100 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73  zName);..  v = s
13110 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
13120 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
13130 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
13140 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30  ( memRootPage>=0
13150 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d   ){.    tnum = m
13160 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65  emRootPage;.  }e
13170 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  lse{.    tnum = 
13180 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20  pIndex->tnum;.  
13190 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
131a0 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c  Op2(v, OP_Clear,
131b0 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d   tnum, iDb);.  }
131c0 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  .  pKey = sqlite
131d0 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
131e0 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20  arse, pIndex);. 
131f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13200 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  p4(v, OP_OpenWri
13210 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20  te, iIdx, tnum, 
13220 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  iDb, .          
13230 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 20            (char 
13240 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e  *)pKey, P4_KEYIN
13250 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 69  FO_HANDOFF);.  i
13260 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d  f( memRootPage>=
13270 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
13280 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
13290 31 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  1);.  }..#ifndef
132a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 52   SQLITE_OMIT_MER
132b0 47 45 5f 53 4f 52 54 0a 20 20 2f 2a 20 4f 70 65  GE_SORT.  /* Ope
132c0 6e 20 74 68 65 20 73 6f 72 74 65 72 20 63 75 72  n the sorter cur
132d0 73 6f 72 20 69 66 20 77 65 20 61 72 65 20 74 6f  sor if we are to
132e0 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69   use one. */.  i
132f0 53 6f 72 74 65 72 20 3d 20 70 50 61 72 73 65 2d  Sorter = pParse-
13300 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74  >nTab++;.  sqlit
13310 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
13320 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 69  OP_SorterOpen, i
13330 53 6f 72 74 65 72 2c 20 30 2c 20 30 2c 20 28 63  Sorter, 0, 0, (c
13340 68 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45  har*)pKey, P4_KE
13350 59 49 4e 46 4f 29 3b 0a 23 65 6c 73 65 0a 20 20  YINFO);.#else.  
13360 69 53 6f 72 74 65 72 20 3d 20 69 54 61 62 3b 0a  iSorter = iTab;.
13370 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 70 65  #endif..  /* Ope
13380 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 4c 6f 6f  n the table. Loo
13390 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f  p through all ro
133a0 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2c  ws of the table,
133b0 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 64 65 78   inserting index
133c0 0a 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 69 6e  .  ** records in
133d0 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a  to the sorter. *
133e0 2f 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54  /.  sqlite3OpenT
133f0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61  able(pParse, iTa
13400 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  b, iDb, pTab, OP
13410 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64  _OpenRead);.  ad
13420 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
13430 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
13440 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a  wind, iTab, 0);.
13450 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
13460 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
13470 70 50 61 72 73 65 29 3b 0a 0a 23 69 66 6e 64 65  pParse);..#ifnde
13480 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
13490 52 47 45 5f 53 4f 52 54 0a 20 20 73 71 6c 69 74  RGE_SORT.  sqlit
134a0 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b  e3GenerateIndexK
134b0 65 79 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ey(pParse, pInde
134c0 78 2c 20 69 54 61 62 2c 20 72 65 67 52 65 63 6f  x, iTab, regReco
134d0 72 64 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65  rd, 1);.  sqlite
134e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
134f0 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20  P_SorterInsert, 
13500 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f  iSorter, regReco
13510 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rd);.  sqlite3Vd
13520 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
13530 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31  ext, iTab, addr1
13540 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  +1);.  sqlite3Vd
13550 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
13560 64 72 31 29 3b 0a 20 20 61 64 64 72 31 20 3d 20  dr1);.  addr1 = 
13570 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13580 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f  2(v, OP_SorterSo
13590 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 30 29 3b  rt, iSorter, 0);
135a0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f  .  if( pIndex->o
135b0 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
135c0 29 7b 0a 20 20 20 20 69 6e 74 20 6a 32 20 3d 20  ){.    int j2 = 
135d0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
135e0 6e 74 41 64 64 72 28 76 29 20 2b 20 33 3b 0a 20  ntAddr(v) + 3;. 
135f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13600 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
13610 20 30 2c 20 6a 32 29 3b 0a 20 20 20 20 61 64 64   0, j2);.    add
13620 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
13630 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
13640 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13650 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp3(v, OP_Sort
13660 65 72 43 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74  erCompare, iSort
13670 65 72 2c 20 6a 32 2c 20 72 65 67 52 65 63 6f 72  er, j2, regRecor
13680 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48  d);.    sqlite3H
13690 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  altConstraint(. 
136a0 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 4f         pParse, O
136b0 45 5f 41 62 6f 72 74 2c 20 22 69 6e 64 65 78 65  E_Abort, "indexe
136c0 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f  d columns are no
136d0 74 20 75 6e 69 71 75 65 22 2c 20 50 34 5f 53 54  t unique", P4_ST
136e0 41 54 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 65  ATIC.    );.  }e
136f0 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 32 20 3d  lse{.    addr2 =
13700 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
13710 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d 0a  entAddr(v);.  }.
13720 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13730 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
13740 44 61 74 61 2c 20 69 53 6f 72 74 65 72 2c 20 72  Data, iSorter, r
13750 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
13760 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
13770 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
13780 69 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 2c  iIdx, regRecord,
13790 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   1);.  sqlite3Vd
137a0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
137b0 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
137c0 4c 54 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65 67  LT);.#else.  reg
137d0 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
137e0 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
137f0 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
13800 20 69 54 61 62 2c 20 72 65 67 52 65 63 6f 72 64   iTab, regRecord
13810 2c 20 31 29 3b 0a 20 20 61 64 64 72 32 20 3d 20  , 1);.  addr2 = 
13820 61 64 64 72 31 20 2b 20 31 3b 0a 20 20 69 66 28  addr1 + 1;.  if(
13830 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
13840 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20  !=OE_None ){.   
13850 20 63 6f 6e 73 74 20 69 6e 74 20 72 65 67 52 6f   const int regRo
13860 77 69 64 20 3d 20 72 65 67 49 64 78 4b 65 79 20  wid = regIdxKey 
13870 2b 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  + pIndex->nColum
13880 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  n;.    const int
13890 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j2 = sqlite3Vdb
138a0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
138b0 2b 20 32 3b 0a 20 20 20 20 76 6f 69 64 20 2a 20  + 2;.    void * 
138c0 63 6f 6e 73 74 20 70 52 65 67 4b 65 79 20 3d 20  const pRegKey = 
138d0 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
138e0 52 28 72 65 67 49 64 78 4b 65 79 29 3b 0a 0a 20  R(regIdxKey);.. 
138f0 20 20 20 2f 2a 20 54 68 65 20 72 65 67 69 73 74     /* The regist
13900 65 72 73 20 61 63 63 65 73 73 65 64 20 62 79 20  ers accessed by 
13910 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 20  the OP_IsUnique 
13920 6f 70 63 6f 64 65 20 77 65 72 65 20 61 6c 6c 6f  opcode were allo
13930 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 75 73 69  cated.    ** usi
13940 6e 67 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  ng sqlite3GetTem
13950 70 52 61 6e 67 65 28 29 20 69 6e 73 69 64 65 20  pRange() inside 
13960 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 47 65  of the sqlite3Ge
13970 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 29  nerateIndexKey()
13980 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f  .    ** call abo
13990 76 65 2e 20 4a 75 73 74 20 62 65 66 6f 72 65 20  ve. Just before 
139a0 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 77 61  that function wa
139b0 73 20 66 72 65 65 64 20 74 68 65 79 20 77 65 72  s freed they wer
139c0 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a  e released.    *
139d0 2a 20 28 6d 61 64 65 20 61 76 61 69 6c 61 62 6c  * (made availabl
139e0 65 20 74 6f 20 74 68 65 20 63 6f 6d 70 69 6c 65  e to the compile
139f0 72 20 66 6f 72 20 72 65 75 73 65 29 20 75 73 69  r for reuse) usi
13a00 6e 67 20 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  ng .    ** sqlit
13a10 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
13a20 67 65 28 29 2e 20 53 6f 20 69 6e 20 73 6f 6d 65  ge(). So in some
13a30 20 77 61 79 73 20 68 61 76 69 6e 67 20 74 68 65   ways having the
13a40 20 4f 50 5f 49 73 55 6e 69 71 75 65 0a 20 20 20   OP_IsUnique.   
13a50 20 2a 2a 20 6f 70 63 6f 64 65 20 75 73 65 20 74   ** opcode use t
13a60 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
13a70 20 77 69 74 68 69 6e 20 73 65 65 6d 73 20 64 61   within seems da
13a80 6e 67 65 72 6f 75 73 2e 20 48 6f 77 65 76 65 72  ngerous. However
13a90 2c 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 77  , since.    ** w
13aa0 65 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68  e can be sure th
13ab0 61 74 20 6e 6f 20 6f 74 68 65 72 20 74 65 6d 70  at no other temp
13ac0 20 72 65 67 69 73 74 65 72 73 20 68 61 76 65 20   registers have 
13ad0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 20  been allocated. 
13ae0 20 20 20 2a 2a 20 73 69 6e 63 65 20 73 71 6c 69     ** since sqli
13af0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
13b00 6e 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64  nge() was called
13b10 2c 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  , it is safe to 
13b20 64 6f 20 73 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20  do so..    */.  
13b30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13b40 4f 70 34 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71  Op4(v, OP_IsUniq
13b50 75 65 2c 20 69 49 64 78 2c 20 6a 32 2c 20 72 65  ue, iIdx, j2, re
13b60 67 52 6f 77 69 64 2c 20 70 52 65 67 4b 65 79 2c  gRowid, pRegKey,
13b70 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20   P4_INT32);.    
13b80 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
13b90 72 61 69 6e 74 28 0a 20 20 20 20 20 20 20 20 70  raint(.        p
13ba0 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c  Parse, OE_Abort,
13bb0 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e   "indexed column
13bc0 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65  s are not unique
13bd0 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  ", P4_STATIC);. 
13be0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
13bf0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
13c00 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65  Insert, iIdx, re
13c10 67 52 65 63 6f 72 64 2c 20 30 29 3b 0a 20 20 73  gRecord, 0);.  s
13c20 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
13c30 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
13c40 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 23 65 6e  SEEKRESULT);.#en
13c50 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  dif.  sqlite3Rel
13c60 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
13c70 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
13c80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13c90 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
13ca0 4e 65 78 74 2c 20 69 53 6f 72 74 65 72 2c 20 61  Next, iSorter, a
13cb0 64 64 72 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddr2);.  sqlite3
13cc0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
13cd0 61 64 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74  addr1);..  sqlit
13ce0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
13cf0 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b  OP_Close, iTab);
13d00 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
13d10 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
13d20 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74  , iIdx);.  sqlit
13d30 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
13d40 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65  OP_Close, iSorte
13d50 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  r);.}../*.** Cre
13d60 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20  ate a new index 
13d70 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65  for an SQL table
13d80 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32  .  pName1.pName2
13d90 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
13da0 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e  the index .** an
13db0 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68  d pTblList is th
13dc0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
13dd0 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
13de0 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68  e indexed.  Both
13df0 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c   will .** be NUL
13e00 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20  L for a primary 
13e10 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20  key or an index 
13e20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20  that is created 
13e30 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20  to satisfy a.** 
13e40 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
13e50 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e  t.  If pTable an
13e60 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c  d pIndex are NUL
13e70 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70  L, use pParse->p
13e80 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74  NewTable.** as t
13e90 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
13ea0 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d  ndexed.  pParse-
13eb0 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20  >pNewTable is a 
13ec0 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a  table that is.**
13ed0 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
13ee0 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
13ef0 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
13f00 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
13f10 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
13f20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  of columns to be
13f30 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74   indexed.  pList
13f40 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66   will be NULL if
13f50 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72   this.** is a pr
13f60 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69  imary key or uni
13f70 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f  que-constraint o
13f80 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
13f90 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a  t column added.*
13fa0 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  * to the table c
13fb0 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
13fc0 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a  onstruction.  .*
13fd0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 64 65  *.** If the inde
13fe0 78 20 69 73 20 63 72 65 61 74 65 64 20 73 75 63  x is created suc
13ff0 63 65 73 73 66 75 6c 6c 79 2c 20 72 65 74 75 72  cessfully, retur
14000 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
14010 68 65 20 6e 65 77 20 49 6e 64 65 78 0a 2a 2a 20  he new Index.** 
14020 73 74 72 75 63 74 75 72 65 2e 20 54 68 69 73 20  structure. This 
14030 69 73 20 75 73 65 64 20 62 79 20 73 71 6c 69 74  is used by sqlit
14040 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28  e3AddPrimaryKey(
14050 29 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 69 6e  ) to mark the in
14060 64 65 78 0a 2a 2a 20 61 73 20 74 68 65 20 74 61  dex.** as the ta
14070 62 6c 65 73 20 70 72 69 6d 61 72 79 20 6b 65 79  bles primary key
14080 20 28 49 6e 64 65 78 2e 61 75 74 6f 49 6e 64 65   (Index.autoInde
14090 78 3d 3d 32 29 2e 0a 2a 2f 0a 49 6e 64 65 78 20  x==2)..*/.Index 
140a0 2a 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e  *sqlite3CreateIn
140b0 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
140c0 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c  arse,     /* All
140d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
140e0 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f  ut this parse */
140f0 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
14100 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70  ,     /* First p
14110 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
14120 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
14130 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
14140 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64  2,     /* Second
14150 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
14160 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
14170 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
14180 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c  TblName, /* Tabl
14190 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20  e to index. Use 
141a0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
141b0 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72  e if 0 */.  Expr
141c0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f  List *pList,   /
141d0 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  * A list of colu
141e0 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
141f0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  d */.  int onErr
14200 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f  or,       /* OE_
14210 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65  Abort, OE_Ignore
14220 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72  , OE_Replace, or
14230 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f   OE_None */.  To
14240 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20  ken *pStart,    
14250 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
14260 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
14270 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
14280 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  */.  Token *pEnd
14290 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  ,       /* The "
142a0 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74  )" that closes t
142b0 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  he CREATE INDEX 
142c0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
142d0 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20  nt sortOrder,   
142e0 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20    /* Sort order 
142f0 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77  of primary key w
14300 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20  hen pList==NULL 
14310 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78  */.  int ifNotEx
14320 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20  ist     /* Omit 
14330 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61  error if index a
14340 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
14350 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 52 65  .){.  Index *pRe
14360 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 6f  t = 0;     /* Po
14370 69 6e 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20  inter to return 
14380 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
14390 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62   = 0;     /* Tab
143a0 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
143b0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
143c0 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68  dex = 0;   /* Th
143d0 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72  e index to be cr
143e0 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  eated */.  char 
143f0 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  *zName = 0;     
14400 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69  /* Name of the i
14410 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  ndex */.  int nN
14420 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
14430 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  * Number of char
14440 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20  acters in zName 
14450 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  */.  int i, j;. 
14460 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20   Token nullId;  
14470 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f        /* Fake to
14480 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79  ken for an empty
14490 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62   ID list */.  Db
144a0 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 20  Fixer sFix;     
144b0 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e     /* For assign
144c0 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d  ing database nam
144d0 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a  es to pTable */.
144e0 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d    int sortOrderM
144f0 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68  ask;   /* 1 to h
14500 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64  onor DESC in ind
14510 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65  ex.  0 to ignore
14520 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  . */.  sqlite3 *
14530 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
14540 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20  .  Db *pDb;     
14550 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
14560 70 65 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f  pecific table co
14570 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64  ntaining the ind
14580 65 78 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f  exed database */
14590 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
145a0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
145b0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
145c0 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 77   that is being w
145d0 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ritten */.  Toke
145e0 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20  n *pName = 0;   
145f0 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20   /* Unqualified 
14600 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
14610 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20  x to create */. 
14620 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
14630 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d  _item *pListItem
14640 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67  ; /* For looping
14650 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20   over pList */. 
14660 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e 74   int nCol;.  int
14670 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 63   nExtra = 0;.  c
14680 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a 0a 20 20  har *zExtra;..  
14690 61 73 73 65 72 74 28 20 70 53 74 61 72 74 3d 3d  assert( pStart==
146a0 30 20 7c 7c 20 70 45 6e 64 21 3d 30 20 29 3b 20  0 || pEnd!=0 ); 
146b0 2f 2a 20 70 45 6e 64 20 6d 75 73 74 20 62 65 20  /* pEnd must be 
146c0 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 70 53 74 61  non-NULL if pSta
146d0 72 74 20 69 73 20 2a 2f 0a 20 20 61 73 73 65 72  rt is */.  asser
146e0 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
146f0 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 65  =0 );      /* Ne
14700 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ver called with 
14710 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a  prior errors */.
14720 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
14730 46 61 69 6c 65 64 20 7c 7c 20 49 4e 5f 44 45 43  Failed || IN_DEC
14740 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20  LARE_VTAB ){.   
14750 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
14760 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  e_index;.  }.  i
14770 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
14780 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
14790 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67  pParse) ){.    g
147a0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
147b0 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
147c0 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74  .  ** Find the t
147d0 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
147e0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74  be indexed.  Ret
147f0 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74  urn early if not
14800 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69   found..  */.  i
14810 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
14820 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  {..    /* Use th
14830 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78  e two-part index
14840 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
14850 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ne the database 
14860 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63  .    ** to searc
14870 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  h for the table.
14880 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65   'Fix' the table
14890 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62   name to this db
148a0 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c  .    ** before l
148b0 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61  ooking up the ta
148c0 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
148d0 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26  assert( pName1 &
148e0 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20  & pName2 );.    
148f0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
14900 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
14910 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
14920 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66   &pName);.    if
14930 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65  ( iDb<0 ) goto e
14940 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
14950 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
14960 61 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e 7a 20  ame && pName->z 
14970 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
14980 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20  TE_OMIT_TEMPDB. 
14990 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64     /* If the ind
149a0 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75  ex name was unqu
149b0 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69  alified, check i
149c0 66 20 74 68 65 20 74 68 65 20 74 61 62 6c 65 0a  f the the table.
149d0 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70      ** is a temp
149e0 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73   table. If so, s
149f0 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
14a00 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20  to 1. Do not do 
14a10 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69  this.    ** if i
14a20 6e 69 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61  nitialising a da
14a30 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20  tabase schema.. 
14a40 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64     */.    if( !d
14a50 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
14a60 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c        pTab = sql
14a70 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75  ite3SrcListLooku
14a80 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61  p(pParse, pTblNa
14a90 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  me);.      if( p
14aa0 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70  Name2->n==0 && p
14ab0 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63  Tab && pTab->pSc
14ac0 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d  hema==db->aDb[1]
14ad0 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  .pSchema ){.    
14ae0 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20      iDb = 1;.   
14af0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
14b00 66 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  f..    if( sqlit
14b10 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
14b20 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69   pParse, iDb, "i
14b30 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 20 26 26  ndex", pName) &&
14b40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14b50 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78  FixSrcList(&sFix
14b60 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20 20  , pTblName).    
14b70 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61  ){.      /* Beca
14b80 75 73 65 20 74 68 65 20 70 61 72 73 65 72 20 63  use the parser c
14b90 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61  onstructs pTblNa
14ba0 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  me from a single
14bb0 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20   identifier,.   
14bc0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78     ** sqlite3Fix
14bd0 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65  SrcList can neve
14be0 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20  r fail. */.     
14bf0 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20   assert(0);.    
14c00 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  }.    pTab = sql
14c10 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
14c20 70 50 61 72 73 65 2c 20 30 2c 20 70 54 62 6c 4e  pParse, 0, pTblN
14c30 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
14c40 20 0a 20 20 20 20 20 20 20 20 70 54 62 6c 4e 61   .        pTblNa
14c50 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
14c60 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54  se);.    if( !pT
14c70 61 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  ab || db->malloc
14c80 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78  Failed ) goto ex
14c90 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
14ca0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
14cb0 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
14cc0 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
14cd0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
14ce0 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d   assert( pName==
14cf0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
14d00 20 70 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20   pStart==0 );.  
14d10 20 20 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d    pTab = pParse-
14d20 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20  >pNewTable;.    
14d30 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f  if( !pTab ) goto
14d40 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
14d50 65 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ex;.    iDb = sq
14d60 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
14d70 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
14d80 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62  hema);.  }.  pDb
14d90 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
14da0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  ;..  assert( pTa
14db0 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
14dc0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
14dd0 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
14de0 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
14df0 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
14e00 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 20 20  ", 7)==0 .      
14e10 20 26 26 20 6d 65 6d 63 6d 70 28 26 70 54 61 62   && memcmp(&pTab
14e20 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74 65  ->zName[7],"alte
14e30 72 74 61 62 5f 22 2c 39 29 21 3d 30 20 29 7b 0a  rtab_",9)!=0 ){.
14e40 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14e50 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
14e60 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65  le %s may not be
14e70 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d   indexed", pTab-
14e80 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
14e90 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
14ea0 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  dex;.  }.#ifndef
14eb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
14ec0 57 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53  W.  if( pTab->pS
14ed0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
14ee0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14ef0 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20  rse, "views may 
14f00 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29  not be indexed")
14f10 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
14f20 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
14f30 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  }.#endif.#ifndef
14f40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
14f50 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
14f60 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
14f70 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
14f80 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
14f90 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 6d  virtual tables m
14fa0 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
14fb0 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
14fc0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
14fd0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
14fe0 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
14ff0 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
15000 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  x.  Make sure th
15010 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ere is not alrea
15020 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20  dy another.  ** 
15030 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77  index or table w
15040 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
15050 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  e.  .  **.  ** E
15060 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65  xception:  If we
15070 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
15080 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e   names of perman
15090 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d  ent indices from
150a0 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
150b0 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 62  _master table (b
150c0 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65  ecause some othe
150d0 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65  r process change
150e0 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e  d the schema) an
150f0 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68  d.  ** one of th
15100 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f  e index names co
15110 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65 20  llides with the 
15120 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72  name of a tempor
15130 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a  ary table or.  *
15140 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65  * index, then we
15150 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74   will continue t
15160 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20 69  o process this i
15170 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
15180 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  If pName==0 it m
15190 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72 65  eans that we are
151a0 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69  .  ** dealing wi
151b0 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  th a primary key
151c0 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
151d0 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20  raint.  We have 
151e0 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20  to invent our.  
151f0 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a  ** own name..  *
15200 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  /.  if( pName ){
15210 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
15220 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
15230 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
15240 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
15250 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
15260 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73  e_index;.    ass
15270 65 72 74 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30  ert( pName->z!=0
15280 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   );.    if( SQLI
15290 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
152a0 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
152b0 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
152c0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
152d0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
152e0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d    }.    if( !db-
152f0 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
15300 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
15310 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
15320 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20  me, 0)!=0 ){.   
15330 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
15340 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68  rMsg(pParse, "th
15350 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
15360 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22   table named %s"
15370 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
15380 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
15390 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
153a0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
153b0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
153c0 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d  (db, zName, pDb-
153d0 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  >zName)!=0 ){.  
153e0 20 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78      if( !ifNotEx
153f0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ist ){.        s
15400 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
15410 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73  Parse, "index %s
15420 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
15430 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
15440 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
15450 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
15460 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20 20  .busy );.       
15470 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
15480 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
15490 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20   iDb);.      }. 
154a0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
154b0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
154c0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
154d0 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78  int n;.    Index
154e0 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72   *pLoop;.    for
154f0 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e  (pLoop=pTab->pIn
15500 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b  dex, n=1; pLoop;
15510 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e   pLoop=pLoop->pN
15520 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20  ext, n++){}.    
15530 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
15540 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69  Printf(db, "sqli
15550 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f  te_autoindex_%s_
15560 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %d", pTab->zName
15570 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  , n);.    if( zN
15580 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
15590 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
155a0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
155b0 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
155c0 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  r authorization 
155d0 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  to create an ind
155e0 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ex..  */.#ifndef
155f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
15600 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
15610 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
15620 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b  Db = pDb->zName;
15630 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
15640 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
15650 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
15660 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
15670 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  b), 0, zDb) ){. 
15680 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
15690 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
156a0 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54   }.    i = SQLIT
156b0 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a  E_CREATE_INDEX;.
156c0 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
156d0 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
156e0 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
156f0 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  TE_TEMP_INDEX;. 
15700 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
15710 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
15720 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i, zName, pTab->
15730 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
15740 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
15750 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
15760 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
15770 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c   /* If pList==0,
15780 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72   it means this r
15790 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
157a0 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d  d to make a prim
157b0 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74  ary.  ** key out
157c0 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   of the last col
157d0 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  umn added to the
157e0 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
157f0 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  struction..  ** 
15800 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65  So create a fake
15810 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74   list to simulat
15820 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69  e this..  */.  i
15830 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
15840 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54     nullId.z = pT
15850 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
15860 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col-1].zName;.  
15870 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 71 6c    nullId.n = sql
15880 69 74 65 33 53 74 72 6c 65 6e 33 30 28 28 63 68  ite3Strlen30((ch
15890 61 72 2a 29 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20  ar*)nullId.z);. 
158a0 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
158b0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
158c0 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a  (pParse, 0, 0);.
158d0 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
158e0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
158f0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 73  ate_index;.    s
15900 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
15910 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4c  tName(pParse, pL
15920 69 73 74 2c 20 26 6e 75 6c 6c 49 64 2c 20 30 29  ist, &nullId, 0)
15930 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30  ;.    pList->a[0
15940 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  ].sortOrder = (u
15950 38 29 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  8)sortOrder;.  }
15960 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
15970 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73  t how many bytes
15980 20 6f 66 20 73 70 61 63 65 20 61 72 65 20 72 65   of space are re
15990 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
159a0 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20  explicitly.  ** 
159b0 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74  specified collat
159c0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
159d0 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
159e0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
159f0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
15a00 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73  pr *pExpr = pLis
15a10 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
15a20 20 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a     if( pExpr ){.
15a30 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
15a40 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43  Coll = pExpr->pC
15a50 6f 6c 6c 3b 0a 20 20 20 20 20 20 2f 2a 20 45 69  oll;.      /* Ei
15a60 74 68 65 72 20 70 43 6f 6c 6c 21 3d 30 20 6f 72  ther pColl!=0 or
15a70 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 4f 4f   there was an OO
15a80 4d 20 66 61 69 6c 75 72 65 2e 20 20 42 75 74 20  M failure.  But 
15a90 69 66 20 61 6e 20 4f 4f 4d 0a 20 20 20 20 20 20  if an OOM.      
15aa0 2a 2a 20 66 61 69 6c 75 72 65 20 77 65 20 68 61  ** failure we ha
15ab0 76 65 20 71 75 69 74 20 62 65 66 6f 72 65 20 72  ve quit before r
15ac0 65 61 63 68 69 6e 67 20 74 68 69 73 20 70 6f 69  eaching this poi
15ad0 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  nt. */.      if(
15ae0 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 29   ALWAYS(pColl) )
15af0 7b 0a 20 20 20 20 20 20 20 20 6e 45 78 74 72 61  {.        nExtra
15b00 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33   += (1 + sqlite3
15b10 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e  Strlen30(pColl->
15b20 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d  zName));.      }
15b30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
15b40 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20   .  ** Allocate 
15b50 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74  the index struct
15b60 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61  ure. .  */.  nNa
15b70 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
15b80 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e  en30(zName);.  n
15b90 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  Col = pList->nEx
15ba0 70 72 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73  pr;.  pIndex = s
15bb0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
15bc0 72 6f 28 64 62 2c 20 0a 20 20 20 20 20 20 52 4f  ro(db, .      RO
15bd0 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65  UND8(sizeof(Inde
15be0 78 29 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  x)) +           
15bf0 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75     /* Index stru
15c00 63 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20  cture  */.      
15c10 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 74 52  ROUND8(sizeof(tR
15c20 6f 77 63 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29 29  owcnt)*(nCol+1))
15c30 20 2b 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69   +   /* Index.ai
15c40 52 6f 77 45 73 74 20 20 20 2a 2f 0a 20 20 20 20  RowEst   */.    
15c50 20 20 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29    sizeof(char *)
15c60 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20  *nCol +         
15c70 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
15c80 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20  azColl     */.  
15c90 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a      sizeof(int)*
15ca0 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20  nCol +          
15cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
15cc0 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a  x.aiColumn   */.
15cd0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29        sizeof(u8)
15ce0 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20  *nCol +         
15cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
15d00 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a  dex.aSortOrder *
15d10 2f 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20  /.      nName + 
15d20 31 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  1 +             
15d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15d40 49 6e 64 65 78 2e 7a 4e 61 6d 65 20 20 20 20 20  Index.zName     
15d50 20 2a 2f 0a 20 20 20 20 20 20 6e 45 78 74 72 61   */.      nExtra
15d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15d80 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  * Collation sequ
15d90 65 6e 63 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  ence names */.  
15da0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
15db0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
15dc0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
15dd0 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 7a  e_index;.  }.  z
15de0 45 78 74 72 61 20 3d 20 28 63 68 61 72 2a 29 70  Extra = (char*)p
15df0 49 6e 64 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d  Index;.  pIndex-
15e00 3e 61 69 52 6f 77 45 73 74 20 3d 20 28 74 52 6f  >aiRowEst = (tRo
15e10 77 63 6e 74 2a 29 26 7a 45 78 74 72 61 5b 52 4f  wcnt*)&zExtra[RO
15e20 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65  UND8(sizeof(Inde
15e30 78 29 29 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  x))];.  pIndex->
15e40 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a  azColl = (char**
15e50 29 0a 20 20 20 20 20 28 28 63 68 61 72 2a 29 70  ).     ((char*)p
15e60 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 20  Index->aiRowEst 
15e70 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  + ROUND8(sizeof(
15e80 74 52 6f 77 63 6e 74 29 2a 6e 43 6f 6c 2b 31 29  tRowcnt)*nCol+1)
15e90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
15ea0 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
15eb0 54 28 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45  T(pIndex->aiRowE
15ec0 73 74 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  st) );.  assert(
15ed0 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
15ee0 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a  NMENT(pIndex->az
15ef0 43 6f 6c 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65  Coll) );.  pInde
15f00 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69  x->aiColumn = (i
15f10 6e 74 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61  nt *)(&pIndex->a
15f20 7a 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20  zColl[nCol]);.  
15f30 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
15f40 65 72 20 3d 20 28 75 38 20 2a 29 28 26 70 49 6e  er = (u8 *)(&pIn
15f50 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43  dex->aiColumn[nC
15f60 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  ol]);.  pIndex->
15f70 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29  zName = (char *)
15f80 28 26 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f  (&pIndex->aSortO
15f90 72 64 65 72 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 7a  rder[nCol]);.  z
15fa0 45 78 74 72 61 20 3d 20 28 63 68 61 72 20 2a 29  Extra = (char *)
15fb0 28 26 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 5b  (&pIndex->zName[
15fc0 6e 4e 61 6d 65 2b 31 5d 29 3b 0a 20 20 6d 65 6d  nName+1]);.  mem
15fd0 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  cpy(pIndex->zNam
15fe0 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b  e, zName, nName+
15ff0 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54  1);.  pIndex->pT
16000 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70  able = pTab;.  p
16010 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d  Index->nColumn =
16020 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
16030 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
16040 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a   = (u8)onError;.
16050 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e    pIndex->autoIn
16060 64 65 78 20 3d 20 28 75 38 29 28 70 4e 61 6d 65  dex = (u8)(pName
16070 3d 3d 30 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  ==0);.  pIndex->
16080 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
16090 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a  b[iDb].pSchema;.
160a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
160b0 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
160c0 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
160d0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
160e0 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20  ee if we should 
160f0 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65  honor DESC reque
16100 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c  sts on index col
16110 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  umns.  */.  if( 
16120 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69  pDb->pSchema->fi
16130 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a  le_format>=4 ){.
16140 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73      sortOrderMas
16150 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e  k = -1;   /* Hon
16160 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c  or DESC */.  }el
16170 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65  se{.    sortOrde
16180 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a  rMask = 0;    /*
16190 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a   Ignore DESC */.
161a0 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74    }..  /* Scan t
161b0 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
161c0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74  columns of the t
161d0 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
161e0 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64  ed and.  ** load
161f0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69   the column indi
16200 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64  ces into the Ind
16210 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  ex structure.  R
16220 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20  eport an error. 
16230 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d   ** if any colum
16240 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  n is not found..
16250 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20    **.  ** TODO: 
16260 20 41 64 64 20 61 20 74 65 73 74 20 74 6f 20 6d   Add a test to m
16270 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
16280 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73  e same column is
16290 20 6e 6f 74 20 6e 61 6d 65 64 0a 20 20 2a 2a 20   not named.  ** 
162a0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 77  more than once w
162b0 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 69  ithin the same i
162c0 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20  ndex.  Only the 
162d0 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65 20 6f  first instance o
162e0 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75 6d  f.  ** the colum
162f0 6e 20 77 69 6c 6c 20 65 76 65 72 20 62 65 20 75  n will ever be u
16300 73 65 64 20 62 79 20 74 68 65 20 6f 70 74 69 6d  sed by the optim
16310 69 7a 65 72 2e 20 20 4e 6f 74 65 20 74 68 61 74  izer.  Note that
16320 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
16330 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 6d 6f 72 65  same column more
16340 20 74 68 61 6e 20 6f 6e 63 65 20 63 61 6e 6e 6f   than once canno
16350 74 20 62 65 20 61 6e 20 65 72 72 6f 72 20 62 65  t be an error be
16360 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64  cause that would
16370 20 0a 20 20 2a 2a 20 62 72 65 61 6b 20 62 61 63   .  ** break bac
16380 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
16390 6c 69 74 79 20 2d 20 69 74 20 6e 65 65 64 73 20  lity - it needs 
163a0 74 6f 20 62 65 20 61 20 77 61 72 6e 69 6e 67 2e  to be a warning.
163b0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
163c0 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73 74   pListItem=pList
163d0 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  ->a; i<pList->nE
163e0 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49  xpr; i++, pListI
163f0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  tem++){.    cons
16400 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e 61 6d 65  t char *zColName
16410 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 7a 4e   = pListItem->zN
16420 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  ame;.    Column 
16430 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 20 20 69 6e  *pTabCol;.    in
16440 74 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f  t requestedSortO
16450 72 64 65 72 3b 0a 20 20 20 20 63 68 61 72 20 2a  rder;.    char *
16460 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  zColl;          
16470 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
16480 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
16490 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28  ame */..    for(
164a0 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61  j=0, pTabCol=pTa
164b0 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d  b->aCol; j<pTab-
164c0 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62  >nCol; j++, pTab
164d0 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  Col++){.      if
164e0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
164f0 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43  (zColName, pTabC
16500 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  ol->zName)==0 ) 
16510 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
16520 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
16530 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
16540 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
16550 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
16560 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s no column name
16570 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  d %s",.        p
16580 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Tab->zName, zCol
16590 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 50 61  Name);.      pPa
165a0 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
165b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
165c0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
165d0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
165e0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
165f0 5d 20 3d 20 6a 3b 0a 20 20 20 20 2f 2a 20 4a 75  ] = j;.    /* Ju
16600 73 74 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 74  stification of t
16610 68 65 20 41 4c 57 41 59 53 28 70 4c 69 73 74 49  he ALWAYS(pListI
16620 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c  tem->pExpr->pCol
16630 6c 29 3a 20 20 42 65 63 61 75 73 65 20 6f 66 0a  l):  Because of.
16640 20 20 20 20 2a 2a 20 74 68 65 20 77 61 79 20 74      ** the way t
16650 68 65 20 22 69 64 78 6c 69 73 74 22 20 6e 6f 6e  he "idxlist" non
16660 2d 74 65 72 6d 69 6e 61 6c 20 69 73 20 63 6f 6e  -terminal is con
16670 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20  structed by the 
16680 70 61 72 73 65 72 2c 0a 20 20 20 20 2a 2a 20 69  parser,.    ** i
16690 66 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  f pListItem->pEx
166a0 70 72 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 74  pr is not null t
166b0 68 65 6e 20 65 69 74 68 65 72 20 70 4c 69 73 74  hen either pList
166c0 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f  Item->pExpr->pCo
166d0 6c 6c 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 65  ll.    ** must e
166e0 78 69 73 74 20 6f 72 20 65 6c 73 65 20 74 68 65  xist or else the
166f0 72 65 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  re must have bee
16700 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20  n an OOM error. 
16710 20 42 75 74 20 69 66 20 74 68 65 72 65 0a 20 20   But if there.  
16720 20 20 2a 2a 20 77 61 73 20 61 6e 20 4f 4f 4d 20    ** was an OOM 
16730 65 72 72 6f 72 2c 20 77 65 20 77 6f 75 6c 64 20  error, we would 
16740 6e 65 76 65 72 20 72 65 61 63 68 20 74 68 69 73  never reach this
16750 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 69   point. */.    i
16760 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45  f( pListItem->pE
16770 78 70 72 20 26 26 20 41 4c 57 41 59 53 28 70 4c  xpr && ALWAYS(pL
16780 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
16790 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  pColl) ){.      
167a0 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20  int nColl;.     
167b0 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74   zColl = pListIt
167c0 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  em->pExpr->pColl
167d0 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e  ->zName;.      n
167e0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74  Coll = sqlite3St
167f0 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b 20  rlen30(zColl) + 
16800 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
16810 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29   nExtra>=nColl )
16820 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
16830 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43  Extra, zColl, nC
16840 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c  oll);.      zCol
16850 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20 20  l = zExtra;.    
16860 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 43 6f 6c    zExtra += nCol
16870 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20  l;.      nExtra 
16880 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65  -= nColl;.    }e
16890 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  lse{.      zColl
168a0 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
168b0 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 66  .zColl;.      if
168c0 28 20 21 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !zColl ){.    
168d0 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 64 62 2d 3e      zColl = db->
168e0 70 44 66 6c 74 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  pDfltColl->zName
168f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16900 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
16910 74 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69 74  t.busy && !sqlit
16920 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
16930 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29  pParse, zColl) )
16940 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
16950 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
16960 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
16970 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43  ->azColl[i] = zC
16980 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74  oll;.    request
16990 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c  edSortOrder = pL
169a0 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  istItem->sortOrd
169b0 65 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61  er & sortOrderMa
169c0 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  sk;.    pIndex->
169d0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
169e0 28 75 38 29 72 65 71 75 65 73 74 65 64 53 6f 72  (u8)requestedSor
169f0 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20 73 71  tOrder;.  }.  sq
16a00 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45  lite3DefaultRowE
16a10 73 74 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 69  st(pIndex);..  i
16a20 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d  f( pTab==pParse-
16a30 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20  >pNewTable ){.  
16a40 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
16a50 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  e has been calle
16a60 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61  d to create an a
16a70 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61  utomatic index a
16a80 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c  s a.    ** resul
16a90 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b  t of a PRIMARY K
16aa0 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61  EY or UNIQUE cla
16ab0 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20  use on a column 
16ac0 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20  definition, or. 
16ad0 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20     ** a PRIMARY 
16ae0 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c  KEY or UNIQUE cl
16af0 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ause following t
16b00 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69  he column defini
16b10 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e  tions..    ** i.
16b20 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a  e. one of:.    *
16b30 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20  *.    ** CREATE 
16b40 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52  TABLE t(x PRIMAR
16b50 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a  Y KEY, y);.    *
16b60 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
16b70 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c  (x, y, UNIQUE(x,
16b80 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20   y));.    **.   
16b90 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20   ** Either way, 
16ba0 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
16bb0 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
16bc0 79 20 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e  y has such an in
16bd0 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73  dex. If.    ** s
16be0 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20  o, don't bother 
16bf0 63 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e  creating this on
16c00 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70  e. This only app
16c10 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61  lies to.    ** a
16c20 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65  utomatically cre
16c30 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73  ated indices. Us
16c40 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68  ers can do as th
16c50 65 79 20 77 69 73 68 20 77 69 74 68 0a 20 20 20  ey wish with.   
16c60 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64   ** explicit ind
16c70 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ices..    **.   
16c80 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45 20 6f   ** Two UNIQUE o
16c90 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
16ca0 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f  nstraints are co
16cb0 6e 73 69 64 65 72 65 64 20 65 71 75 69 76 61 6c  nsidered equival
16cc0 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20  ent.    ** (and 
16cd0 74 68 75 73 20 73 75 70 70 72 65 73 73 69 6e 67  thus suppressing
16ce0 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29   the second one)
16cf0 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 68 61   even if they ha
16d00 76 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20  ve different.   
16d10 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 73 2e   ** sort orders.
16d20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
16d30 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66  f there are diff
16d40 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20  erent collating 
16d50 73 65 71 75 65 6e 63 65 73 20 6f 72 20 69 66 20  sequences or if 
16d60 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20  the columns of. 
16d70 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72     ** the constr
16d80 61 69 6e 74 20 6f 63 63 75 72 20 69 6e 20 64 69  aint occur in di
16d90 66 66 65 72 65 6e 74 20 6f 72 64 65 72 73 2c 20  fferent orders, 
16da0 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61  then the constra
16db0 69 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  ints are.    ** 
16dc0 63 6f 6e 73 69 64 65 72 65 64 20 64 69 73 74 69  considered disti
16dd0 6e 63 74 20 61 6e 64 20 62 6f 74 68 20 72 65 73  nct and both res
16de0 75 6c 74 20 69 6e 20 73 65 70 61 72 61 74 65 20  ult in separate 
16df0 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a  indices..    */.
16e00 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
16e10 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
16e20 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
16e30 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
16e40 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  xt){.      int k
16e50 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16e60 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  pIdx->onError!=O
16e70 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20  E_None );.      
16e80 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 75  assert( pIdx->au
16e90 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20 20 20 20  toIndex );.     
16ea0 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
16eb0 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
16ec0 65 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  e );..      if( 
16ed0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d 70  pIdx->nColumn!=p
16ee0 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Index->nColumn )
16ef0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
16f00 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78   for(k=0; k<pIdx
16f10 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b  ->nColumn; k++){
16f20 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
16f30 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20  har *z1;.       
16f40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b   const char *z2;
16f50 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
16f60 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d  x->aiColumn[k]!=
16f70 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
16f80 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  [k] ) break;.   
16f90 20 20 20 20 20 7a 31 20 3d 20 70 49 64 78 2d 3e       z1 = pIdx->
16fa0 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20  azColl[k];.     
16fb0 20 20 20 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e     z2 = pIndex->
16fc0 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20  azColl[k];.     
16fd0 20 20 20 69 66 28 20 7a 31 21 3d 7a 32 20 26 26     if( z1!=z2 &&
16fe0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
16ff0 7a 31 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b  z1, z2) ) break;
17000 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
17010 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c  f( k==pIdx->nCol
17020 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69  umn ){.        i
17030 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
17040 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  !=pIndex->onErro
17050 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
17060 2a 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  * This constrain
17070 74 20 63 72 65 61 74 65 73 20 74 68 65 20 73 61  t creates the sa
17080 6d 65 20 69 6e 64 65 78 20 61 73 20 61 20 70 72  me index as a pr
17090 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20  evious.         
170a0 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73   ** constraint s
170b0 70 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65  pecified somewhe
170c0 72 65 20 69 6e 20 74 68 65 20 43 52 45 41 54 45  re in the CREATE
170d0 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
170e0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48  ..          ** H
170f0 6f 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f  owever the ON CO
17100 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61  NFLICT clauses a
17110 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66  re different. If
17120 20 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20   both this .    
17130 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61        ** constra
17140 69 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65 76  int and the prev
17150 69 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20  ious equivalent 
17160 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20  constraint have 
17170 65 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20  explicit.       
17180 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43     ** ON CONFLIC
17190 54 20 63 6c 61 75 73 65 73 20 74 68 69 73 20 69  T clauses this i
171a0 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65  s an error. Othe
171b0 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20  rwise, use the. 
171c0 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c           ** expl
171d0 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64  icitly specified
171e0 20 62 65 68 61 76 69 6f 75 72 20 66 6f 72 20 74   behaviour for t
171f0 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  he index..      
17200 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
17210 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45   if( !(pIdx->onE
17220 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
17230 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72   || pIndex->onEr
17240 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29  ror==OE_Default)
17250 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17260 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
17270 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
17280 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69           "confli
17290 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43  cting ON CONFLIC
172a0 54 20 63 6c 61 75 73 65 73 20 73 70 65 63 69 66  T clauses specif
172b0 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ied", 0);.      
172c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
172d0 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
172e0 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b  r==OE_Default ){
172f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64  .            pId
17300 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e  x->onError = pIn
17310 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20  dex->onError;.  
17320 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17330 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f    }.        goto
17340 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
17350 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
17360 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b  }.  }..  /* Link
17370 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73   the new Index s
17380 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20  tructure to its 
17390 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65  table and to the
173a0 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d   other.  ** in-m
173b0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73  emory database s
173c0 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f  tructures. .  */
173d0 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
173e0 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65  busy ){.    Inde
173f0 78 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74  x *p;.    assert
17400 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
17410 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20  utexHeld(db, 0, 
17420 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
17430 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69   );.    p = sqli
17440 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
17450 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e  Index->pSchema->
17460 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20  idxHash, .      
17470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17480 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
17490 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
174a0 33 30 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  30(pIndex->zName
174b0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
174c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
174d0 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20  dex);.    if( p 
174e0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
174f0 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f   p==pIndex );  /
17500 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
17510 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  ve failed */.   
17520 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
17530 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 67  led = 1;.      g
17540 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
17550 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
17560 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
17570 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
17580 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c  es;.    if( pTbl
17590 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
175a0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
175b0 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
175c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
175d0 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69  * If the db->ini
175e0 74 2e 62 75 73 79 20 69 73 20 30 20 74 68 65 6e  t.busy is 0 then
175f0 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 64 65   create the inde
17600 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73  x on disk.  This
17610 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77  .  ** involves w
17620 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78  riting the index
17630 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72   into the master
17640 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69   table and filli
17650 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69  ng in the.  ** i
17660 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 63 75  ndex with the cu
17670 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74  rrent table cont
17680 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ents..  **.  ** 
17690 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  The db->init.bus
176a0 79 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20  y is 0 when the 
176b0 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72  user first enter
176c0 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58  s a CREATE INDEX
176d0 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20   .  ** command. 
176e0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
176f0 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62  s 1 when a datab
17700 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e  ase is opened an
17710 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49  d .  ** CREATE I
17720 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20  NDEX statements 
17730 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20  are read out of 
17740 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
17750 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c  .  In.  ** the l
17760 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69  atter case the i
17770 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
17780 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69  sts on disk, whi
17790 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77  ch is why.  ** w
177a0 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20  e don't want to 
177b0 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a  recreate it..  *
177c0 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61  *.  ** If pTblNa
177d0 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
177e0 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e  his index is gen
177f0 65 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d  erated as a prim
17800 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20  ary key.  ** or 
17810 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
17820 74 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41  t of a CREATE TA
17830 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
17840 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a  Since the table.
17850 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65    ** has just be
17860 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63  en created, it c
17870 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20  ontains no data 
17880 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e  and the index in
17890 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a  itialization.  *
178a0 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b  * step can be sk
178b0 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
178c0 73 65 7b 20 2f 2a 20 69 66 28 20 64 62 2d 3e 69  se{ /* if( db->i
178d0 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 20 2a 2f  nit.busy==0 ) */
178e0 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
178f0 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
17900 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b     int iMem = ++
17910 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20  pParse->nMem;.. 
17920 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
17930 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
17940 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f     if( v==0 ) go
17950 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
17960 6e 64 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43  ndex;...    /* C
17970 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61  reate the rootpa
17980 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ge for the index
17990 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
179a0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
179b0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
179c0 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
179d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
179e0 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c   OP_CreateIndex,
179f0 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20   iDb, iMem);..  
17a00 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20    /* Gather the 
17a10 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
17a20 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
17a30 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f  X statement into
17a40 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d  .    ** the zStm
17a50 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  t variable.    *
17a60 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  /.    if( pStart
17a70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
17a80 28 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20  ( pEnd!=0 );.   
17a90 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e     /* A named in
17aa0 64 65 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c  dex with an expl
17ab0 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44 45  icit CREATE INDE
17ac0 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  X statement */. 
17ad0 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c       zStmt = sql
17ae0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
17af0 22 43 52 45 41 54 45 25 73 20 49 4e 44 45 58 20  "CREATE%s INDEX 
17b00 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f  %.*s",.        o
17b10 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
17b20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22  ? "" : " UNIQUE"
17b30 2c 0a 20 20 20 20 20 20 20 20 28 69 6e 74 29 28  ,.        (int)(
17b40 70 45 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d  pEnd->z - pName-
17b50 3e 7a 29 20 2b 20 31 2c 0a 20 20 20 20 20 20 20  >z) + 1,.       
17b60 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20   pName->z);.    
17b70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
17b80 41 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  An automatic ind
17b90 65 78 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ex created by a 
17ba0 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
17bb0 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
17bc0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74   */.      /* zSt
17bd0 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
17be0 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20  ntf(""); */.    
17bf0 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20    zStmt = 0;.   
17c00 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61   }..    /* Add a
17c10 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74  n entry in sqlit
17c20 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69  e_master for thi
17c30 73 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20  s index.    */. 
17c40 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
17c50 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
17c60 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49         "INSERT I
17c70 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53  NTO %Q.%s VALUES
17c80 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23  ('index',%Q,%Q,#
17c90 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20  %d,%Q);",.      
17ca0 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
17cb0 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
17cc0 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20  LE(iDb),.       
17cd0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a   pIndex->zName,.
17ce0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
17cf0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 69 4d 65  ame,.        iMe
17d00 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74  m,.        zStmt
17d10 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
17d20 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
17d30 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  tmt);..    /* Fi
17d40 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69 74  ll the index wit
17d50 68 20 64 61 74 61 20 61 6e 64 20 72 65 70 61 72  h data and repar
17d60 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43  se the schema. C
17d70 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65  ode an OP_Expire
17d80 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c  .    ** to inval
17d90 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f  idate all pre-co
17da0 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
17db0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
17dc0 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20  ( pTblName ){.  
17dd0 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
17de0 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
17df0 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20  Index, iMem);.  
17e00 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
17e10 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
17e20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
17e30 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53  te3VdbeAddParseS
17e40 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a  chemaOp(v, iDb,.
17e50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17e60 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d  MPrintf(db, "nam
17e70 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65 3d  e='%q' AND type=
17e80 27 69 6e 64 65 78 27 22 2c 20 70 49 6e 64 65 78  'index'", pIndex
17e90 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
17ea0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17eb0 70 31 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c  p1(v, OP_Expire,
17ec0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   0);.    }.  }..
17ed0 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67    /* When adding
17ee0 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65   an index to the
17ef0 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73   list of indices
17f00 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61   for a table, ma
17f10 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c  ke.  ** sure all
17f20 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64   indices labeled
17f30 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65   OE_Replace come
17f40 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65   after all those
17f50 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45   labeled.  ** OE
17f60 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69  _Ignore.  This i
17f70 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20  s necessary for 
17f80 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6e 73  the correct cons
17f90 74 72 61 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a  traint check.  *
17fa0 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 28 69 6e  * processing (in
17fb0 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
17fc0 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73  ConstraintChecks
17fd0 28 29 29 20 61 73 20 70 61 72 74 20 6f 66 0a 20  ()) as part of. 
17fe0 20 2a 2a 20 55 50 44 41 54 45 20 61 6e 64 20 49   ** UPDATE and I
17ff0 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 73  NSERT statements
18000 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  .  .  */.  if( d
18010 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
18020 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  pTblName==0 ){. 
18030 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d     if( onError!=
18040 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54  OE_Replace || pT
18050 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20  ab->pIndex==0.  
18060 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e         || pTab->
18070 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d  pIndex->onError=
18080 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20  =OE_Replace){.  
18090 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78      pIndex->pNex
180a0 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  t = pTab->pIndex
180b0 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49  ;.      pTab->pI
180c0 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20  ndex = pIndex;. 
180d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
180e0 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20  Index *pOther = 
180f0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
18100 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65      while( pOthe
18110 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68  r->pNext && pOth
18120 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72  er->pNext->onErr
18130 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29  or!=OE_Replace )
18140 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65 72  {.        pOther
18150 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
18160 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18170 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
18180 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
18190 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65       pOther->pNe
181a0 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  xt = pIndex;.   
181b0 20 7d 0a 20 20 20 20 70 52 65 74 20 3d 20 70 49   }.    pRet = pI
181c0 6e 64 65 78 3b 0a 20 20 20 20 70 49 6e 64 65 78  ndex;.    pIndex
181d0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
181e0 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20  Clean up before 
181f0 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f  exiting */.exit_
18200 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20  create_index:.  
18210 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20  if( pIndex ){.  
18220 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
18230 64 62 2c 20 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c  db, pIndex->zCol
18240 41 66 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Aff);.    sqlite
18250 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 6e 64  3DbFree(db, pInd
18260 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ex);.  }.  sqlit
18270 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
18280 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73  (db, pList);.  s
18290 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
182a0 65 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65  ete(db, pTblName
182b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
182c0 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
182d0 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
182e0 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20  ./*.** Fill the 
182f0 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d  Index.aiRowEst[]
18300 20 61 72 72 61 79 20 77 69 74 68 20 64 65 66 61   array with defa
18310 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ult information 
18320 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  - information.**
18330 20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e   to be used when
18340 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e   we have not run
18350 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d   the ANALYZE com
18360 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f  mand..**.** aiRo
18370 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f  wEst[0] is suppo
18380 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  se to contain th
18390 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
183a0 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65  ents in the inde
183b0 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64  x..** Since we d
183c0 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73  o not know, gues
183d0 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69  s 1 million.  ai
183e0 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20  RowEst[1] is an 
183f0 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a  estimate of the.
18400 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
18410 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74  s in the table t
18420 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61  hat match any pa
18430 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f  rticular value o
18440 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63  f the.** first c
18450 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
18460 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d  ex.  aiRowEst[2]
18470 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
18480 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  of the number.**
18490 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61   of rows that ma
184a0 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c  tch any particul
184b0 61 72 20 63 6f 6d 62 69 6e 69 61 74 69 6f 6e 20  ar combiniation 
184c0 6f 66 20 74 68 65 20 66 69 72 73 74 20 32 20 63  of the first 2 c
184d0 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65  olumns.** of the
184e0 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20   index.  And so 
184f0 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20  forth.  It must 
18500 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 63 61  always be the ca
18510 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20  se that.*.**    
18520 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b         aiRowEst[
18530 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31  N]<=aiRowEst[N-1
18540 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  ].**           a
18550 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a  iRowEst[N]>=1.**
18560 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74  .** Apart from t
18570 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74  hat, we have lit
18580 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73  tle to go on bes
18590 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61  ides intuition a
185a0 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f  s to.** how aiRo
185b0 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65  wEst[] should be
185c0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54   initialized.  T
185d0 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72  he numbers gener
185e0 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65  ated here.** are
185f0 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61   based on typica
18600 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69  l values found i
18610 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73  n actual indices
18620 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
18630 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49  3DefaultRowEst(I
18640 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 74  ndex *pIdx){.  t
18650 52 6f 77 63 6e 74 20 2a 61 20 3d 20 70 49 64 78  Rowcnt *a = pIdx
18660 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20 69 6e  ->aiRowEst;.  in
18670 74 20 69 3b 0a 20 20 74 52 6f 77 63 6e 74 20 6e  t i;.  tRowcnt n
18680 3b 0a 20 20 61 73 73 65 72 74 28 20 61 21 3d 30  ;.  assert( a!=0
18690 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 49 64   );.  a[0] = pId
186a0 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 45  x->pTable->nRowE
186b0 73 74 3b 0a 20 20 69 66 28 20 61 5b 30 5d 3c 31  st;.  if( a[0]<1
186c0 30 20 29 20 61 5b 30 5d 20 3d 20 31 30 3b 0a 20  0 ) a[0] = 10;. 
186d0 20 6e 20 3d 20 31 30 3b 0a 20 20 66 6f 72 28 69   n = 10;.  for(i
186e0 3d 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 43 6f  =1; i<=pIdx->nCo
186f0 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
18700 61 5b 69 5d 20 3d 20 6e 3b 0a 20 20 20 20 69 66  a[i] = n;.    if
18710 28 20 6e 3e 35 20 29 20 6e 2d 2d 3b 0a 20 20 7d  ( n>5 ) n--;.  }
18720 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45  .  if( pIdx->onE
18730 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b  rror!=OE_None ){
18740 0a 20 20 20 20 61 5b 70 49 64 78 2d 3e 6e 43 6f  .    a[pIdx->nCo
18750 6c 75 6d 6e 5d 20 3d 20 31 3b 0a 20 20 7d 0a 7d  lumn] = 1;.  }.}
18760 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
18770 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61  tine will drop a
18780 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64  n existing named
18790 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f   index.  This ro
187a0 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  utine.** impleme
187b0 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44  nts the DROP IND
187c0 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  EX statement..*/
187d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
187e0 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  pIndex(Parse *pP
187f0 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
18800 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78 69 73  Name, int ifExis
18810 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ts){.  Index *pI
18820 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ndex;.  Vdbe *v;
18830 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
18840 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
18850 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73 73 65 72  nt iDb;..  asser
18860 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
18870 3d 30 20 29 3b 20 20 20 2f 2a 20 4e 65 76 65 72  =0 );   /* Never
18880 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 72 69   called with pri
18890 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  or errors */.  i
188a0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
188b0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
188c0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
188d0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
188e0 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
188f0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
18900 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
18910 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
18920 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
18930 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70  p_index;.  }.  p
18940 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46  Index = sqlite3F
18950 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61  indIndex(db, pNa
18960 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
18970 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
18980 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49  abase);.  if( pI
18990 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ndex==0 ){.    i
189a0 66 28 20 21 69 66 45 78 69 73 74 73 20 29 7b 0a  f( !ifExists ){.
189b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
189c0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
189d0 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53  o such index: %S
189e0 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  ", pName, 0);.  
189f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
18a00 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
18a10 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72  NamedSchema(pPar
18a20 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  se, pName->a[0].
18a30 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
18a40 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  }.    pParse->ch
18a50 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
18a60 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
18a70 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  p_index;.  }.  i
18a80 66 28 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49  f( pIndex->autoI
18a90 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  ndex ){.    sqli
18aa0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
18ab0 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63  se, "index assoc
18ac0 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51 55  iated with UNIQU
18ad0 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52  E ".      "or PR
18ae0 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
18af0 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64  aint cannot be d
18b00 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20  ropped", 0);.   
18b10 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
18b20 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62  index;.  }.  iDb
18b30 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
18b40 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  ToIndex(db, pInd
18b50 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69  ex->pSchema);.#i
18b60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18b70 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
18b80 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
18b90 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49   = SQLITE_DROP_I
18ba0 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20  NDEX;.    Table 
18bb0 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
18bc0 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73  pTable;.    cons
18bd0 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
18be0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
18bf0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
18c00 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
18c10 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20  TABLE(iDb);.    
18c20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
18c30 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
18c40 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
18c50 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
18c60 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
18c70 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  p_index;.    }. 
18c80 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
18c90 50 44 42 20 26 26 20 69 44 62 20 29 20 63 6f 64  PDB && iDb ) cod
18ca0 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
18cb0 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  TEMP_INDEX;.    
18cc0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
18cd0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
18ce0 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  e, pIndex->zName
18cf0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
18d00 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
18d10 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
18d20 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
18d30 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
18d40 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
18d50 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  e the index and 
18d60 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20  from the master 
18d70 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73  table */.  v = s
18d80 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
18d90 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
18da0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
18db0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
18dc0 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
18dd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  ;.    sqlite3Nes
18de0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
18df0 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20  .       "DELETE 
18e00 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45  FROM %Q.%s WHERE
18e10 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74 79 70   name=%Q AND typ
18e20 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20 20 20  e='index'",.    
18e30 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
18e40 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
18e50 42 4c 45 28 69 44 62 29 2c 20 70 49 6e 64 65 78  BLE(iDb), pIndex
18e60 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  ->zName.    );. 
18e70 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53     sqlite3ClearS
18e80 74 61 74 54 61 62 6c 65 73 28 70 50 61 72 73 65  tatTables(pParse
18e90 2c 20 69 44 62 2c 20 22 69 64 78 22 2c 20 70 49  , iDb, "idx", pI
18ea0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  ndex->zName);.  
18eb0 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
18ec0 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
18ed0 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52  b);.    destroyR
18ee0 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
18ef0 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44  pIndex->tnum, iD
18f00 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
18f10 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
18f20 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20  DropIndex, iDb, 
18f30 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  0, 0, pIndex->zN
18f40 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78  ame, 0);.  }..ex
18f50 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20  it_drop_index:. 
18f60 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
18f70 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29  elete(db, pName)
18f80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61  ;.}../*.** pArra
18f90 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
18fa0 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62  o an array of ob
18fb0 6a 65 63 74 73 2e 20 45 61 63 68 20 6f 62 6a 65  jects. Each obje
18fc0 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72  ct in the.** arr
18fd0 61 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79  ay is szEntry by
18fe0 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 69  tes in size. Thi
18ff0 73 20 72 6f 75 74 69 6e 65 20 75 73 65 73 20 73  s routine uses s
19000 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
19010 29 0a 2a 2a 20 74 6f 20 65 78 74 65 6e 64 20 74  ).** to extend t
19020 68 65 20 61 72 72 61 79 20 73 6f 20 74 68 61 74  he array so that
19030 20 74 68 65 72 65 20 69 73 20 73 70 61 63 65 20   there is space 
19040 66 6f 72 20 61 20 6e 65 77 20 6f 62 6a 65 63 74  for a new object
19050 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a   at the end..**.
19060 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
19070 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
19080 20 2a 70 6e 45 6e 74 72 79 20 63 6f 6e 74 61 69   *pnEntry contai
19090 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ns the current s
190a0 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20 61 72  ize of.** the ar
190b0 72 61 79 20 28 69 6e 20 65 6e 74 72 69 65 73 20  ray (in entries 
190c0 2d 20 73 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  - so the allocat
190d0 69 6f 6e 20 69 73 20 28 28 2a 70 6e 45 6e 74 72  ion is ((*pnEntr
190e0 79 29 20 2a 20 73 7a 45 6e 74 72 79 29 20 62 79  y) * szEntry) by
190f0 74 65 73 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c 29  tes.** in total)
19100 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
19110 65 61 6c 6c 6f 63 28 29 20 69 73 20 73 75 63 63  ealloc() is succ
19120 65 73 73 66 75 6c 20 28 69 2e 65 2e 20 69 66 20  essful (i.e. if 
19130 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  no OOM condition
19140 20 6f 63 63 75 72 73 29 2c 20 74 68 65 0a 2a 2a   occurs), the.**
19150 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
19160 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6f 62 6a   for the new obj
19170 65 63 74 20 69 73 20 7a 65 72 6f 65 64 2c 20 2a  ect is zeroed, *
19180 70 6e 45 6e 74 72 79 20 75 70 64 61 74 65 64 20  pnEntry updated 
19190 74 6f 0a 2a 2a 20 72 65 66 6c 65 63 74 20 74 68  to.** reflect th
191a0 65 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68  e new size of th
191b0 65 20 61 72 72 61 79 20 61 6e 64 20 61 20 70 6f  e array and a po
191c0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
191d0 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72   allocation.** r
191e0 65 74 75 72 6e 65 64 2e 20 2a 70 49 64 78 20 69  eturned. *pIdx i
191f0 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  s set to the ind
19200 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20 61 72  ex of the new ar
19210 72 61 79 20 65 6e 74 72 79 20 69 6e 20 74 68 69  ray entry in thi
19220 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74  s case..**.** Ot
19230 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
19240 72 65 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2c  realloc() fails,
19250 20 2a 70 49 64 78 20 69 73 20 73 65 74 20 74 6f   *pIdx is set to
19260 20 2d 31 2c 20 2a 70 6e 45 6e 74 72 79 20 72 65   -1, *pnEntry re
19270 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e 67  mains.** unchang
19280 65 64 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66  ed and a copy of
19290 20 70 41 72 72 61 79 20 72 65 74 75 72 6e 65 64   pArray returned
192a0 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
192b0 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
192c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
192d0 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
192e0 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20  on to notify of 
192f0 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20  malloc failures 
19300 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 72 61  */.  void *pArra
19310 79 2c 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  y,     /* Array 
19320 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67  of objects.  Mig
19330 68 74 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65  ht be reallocate
19340 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74  d */.  int szEnt
19350 72 79 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  ry,      /* Size
19360 20 6f 66 20 65 61 63 68 20 6f 62 6a 65 63 74 20   of each object 
19370 69 6e 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a  in the array */.
19380 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20    int *pnEntry, 
19390 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
193a0 20 6f 62 6a 65 63 74 73 20 63 75 72 72 65 6e 74   objects current
193b0 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69  ly in use */.  i
193c0 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  nt *pIdx        
193d0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e   /* Write the in
193e0 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f  dex of a new slo
193f0 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63  t here */.){.  c
19400 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 20  har *z;.  int n 
19410 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 69 66  = *pnEntry;.  if
19420 28 20 28 6e 20 26 20 28 6e 2d 31 29 29 3d 3d 30  ( (n & (n-1))==0
19430 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d   ){.    int sz =
19440 20 28 6e 3d 3d 30 29 20 3f 20 31 20 3a 20 32 2a   (n==0) ? 1 : 2*
19450 6e 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65  n;.    void *pNe
19460 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
19470 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72 61 79 2c  lloc(db, pArray,
19480 20 73 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20   sz*szEntry);.  
19490 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
194a0 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d  .      *pIdx = -
194b0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
194c0 70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20  pArray;.    }.  
194d0 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b    pArray = pNew;
194e0 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72  .  }.  z = (char
194f0 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73  *)pArray;.  mems
19500 65 74 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72  et(&z[n * szEntr
19510 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b  y], 0, szEntry);
19520 0a 20 20 2a 70 49 64 78 20 3d 20 6e 3b 0a 20 20  .  *pIdx = n;.  
19530 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65  ++*pnEntry;.  re
19540 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a  turn pArray;.}..
19550 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
19560 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
19570 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20  e given IdList. 
19580 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64   Create a new Id
19590 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
195a0 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  be..**.** A new 
195b0 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  IdList is return
195c0 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
195d0 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
195e0 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  /.IdList *sqlite
195f0 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 73 71  3IdListAppend(sq
19600 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
19610 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
19620 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20  *pToken){.  int 
19630 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
19640 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
19650 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
19660 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
19670 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  IdList) );.    i
19680 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
19690 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
196a0 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  ist->a = sqlite3
196b0 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
196c0 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 70       db,.      p
196d0 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73  List->a,.      s
196e0 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
196f0 5d 29 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74  ]),.      &pList
19700 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 69 0a  ->nId,.      &i.
19710 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29    );.  if( i<0 )
19720 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  {.    sqlite3IdL
19730 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
19740 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ist);.    return
19750 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d   0;.  }.  pList-
19760 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  >a[i].zName = sq
19770 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
19780 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a  en(db, pToken);.
19790 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
197a0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
197b0 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f  an IdList..*/.vo
197c0 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  id sqlite3IdList
197d0 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
197e0 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73  db, IdList *pLis
197f0 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
19800 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
19810 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
19820 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
19830 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
19840 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
19850 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
19860 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
19870 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29  ee(db, pList->a)
19880 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
19890 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  e(db, pList);.}.
198a0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
198b0 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  e index in pList
198c0 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69   of the identifi
198d0 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52  er named zId.  R
198e0 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e  eturn -1.** if n
198f0 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  ot found..*/.int
19900 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
19910 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  dex(IdList *pLis
19920 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
19930 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
19940 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
19950 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f   return -1;.  fo
19960 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
19970 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nId; i++){.    i
19980 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
19990 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
199a0 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
199b0 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
199c0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
199d0 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65 20  *.** Expand the 
199e0 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
199f0 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 72  for the given Sr
19a00 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79 0a  cList object by.
19a10 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78 74  ** creating nExt
19a20 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65 67  ra new slots beg
19a30 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72 74  inning at iStart
19a40 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a 65 72  .  iStart is zer
19a50 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20  o based..** New 
19a60 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65 64  slots are zeroed
19a70 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
19a80 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20 53  ple, suppose a S
19a90 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79  rcList initially
19aa0 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e   contains two en
19ab0 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54  tries: A,B..** T
19ac0 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20 65  o append 3 new e
19ad0 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65 20  ntries onto the 
19ae0 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a  end, do this:.**
19af0 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53 72  .**    sqlite3Sr
19b00 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c  cListEnlarge(db,
19b10 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32 29   pSrclist, 3, 2)
19b20 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ;.**.** After th
19b30 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74 20  e call above it 
19b40 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20  would contain:  
19b50 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20  A, B, nil, nil, 
19b60 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69  nil..** If the i
19b70 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20 68  Start argument h
19b80 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65 61  ad been 1 instea
19b90 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68 65  d of 2, then the
19ba0 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64   result.** would
19bb0 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c 20   have been:  A, 
19bc0 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42  nil, nil, nil, B
19bd0 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74 68  .  To prepend th
19be0 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20  e new slots,.** 
19bf0 74 68 65 20 69 53 74 61 72 74 20 76 61 6c 75 65  the iStart value
19c00 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68   would be 0.  Th
19c10 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77 6f  e result then wo
19c20 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20  uld.** be: nil, 
19c30 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a  nil, nil, A, B..
19c40 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
19c50 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
19c60 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 69  ls the SrcList i
19c70 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 54 68  s unchanged.  Th
19c80 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  e.** db->mallocF
19c90 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c 20  ailed flag will 
19ca0 62 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a  be set to true..
19cb0 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
19cc0 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
19cd0 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
19ce0 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ,       /* Datab
19cf0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  ase connection t
19d00 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20  o notify of OOM 
19d10 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c  errors */.  SrcL
19d20 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  ist *pSrc,     /
19d30 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f  * The SrcList to
19d40 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a   be enlarged */.
19d50 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
19d60 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
19d70 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61  f new slots to a
19d80 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20  dd to pSrc->a[] 
19d90 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20  */.  int iStart 
19da0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
19db0 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66   in pSrc->a[] of
19dc0 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20   first new slot 
19dd0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  */.){.  int i;..
19de0 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
19df0 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20  king on calling 
19e00 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
19e10 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d  assert( iStart>=
19e20 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
19e30 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73  Extra>=1 );.  as
19e40 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b  sert( pSrc!=0 );
19e50 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72  .  assert( iStar
19e60 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  t<=pSrc->nSrc );
19e70 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
19e80 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65  additional space
19e90 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
19ea0 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 2b 6e  if( pSrc->nSrc+n
19eb0 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c  Extra>pSrc->nAll
19ec0 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  oc ){.    SrcLis
19ed0 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74  t *pNew;.    int
19ee0 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63 2d 3e   nAlloc = pSrc->
19ef0 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20 20 20  nSrc+nExtra;.   
19f00 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20 20 70   int nGot;.    p
19f10 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
19f20 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63 2c  ealloc(db, pSrc,
19f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19f40 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b 20  sizeof(*pSrc) + 
19f50 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f  (nAlloc-1)*sizeo
19f60 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 3b  f(pSrc->a[0]) );
19f70 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
19f80 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
19f90 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
19fa0 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ed );.      retu
19fb0 72 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a 20  rn pSrc;.    }. 
19fc0 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77 3b 0a     pSrc = pNew;.
19fd0 20 20 20 20 6e 47 6f 74 20 3d 20 28 73 71 6c 69      nGot = (sqli
19fe0 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
19ff0 64 62 2c 20 70 4e 65 77 29 20 2d 20 73 69 7a 65  db, pNew) - size
1a000 6f 66 28 2a 70 53 72 63 29 29 2f 73 69 7a 65 6f  of(*pSrc))/sizeo
1a010 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b 31 3b  f(pSrc->a[0])+1;
1a020 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f  .    pSrc->nAllo
1a030 63 20 3d 20 28 75 31 36 29 6e 47 6f 74 3b 0a 20  c = (u16)nGot;. 
1a040 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65 78   }..  /* Move ex
1a050 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74 68 61  isting slots tha
1a060 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74 68 65  t come after the
1a070 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64 20   newly inserted 
1a080 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20 6f  slots.  ** out o
1a090 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20 20 66  f the way */.  f
1a0a0 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d  or(i=pSrc->nSrc-
1a0b0 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20 69 2d  1; i>=iStart; i-
1a0c0 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b  -){.    pSrc->a[
1a0d0 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53 72 63  i+nExtra] = pSrc
1a0e0 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 53  ->a[i];.  }.  pS
1a0f0 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 28 69 31 36  rc->nSrc += (i16
1a100 29 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a  )nExtra;..  /* Z
1a110 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20 61 6c  ero the newly al
1a120 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f  located slots */
1a130 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72 63 2d  .  memset(&pSrc-
1a140 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 73  >a[iStart], 0, s
1a150 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d  izeof(pSrc->a[0]
1a160 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f 72  )*nExtra);.  for
1a170 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69 53 74  (i=iStart; i<iSt
1a180 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29  art+nExtra; i++)
1a190 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d  {.    pSrc->a[i]
1a1a0 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  .iCursor = -1;. 
1a1b0 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20   }..  /* Return 
1a1c0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1a1d0 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c 69 73   enlarged SrcLis
1a1e0 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 53  t */.  return pS
1a1f0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70  rc;.}.../*.** Ap
1a200 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65  pend a new table
1a210 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76   name to the giv
1a220 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65  en SrcList.  Cre
1a230 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73  ate a new SrcLis
1a240 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
1a250 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73    A new entry is
1a260 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
1a270 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20  SrcList even if 
1a280 70 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a  pTable is NULL..
1a290 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74 20  **.** A SrcList 
1a2a0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
1a2b0 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73  NULL if there is
1a2c0 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20   an OOM error.  
1a2d0 54 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  The returned.** 
1a2e0 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 62 65  SrcList might be
1a2f0 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
1a300 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 77 61   SrcList that wa
1a310 73 20 69 6e 70 75 74 20 6f 72 20 69 74 20 6d 69  s input or it mi
1a320 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e 65 77 20  ght be.** a new 
1a330 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f 4f 4d 20  one.  If an OOM 
1a340 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
1a350 73 2c 20 74 68 65 6e 20 74 68 65 20 70 72 69 6f  s, then the prio
1a360 72 20 76 61 6c 75 65 20 6f 66 20 70 4c 69 73 74  r value of pList
1a370 0a 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 70 75  .** that is inpu
1a380 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  t to this routin
1a390 65 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  e is automatical
1a3a0 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ly freed..**.** 
1a3b0 49 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20  If pDatabase is 
1a3c0 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61  not null, it mea
1a3d0 6e 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  ns that the tabl
1a3e0 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61  e has an optiona
1a3f0 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61  l.** database na
1a400 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65  me prefix.  Like
1a410 20 74 68 69 73 3a 20 20 22 64 61 74 61 62 61 73   this:  "databas
1a420 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70  e.table".  The p
1a430 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e  Database.** poin
1a440 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ts to the table 
1a450 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61  name and the pTa
1a460 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ble points to th
1a470 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  e database name.
1a480 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e  .** The SrcList.
1a490 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20  a[].zName field 
1a4a0 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  is filled with t
1a4b0 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68  he table name wh
1a4c0 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d  ich might.** com
1a4d0 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69  e from pTable (i
1a4e0 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e  f pDatabase is N
1a4f0 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61  ULL) or from pDa
1a500 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63  tabase.  .** Src
1a510 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61  List.a[].zDataba
1a520 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  se is filled wit
1a530 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  h the database n
1a540 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c  ame from pTable,
1a550 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c  .** or with NULL
1a560 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20   if no database 
1a570 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  is specified..**
1a580 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
1a590 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65  ds, if call like
1a5a0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1a5b0 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
1a5c0 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c  istAppend(D,A,B,
1a5d0 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42  0);.**.** Then B
1a5e0 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65   is a table name
1a5f0 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
1a600 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63  e name is unspec
1a610 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65  ified.  If calle
1a620 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a  d.** like this:.
1a630 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
1a640 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1a650 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a  nd(D,A,B,C);.**.
1a660 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68 65  ** Then C is the
1a670 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
1a680 42 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73  B is the databas
1a690 65 20 6e 61 6d 65 2e 20 20 49 66 20 43 20 69 73  e name.  If C is
1a6a0 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74 68 65 6e   defined.** then
1a6b0 20 73 6f 20 69 73 20 42 2e 20 20 49 6e 20 6f 74   so is B.  In ot
1a6c0 68 65 72 20 77 6f 72 64 73 2c 20 77 65 20 6e 65  her words, we ne
1a6d0 76 65 72 20 68 61 76 65 20 61 20 63 61 73 65 20  ver have a case 
1a6e0 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  where:.**.**    
1a6f0 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
1a700 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 30 2c  istAppend(D,A,0,
1a710 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70  C);.**.** Both p
1a720 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62  Table and pDatab
1a730 61 73 65 20 61 72 65 20 61 73 73 75 6d 65 64 20  ase are assumed 
1a740 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20 20 54  to be quoted.  T
1a750 68 65 79 20 61 72 65 20 64 65 71 75 6f 74 65 64  hey are dequoted
1a760 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65 69 6e 67  .** before being
1a770 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 53 72   added to the Sr
1a780 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73  cList..*/.SrcLis
1a790 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
1a7a0 74 41 70 70 65 6e 64 28 0a 20 20 73 71 6c 69 74  tAppend(.  sqlit
1a7b0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f  e3 *db,        /
1a7c0 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  * Connection to 
1a7d0 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63  notify of malloc
1a7e0 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 53   failures */.  S
1a7f0 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  rcList *pList,  
1a800 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20     /* Append to 
1a810 74 68 69 73 20 53 72 63 4c 69 73 74 2e 20 4e 55  this SrcList. NU
1a820 4c 4c 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  LL creates a new
1a830 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f   SrcList */.  To
1a840 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20  ken *pTable,    
1a850 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61 70    /* Table to ap
1a860 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  pend */.  Token 
1a870 2a 70 44 61 74 61 62 61 73 65 20 20 20 20 2f 2a  *pDatabase    /*
1a880 20 44 61 74 61 62 61 73 65 20 6f 66 20 74 68 65   Database of the
1a890 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73   table */.){.  s
1a8a0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1a8b0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73  em *pItem;.  ass
1a8c0 65 72 74 28 20 70 44 61 74 61 62 61 73 65 3d 3d  ert( pDatabase==
1a8d0 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20 29  0 || pTable!=0 )
1a8e0 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 76  ;  /* Cannot hav
1a8f0 65 20 43 20 77 69 74 68 6f 75 74 20 42 20 2a 2f  e C without B */
1a900 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1a910 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
1a920 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1a930 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 72  ro(db, sizeof(Sr
1a940 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  cList) );.    if
1a950 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1a960 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
1a970 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20  ->nAlloc = 1;.  
1a980 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  }.  pList = sqli
1a990 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
1a9a0 65 28 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20  e(db, pList, 1, 
1a9b0 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20  pList->nSrc);.  
1a9c0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1a9d0 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
1a9e0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1a9f0 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
1aa00 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1aa10 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
1aa20 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31  >a[pList->nSrc-1
1aa30 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61  ];.  if( pDataba
1aa40 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d  se && pDatabase-
1aa50 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61  >z==0 ){.    pDa
1aa60 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a  tabase = 0;.  }.
1aa70 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
1aa80 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  ){.    Token *pT
1aa90 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b  emp = pDatabase;
1aaa0 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
1aab0 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61   pTable;.    pTa
1aac0 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d  ble = pTemp;.  }
1aad0 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  .  pItem->zName 
1aae0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1aaf0 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c  mToken(db, pTabl
1ab00 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61  e);.  pItem->zDa
1ab10 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33  tabase = sqlite3
1ab20 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1ab30 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20  , pDatabase);.  
1ab40 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
1ab50 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56 64  ./*.** Assign Vd
1ab60 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78 20 6e  beCursor index n
1ab70 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20 74 61  umbers to all ta
1ab80 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73  bles in a SrcLis
1ab90 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
1aba0 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
1abb0 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61  rsors(Parse *pPa
1abc0 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  rse, SrcList *pL
1abd0 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
1abe0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1abf0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61  item *pItem;.  a
1ac00 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 70  ssert(pList || p
1ac10 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1ac20 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
1ac30 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
1ac40 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(i=0, pItem=pLi
1ac50 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e  st->a; i<pList->
1ac60 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
1ac70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
1ac80 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30  Item->iCursor>=0
1ac90 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1aca0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  pItem->iCursor =
1acb0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
1acc0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
1acd0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
1ace0 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
1acf0 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
1ad00 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
1ad10 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a  pSelect->pSrc);.
1ad20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ad30 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
1ad40 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c  e an entire SrcL
1ad50 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  ist including al
1ad60 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75  l its substructu
1ad70 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
1ad80 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1ad90 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72  (sqlite3 *db, Sr
1ada0 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
1adb0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1adc0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1add0 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
1ade0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1adf0 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
1ae00 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
1ae10 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
1ae20 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
1ae30 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1ae40 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
1ae50 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1ae60 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ee(db, pItem->zN
1ae70 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
1ae80 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
1ae90 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
1aea0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1aeb0 2c 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29  , pItem->zIndex)
1aec0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  ;.    sqlite3Del
1aed0 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 49 74  eteTable(db, pIt
1aee0 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73  em->pTab);.    s
1aef0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
1af00 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53  te(db, pItem->pS
1af10 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69  elect);.    sqli
1af20 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1af30 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20  , pItem->pOn);. 
1af40 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
1af50 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
1af60 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20  ->pUsing);.  }. 
1af70 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1af80 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  b, pList);.}../*
1af90 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1afa0 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
1afb0 65 20 70 61 72 73 65 72 20 74 6f 20 61 64 64 20  e parser to add 
1afc0 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68  a new term to th
1afd0 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67 72  e.** end of a gr
1afe0 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73  owing FROM claus
1aff0 65 2e 20 20 54 68 65 20 22 70 22 20 70 61 72 61  e.  The "p" para
1b000 6d 65 74 65 72 20 69 73 20 74 68 65 20 70 61 72  meter is the par
1b010 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d  t of.** the FROM
1b020 20 63 6c 61 75 73 65 20 74 68 61 74 20 68 61 73   clause that has
1b030 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f   already been co
1b040 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70 22 20  nstructed.  "p" 
1b050 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68  is NULL.** if th
1b060 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
1b070 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d  term of the FROM
1b080 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62 6c 65   clause.  pTable
1b090 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 0a 2a   and pDatabase.*
1b0a0 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65 20 6f  * are the name o
1b0b0 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  f the table and 
1b0c0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20 69  database named i
1b0d0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1b0e0 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61  e term..** pData
1b0f0 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69 66 20  base is NULL if 
1b100 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1b110 65 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6d  e qualifier is m
1b120 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20  issing - the.** 
1b130 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49 66 20  usual case.  If 
1b140 74 68 65 20 74 65 72 6d 20 68 61 73 20 61 20 61  the term has a a
1b150 6c 69 61 73 2c 20 74 68 65 6e 20 70 41 6c 69 61  lias, then pAlia
1b160 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  s points to the.
1b170 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20  ** alias token. 
1b180 20 49 66 20 74 68 65 20 74 65 72 6d 20 69 73 20   If the term is 
1b190 61 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e  a subquery, then
1b1a0 20 70 53 75 62 71 75 65 72 79 20 69 73 20 74 68   pSubquery is th
1b1b0 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  e.** SELECT stat
1b1c0 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20 73  ement that the s
1b1d0 75 62 71 75 65 72 79 20 65 6e 63 6f 64 65 73 2e  ubquery encodes.
1b1e0 20 20 54 68 65 20 70 54 61 62 6c 65 20 61 6e 64    The pTable and
1b1f0 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 70 61  .** pDatabase pa
1b200 72 61 6d 65 74 65 72 73 20 61 72 65 20 4e 55 4c  rameters are NUL
1b210 4c 20 66 6f 72 20 73 75 62 71 75 65 72 69 65 73  L for subqueries
1b220 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e 64 20 70  .  The pOn and p
1b230 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74  Using.** paramet
1b240 65 72 73 20 61 72 65 20 74 68 65 20 63 6f 6e 74  ers are the cont
1b250 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e  ent of the ON an
1b260 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 2e  d USING clauses.
1b270 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  .**.** Return a 
1b280 6e 65 77 20 53 72 63 4c 69 73 74 20 77 68 69 63  new SrcList whic
1b290 68 20 65 6e 63 6f 64 65 73 20 69 73 20 74 68 65  h encodes is the
1b2a0 20 46 52 4f 4d 20 77 69 74 68 20 74 68 65 20 6e   FROM with the n
1b2b0 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65 64  ew.** term added
1b2c0 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
1b2d0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1b2e0 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61  ndFromTerm(.  Pa
1b2f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1b300 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
1b310 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
1b320 63 4c 69 73 74 20 2a 70 2c 20 20 20 20 20 20 20  cList *p,       
1b330 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66        /* The lef
1b340 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 46 52  t part of the FR
1b350 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64  OM clause alread
1b360 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65  y seen */.  Toke
1b370 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20  n *pTable,      
1b380 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1b390 68 65 20 74 61 62 6c 65 20 74 6f 20 61 64 64 20  he table to add 
1b3a0 74 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  to the FROM clau
1b3b0 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
1b3c0 44 61 74 61 62 61 73 65 2c 20 20 20 20 20 20 20  Database,       
1b3d0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
1b3e0 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
1b3f0 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54  ng pTable */.  T
1b400 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20  oken *pAlias,   
1b410 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
1b420 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
1b430 20 74 68 65 20 41 53 20 73 75 62 65 78 70 72 65   the AS subexpre
1b440 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ssion */.  Selec
1b450 74 20 2a 70 53 75 62 71 75 65 72 79 2c 20 20 20  t *pSubquery,   
1b460 20 20 20 2f 2a 20 41 20 73 75 62 71 75 65 72 79     /* A subquery
1b470 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f   used in place o
1b480 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a  f a table name *
1b490 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20  /.  Expr *pOn,  
1b4a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b4b0 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20  he ON clause of 
1b4c0 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69  a join */.  IdLi
1b4d0 73 74 20 2a 70 55 73 69 6e 67 20 20 20 20 20 20  st *pUsing      
1b4e0 20 20 20 20 2f 2a 20 54 68 65 20 55 53 49 4e 47      /* The USING
1b4f0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69   clause of a joi
1b500 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  n */.){.  struct
1b510 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1b520 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  Item;.  sqlite3 
1b530 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1b540 3b 0a 20 20 69 66 28 20 21 70 20 26 26 20 28 70  ;.  if( !p && (p
1b550 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b  On || pUsing) ){
1b560 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1b570 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
1b580 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69 73 20 72  JOIN clause is r
1b590 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 25  equired before %
1b5a0 73 22 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e 20  s", .      (pOn 
1b5b0 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22  ? "ON" : "USING"
1b5c0 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 67 6f 74  ).    );.    got
1b5d0 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72  o append_from_er
1b5e0 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73  ror;.  }.  p = s
1b5f0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1b600 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61 62 6c  end(db, p, pTabl
1b610 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20  e, pDatabase);. 
1b620 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56   if( p==0 || NEV
1b630 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30 29 20 29  ER(p->nSrc==0) )
1b640 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e  {.    goto appen
1b650 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20  d_from_error;.  
1b660 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e  }.  pItem = &p->
1b670 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
1b680 61 73 73 65 72 74 28 20 70 41 6c 69 61 73 21 3d  assert( pAlias!=
1b690 30 20 29 3b 0a 20 20 69 66 28 20 70 41 6c 69 61  0 );.  if( pAlia
1b6a0 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65  s->n ){.    pIte
1b6b0 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
1b6c0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1b6d0 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20  (db, pAlias);.  
1b6e0 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  }.  pItem->pSele
1b6f0 63 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a  ct = pSubquery;.
1b700 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70    pItem->pOn = p
1b710 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73  On;.  pItem->pUs
1b720 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20  ing = pUsing;.  
1b730 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65  return p;.. appe
1b740 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20  nd_from_error:. 
1b750 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b   assert( p==0 );
1b760 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
1b770 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20  lete(db, pOn);. 
1b780 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1b790 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67 29  lete(db, pUsing)
1b7a0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1b7b0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
1b7c0 71 75 65 72 79 29 3b 0a 20 20 72 65 74 75 72 6e  query);.  return
1b7d0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   0;.}../*.** Add
1b7e0 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 6f   an INDEXED BY o
1b7f0 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c  r NOT INDEXED cl
1b800 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73 74  ause to the most
1b810 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
1b820 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  .** element of t
1b830 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 70  he source-list p
1b840 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
1b850 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
1b860 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
1b870 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 50 61  ListIndexedBy(Pa
1b880 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
1b890 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a  List *p, Token *
1b8a0 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20 61  pIndexedBy){.  a
1b8b0 73 73 65 72 74 28 20 70 49 6e 64 65 78 65 64 42  ssert( pIndexedB
1b8c0 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 20  y!=0 );.  if( p 
1b8d0 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e 53 72  && ALWAYS(p->nSr
1b8e0 63 3e 30 29 20 29 7b 0a 20 20 20 20 73 74 72 75  c>0) ){.    stru
1b8f0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1b900 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70  *pItem = &p->a[p
1b910 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61  ->nSrc-1];.    a
1b920 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 6e 6f  ssert( pItem->no
1b930 74 49 6e 64 65 78 65 64 3d 3d 30 20 26 26 20 70  tIndexed==0 && p
1b940 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 3d 3d 30 20  Item->zIndex==0 
1b950 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  );.    if( pInde
1b960 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21  xedBy->n==1 && !
1b970 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b  pIndexedBy->z ){
1b980 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54  .      /* A "NOT
1b990 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65   INDEXED" clause
1b9a0 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53   was supplied. S
1b9b0 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20  ee parse.y .    
1b9c0 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22    ** construct "
1b9d0 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72  indexed_opt" for
1b9e0 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20   details. */.   
1b9f0 20 20 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64     pItem->notInd
1ba00 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65  exed = 1;.    }e
1ba10 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65 6d  lse{.      pItem
1ba20 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69 74  ->zIndex = sqlit
1ba30 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1ba40 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64  pParse->db, pInd
1ba50 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20  exedBy);.    }. 
1ba60 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e   }.}../*.** When
1ba70 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61 20 46   building up a F
1ba80 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68  ROM clause in th
1ba90 65 20 70 61 72 73 65 72 2c 20 74 68 65 20 6a 6f  e parser, the jo
1baa0 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69  in operator.** i
1bab0 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74 74 61  s initially atta
1bac0 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74  ched to the left
1bad0 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74 20 74   operand.  But t
1bae0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
1baf0 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74 68 65  r.** expects the
1bb00 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 74   join operator t
1bb10 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69 67 68  o be on the righ
1bb20 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  t operand.  This
1bb30 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66   routine.** Shif
1bb40 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72  ts all join oper
1bb50 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74 20  ators from left 
1bb60 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61 6e 20  to right for an 
1bb70 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63  entire FROM.** c
1bb80 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  lause..**.** Exa
1bb90 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20 74 68  mple: Suppose th
1bba0 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74  e join is like t
1bbb0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
1bbc0 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c 20 63       A natural c
1bbd0 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a  ross join B.**.*
1bbe0 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 69  * The operator i
1bbf0 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f 73 73  s "natural cross
1bc00 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41 20 61   join".  The A a
1bc10 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20 61 72  nd B operands ar
1bc20 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70  e stored.** in p
1bc30 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b  ->a[0] and p->a[
1bc40 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  1], respectively
1bc50 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
1bc60 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73 20 74  itially stores t
1bc70 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77  he.** operator w
1bc80 69 74 68 20 41 2e 20 20 54 68 69 73 20 72 6f 75  ith A.  This rou
1bc90 74 69 6e 65 20 73 68 69 66 74 73 20 74 68 61 74  tine shifts that
1bca0 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72 20 74   operator over t
1bcb0 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  o B..*/.void sql
1bcc0 69 74 65 33 53 72 63 4c 69 73 74 53 68 69 66 74  ite3SrcListShift
1bcd0 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69 73 74  JoinType(SrcList
1bce0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
1bcf0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1bd00 61 73 73 65 72 74 28 20 70 2d 3e 61 20 7c 7c 20  assert( p->a || 
1bd10 70 2d 3e 6e 53 72 63 3d 3d 30 20 29 3b 0a 20 20  p->nSrc==0 );.  
1bd20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d    for(i=p->nSrc-
1bd30 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
1bd40 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e      p->a[i].join
1bd50 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d  type = p->a[i-1]
1bd60 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  .jointype;.    }
1bd70 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 6a 6f 69  .    p->a[0].joi
1bd80 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  ntype = 0;.  }.}
1bd90 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
1bda0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
1bdb0 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
1bdc0 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
1bdd0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74  e *pParse, int t
1bde0 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ype){.  sqlite3 
1bdf0 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
1be00 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65    int i;..  asse
1be10 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
1be20 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
1be30 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  db;.  assert( db
1be40 21 3d 30 20 29 3b 0a 2f 2a 20 20 69 66 28 20 64  !=0 );./*  if( d
1be50 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
1be60 20 29 20 72 65 74 75 72 6e 3b 20 2a 2f 0a 20 20   ) return; */.  
1be70 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1be80 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1be90 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
1bea0 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20   "BEGIN", 0, 0) 
1beb0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
1bec0 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
1bed0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1bee0 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75  .  if( !v ) retu
1bef0 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d  rn;.  if( type!=
1bf00 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20  TK_DEFERRED ){. 
1bf10 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
1bf20 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
1bf30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bf40 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73  dOp2(v, OP_Trans
1bf50 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65  action, i, (type
1bf60 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b  ==TK_EXCLUSIVE)+
1bf70 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1bf80 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
1bf90 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
1bfa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1bfb0 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  Op2(v, OP_AutoCo
1bfc0 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  mmit, 0, 0);.}..
1bfd0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74  /*.** Commit a t
1bfe0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
1bff0 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74  id sqlite3Commit
1c000 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
1c010 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
1c020 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74  be *v;..  assert
1c030 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20  ( pParse!=0 );. 
1c040 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1c050 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  >db!=0 );.  if( 
1c060 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1c070 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1c080 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f  TRANSACTION, "CO
1c090 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 7b 0a  MMIT", 0, 0) ){.
1c0a0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1c0b0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
1c0c0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
1c0d0 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
1c0e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1c0f0 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c  , OP_AutoCommit,
1c100 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   1, 0);.  }.}../
1c110 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20  *.** Rollback a 
1c120 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
1c130 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  oid sqlite3Rollb
1c140 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ackTransaction(P
1c150 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
1c160 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73   Vdbe *v;..  ass
1c170 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29  ert( pParse!=0 )
1c180 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
1c190 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69  se->db!=0 );.  i
1c1a0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1c1b0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1c1c0 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
1c1d0 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30  "ROLLBACK", 0, 0
1c1e0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
1c1f0 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74  .  }.  v = sqlit
1c200 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1c210 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
1c220 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c230 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  Op2(v, OP_AutoCo
1c240 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d  mmit, 1, 1);.  }
1c250 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1c260 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1c270 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
1c280 77 68 65 6e 20 69 74 20 70 61 72 73 65 73 20 61  when it parses a
1c290 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65 61   command to crea
1c2a0 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20 6f  te,.** release o
1c2b0 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53 51  r rollback an SQ
1c2c0 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f  L savepoint. .*/
1c2d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 61 76  .void sqlite3Sav
1c2e0 65 70 6f 69 6e 74 28 50 61 72 73 65 20 2a 70 50  epoint(Parse *pP
1c2f0 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f  arse, int op, To
1c300 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63  ken *pName){.  c
1c310 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c  har *zName = sql
1c320 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1c330 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e  n(pParse->db, pN
1c340 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
1c350 65 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  e ){.    Vdbe *v
1c360 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1c370 65 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64  e(pParse);.#ifnd
1c380 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1c390 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
1c3a0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
1c3b0 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d 20  ar * const az[] 
1c3c0 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20 22 52 45  = { "BEGIN", "RE
1c3d0 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43  LEASE", "ROLLBAC
1c3e0 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74  K" };.    assert
1c3f0 28 20 21 53 41 56 45 50 4f 49 4e 54 5f 42 45 47  ( !SAVEPOINT_BEG
1c400 49 4e 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f  IN && SAVEPOINT_
1c410 52 45 4c 45 41 53 45 3d 3d 31 20 26 26 20 53 41  RELEASE==1 && SA
1c420 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1c430 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ==2 );.#endif.  
1c440 20 20 69 66 28 20 21 76 20 7c 7c 20 73 71 6c 69    if( !v || sqli
1c450 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1c460 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 41 56 45  rse, SQLITE_SAVE
1c470 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a  POINT, az[op], z
1c480 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  Name, 0) ){.    
1c490 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1c4a0 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d  pParse->db, zNam
1c4b0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
1c4c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1c4d0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1c4e0 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f   OP_Savepoint, o
1c4f0 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20  p, 0, 0, zName, 
1c500 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
1c510 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
1c520 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74  ure the TEMP dat
1c530 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e  abase is open an
1c540 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  d available for 
1c550 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  use.  Return.** 
1c560 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
1c570 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79  rors.  Leave any
1c580 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
1c590 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
1c5a0 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
1c5b0 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
1c5c0 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70  atabase(Parse *p
1c5d0 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
1c5e0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1c5f0 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44  db;.  if( db->aD
1c600 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21  b[1].pBt==0 && !
1c610 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
1c620 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
1c630 20 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20     Btree *pBt;. 
1c640 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1c650 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20 20 20  int flags = .   
1c660 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1c670 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20  EN_READWRITE |. 
1c680 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1c690 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
1c6a0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1c6b0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a  PEN_EXCLUSIVE |.
1c6c0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1c6d0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
1c6e0 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  OSE |.          
1c6f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1c700 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  _DB;..    rc = s
1c710 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
1c720 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c  db->pVfs, 0, db,
1c730 20 26 70 42 74 2c 20 30 2c 20 66 6c 61 67 73 29   &pBt, 0, flags)
1c740 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1c750 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c760 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1c770 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
1c780 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
1c790 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a  rary database ".
1c7a0 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f          "file fo
1c7b0 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72  r storing tempor
1c7c0 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20  ary tables");.  
1c7d0 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
1c7e0 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
1c7f0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  n 1;.    }.    d
1c800 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20 3d 20  b->aDb[1].pBt = 
1c810 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
1c820 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
1c830 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 53  ema );.    if( S
1c840 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c  QLITE_NOMEM==sql
1c850 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
1c860 53 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65  Size(pBt, db->ne
1c870 78 74 50 61 67 65 73 69 7a 65 2c 20 2d 31 2c 20  xtPagesize, -1, 
1c880 30 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  0) ){.      db->
1c890 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
1c8a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
1c8b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1c8c0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1c8d0 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
1c8e0 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65  ode that will ve
1c8f0 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1c900 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74  cookie and start
1c910 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73  .** a read-trans
1c920 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e  action for all n
1c930 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  amed database fi
1c940 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  les..**.** It is
1c950 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
1c960 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  all schema cooki
1c970 65 73 20 62 65 20 76 65 72 69 66 69 65 64 20 61  es be verified a
1c980 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74  nd all.** read t
1c990 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73  ransactions be s
1c9a0 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e  tarted before an
1c9b0 79 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70  ything else happ
1c9c0 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44  ens in.** the VD
1c9d0 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74  BE program.  But
1c9e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
1c9f0 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  n be called afte
1ca00 72 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20  r much other.** 
1ca10 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67 65  code has been ge
1ca20 6e 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72  nerated.  So her
1ca30 65 20 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a  e is what we do:
1ca40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
1ca50 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
1ca60 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65  ne is called, we
1ca70 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f   code an OP_Goto
1ca80 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75   that.** will ju
1ca90 6d 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69  mp to a subrouti
1caa0 6e 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ne at the end of
1cab0 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54   the program.  T
1cac0 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64  hen we.** record
1cad0 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20   every database 
1cae0 74 68 61 74 20 6e 65 65 64 73 20 69 74 73 20 73  that needs its s
1caf0 63 68 65 6d 61 20 76 65 72 69 66 69 65 64 20 69  chema verified i
1cb00 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d  n the.** pParse-
1cb10 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c  >cookieMask fiel
1cb20 64 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72  d.  Later, after
1cb30 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20   all other code 
1cb40 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65  has been.** gene
1cb50 72 61 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f  rated, the subro
1cb60 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20  utine that does 
1cb70 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  the cookie verif
1cb80 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  ications and.** 
1cb90 73 74 61 72 74 73 20 74 68 65 20 74 72 61 6e 73  starts the trans
1cba0 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20  actions will be 
1cbb0 63 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50  coded and the OP
1cbc0 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a  _Goto P2 value.*
1cbd0 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  * will be made t
1cbe0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20  o point to that 
1cbf0 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  subroutine.  The
1cc00 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74   generation of t
1cc10 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72  he.** cookie ver
1cc20 69 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75  ification subrou
1cc30 74 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e  tine code happen
1cc40 73 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69  s in sqlite3Fini
1cc50 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a  shCoding()..**.*
1cc60 2a 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20  * If iDb<0 then 
1cc70 63 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f  code the OP_Goto
1cc80 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65   only - don't se
1cc90 74 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79  t flag to verify
1cca0 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f   the.** schema o
1ccb0 6e 20 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e  n any databases.
1ccc0 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
1ccd0 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74  ed to position t
1cce0 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61  he OP_Goto.** ea
1ccf0 72 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c  rly in the code,
1cd00 20 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20   before we know 
1cd10 69 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  if any database 
1cd20 74 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75  tables will be u
1cd30 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
1cd40 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
1cd50 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
1cd60 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
1cd70 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
1cd80 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
1cd90 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
1cda0 0a 0a 20 20 69 66 28 20 70 54 6f 70 6c 65 76 65  ..  if( pTopleve
1cdb0 6c 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30  l->cookieGoto==0
1cdc0 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
1cdd0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1cde0 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20  (pToplevel);.   
1cdf0 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
1ce00 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c  rn;  /* This onl
1ce10 79 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65  y happens if the
1ce20 72 65 20 77 61 73 20 61 20 70 72 69 6f 72 20 65  re was a prior e
1ce30 72 72 6f 72 20 2a 2f 0a 20 20 20 20 70 54 6f 70  rror */.    pTop
1ce40 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 47 6f 74  level->cookieGot
1ce50 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  o = sqlite3VdbeA
1ce60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1ce70 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a 20  , 0, 0)+1;.  }. 
1ce80 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20   if( iDb>=0 ){. 
1ce90 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
1cea0 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 64 62 3b 0a   pToplevel->db;.
1ceb0 20 20 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b      yDbMask mask
1cec0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ;..    assert( i
1ced0 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
1cee0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
1cef0 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c  b[iDb].pBt!=0 ||
1cf00 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61   iDb==1 );.    a
1cf10 73 73 65 72 74 28 20 69 44 62 3c 53 51 4c 49 54  ssert( iDb<SQLIT
1cf20 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2b 32  E_MAX_ATTACHED+2
1cf30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1cf40 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
1cf50 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
1cf60 30 29 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20 3d  0) );.    mask =
1cf70 20 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69   ((yDbMask)1)<<i
1cf80 44 62 3b 0a 20 20 20 20 69 66 28 20 28 70 54 6f  Db;.    if( (pTo
1cf90 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61  plevel->cookieMa
1cfa0 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b  sk & mask)==0 ){
1cfb0 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c  .      pToplevel
1cfc0 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20  ->cookieMask |= 
1cfd0 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70  mask;.      pTop
1cfe0 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 56 61 6c  level->cookieVal
1cff0 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44  ue[iDb] = db->aD
1d000 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
1d010 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20  schema_cookie;. 
1d020 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
1d030 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
1d040 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1d050 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
1d060 73 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20  se(pToplevel);. 
1d070 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1d080 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67  .}../*.** If arg
1d090 75 6d 65 6e 74 20 7a 44 62 20 69 73 20 4e 55 4c  ument zDb is NUL
1d0a0 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20 73 71 6c  L, then call sql
1d0b0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
1d0c0 68 65 6d 61 28 29 20 66 6f 72 20 65 61 63 68 20  hema() for each 
1d0d0 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74  .** attached dat
1d0e0 61 62 61 73 65 2e 20 4f 74 68 65 72 77 69 73 65  abase. Otherwise
1d0f0 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72 20  , invoke it for 
1d100 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1d110 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ed zDb only..*/.
1d120 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
1d130 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d  VerifyNamedSchem
1d140 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  a(Parse *pParse,
1d150 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1d160 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1d170 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1d180 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1d190 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
1d1a0 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20  +){.    Db *pDb 
1d1b0 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
1d1c0 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20     if( pDb->pBt 
1d1d0 26 26 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d 73  && (!zDb || 0==s
1d1e0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
1d1f0 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 29 20  b, pDb->zName)) 
1d200 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1d210 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
1d220 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20  (pParse, i);.   
1d230 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1d240 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
1d250 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65 73  de that prepares
1d260 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70   for doing an op
1d270 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  eration that.** 
1d280 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65  might change the
1d290 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
1d2a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74   This routine st
1d2b0 61 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73  arts a new trans
1d2c0 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65  action if we are
1d2d0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74   not already wit
1d2e0 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63  hin.** a transac
1d2f0 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65  tion.  If we are
1d300 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20   already within 
1d310 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  a transaction, t
1d320 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  hen a checkpoint
1d330 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74 68  .** is set if th
1d340 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70  e setStatement p
1d350 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65  arameter is true
1d360 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20  .  A checkpoint 
1d370 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74  should.** be set
1d380 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20   for operations 
1d390 74 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20  that might fail 
1d3a0 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72  (due to a constr
1d3b0 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a  aint) part of.**
1d3c0 20 74 68 65 20 77 61 79 20 74 68 72 6f 75 67 68   the way through
1d3d0 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20   and which will 
1d3e0 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d  need to undo som
1d3f0 65 20 77 72 69 74 65 73 20 77 69 74 68 6f 75 74  e writes without
1d400 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f   having to.** ro
1d410 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65  llback the whole
1d420 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46   transaction.  F
1d430 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68  or operations wh
1d440 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  ere all constrai
1d450 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68  nts.** can be ch
1d460 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79  ecked before any
1d470 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
1d480 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
1d490 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a  e, it is never.*
1d4a0 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75  * necessary to u
1d4b0 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20  ndo a write and 
1d4c0 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73  the checkpoint s
1d4d0 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74  hould not be set
1d4e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1d4f0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
1d500 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
1d510 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65  se, int setState
1d520 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a  ment, int iDb){.
1d530 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
1d540 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
1d550 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
1d560 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65  );.  sqlite3Code
1d570 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
1d580 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f  rse, iDb);.  pTo
1d590 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73  plevel->writeMas
1d5a0 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73 6b 29 31  k |= ((yDbMask)1
1d5b0 29 3c 3c 69 44 62 3b 0a 20 20 70 54 6f 70 6c 65  )<<iDb;.  pTople
1d5c0 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74  vel->isMultiWrit
1d5d0 65 20 7c 3d 20 73 65 74 53 74 61 74 65 6d 65 6e  e |= setStatemen
1d5e0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69  t;.}../*.** Indi
1d5f0 63 61 74 65 20 74 68 61 74 20 74 68 65 20 73 74  cate that the st
1d600 61 74 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c  atement currentl
1d610 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
1d620 74 69 6f 6e 20 6d 69 67 68 74 20 77 72 69 74 65  tion might write
1d630 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  .** more than on
1d640 65 20 65 6e 74 72 79 20 28 65 78 61 6d 70 6c 65  e entry (example
1d650 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72  : deleting one r
1d660 6f 77 20 74 68 65 6e 20 69 6e 73 65 72 74 69 6e  ow then insertin
1d670 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e  g another,.** in
1d680 73 65 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65  serting multiple
1d690 20 72 6f 77 73 20 69 6e 20 61 20 74 61 62 6c 65   rows in a table
1d6a0 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 61  , or inserting a
1d6b0 20 72 6f 77 20 61 6e 64 20 69 6e 64 65 78 20 65   row and index e
1d6c0 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61  ntries.).** If a
1d6d0 6e 20 61 62 6f 72 74 20 6f 63 63 75 72 73 20 61  n abort occurs a
1d6e0 66 74 65 72 20 73 6f 6d 65 20 6f 66 20 74 68 65  fter some of the
1d6f0 73 65 20 77 72 69 74 65 73 20 68 61 76 65 20 63  se writes have c
1d700 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e 20 69  ompleted, then i
1d710 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63  t will.** be nec
1d720 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 74  essary to undo t
1d730 68 65 20 63 6f 6d 70 6c 65 74 65 64 20 77 72 69  he completed wri
1d740 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tes..*/.void sql
1d750 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28 50  ite3MultiWrite(P
1d760 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
1d770 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
1d780 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
1d790 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
1d7a0 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69  ;.  pToplevel->i
1d7b0 73 4d 75 6c 74 69 57 72 69 74 65 20 3d 20 31 3b  sMultiWrite = 1;
1d7c0 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63  .}../* .** The c
1d7d0 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63 61  ode generator ca
1d7e0 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
1d7f0 20 69 66 20 69 73 20 64 69 73 63 6f 76 65 72 73   if is discovers
1d800 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 70   that it is.** p
1d810 6f 73 73 69 62 6c 65 20 74 6f 20 61 62 6f 72 74  ossible to abort
1d820 20 61 20 73 74 61 74 65 6d 65 6e 74 20 70 72 69   a statement pri
1d830 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  or to completion
1d840 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a  .  In order to .
1d850 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20  ** perform this 
1d860 61 62 6f 72 74 20 77 69 74 68 6f 75 74 20 63 6f  abort without co
1d870 72 72 75 70 74 69 6e 67 20 74 68 65 20 64 61 74  rrupting the dat
1d880 61 62 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74  abase, we need t
1d890 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74  o make.** sure t
1d8a0 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hat the statemen
1d8b0 74 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62  t is protected b
1d8c0 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  y a statement tr
1d8d0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1d8e0 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65   Technically, we
1d8f0 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 65   only need to se
1d900 74 20 74 68 65 20 6d 61 79 41 62 6f 72 74 20 66  t the mayAbort f
1d910 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a 20 69 73  lag if the.** is
1d920 4d 75 6c 74 69 57 72 69 74 65 20 66 6c 61 67 20  MultiWrite flag 
1d930 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73  was previously s
1d940 65 74 2e 20 20 54 68 65 72 65 20 69 73 20 61 20  et.  There is a 
1d950 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a  time dependency.
1d960 2a 2a 20 73 75 63 68 20 74 68 61 74 20 74 68 65  ** such that the
1d970 20 61 62 6f 72 74 20 6d 75 73 74 20 6f 63 63 75   abort must occu
1d980 72 20 61 66 74 65 72 20 74 68 65 20 6d 75 6c 74  r after the mult
1d990 69 77 72 69 74 65 2e 20 20 54 68 69 73 20 6d 61  iwrite.  This ma
1d9a0 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74  kes.** some stat
1d9b0 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67  ements involving
1d9c0 20 74 68 65 20 52 45 50 4c 41 43 45 20 63 6f 6e   the REPLACE con
1d9d0 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
1d9e0 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f   algorithm.** go
1d9f0 20 61 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72   a little faster
1da00 2e 20 20 42 75 74 20 74 61 6b 69 6e 67 20 61 64  .  But taking ad
1da10 76 61 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20  vantage of this 
1da20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a  time dependency.
1da30 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65  ** makes it more
1da40 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 70 72   difficult to pr
1da50 6f 76 65 20 74 68 61 74 20 74 68 65 20 63 6f 64  ove that the cod
1da60 65 20 69 73 20 63 6f 72 72 65 63 74 20 28 69 6e  e is correct (in
1da70 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 2c   .** particular,
1da80 20 69 74 20 70 72 65 76 65 6e 74 73 20 75 73 20   it prevents us 
1da90 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e 20  from writing an 
1daa0 65 66 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70  effective.** imp
1dab0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73  lementation of s
1dac0 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
1dad0 62 6f 72 74 28 29 29 20 61 6e 64 20 73 6f 20 77  bort()) and so w
1dae0 65 20 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a  e have chosen.**
1daf0 20 74 6f 20 74 61 6b 65 20 74 68 65 20 73 61 66   to take the saf
1db00 65 20 72 6f 75 74 65 20 61 6e 64 20 73 6b 69 70  e route and skip
1db10 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
1db20 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
1db30 65 33 4d 61 79 41 62 6f 72 74 28 50 61 72 73 65  e3MayAbort(Parse
1db40 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72   *pParse){.  Par
1db50 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
1db60 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
1db70 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
1db80 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62  pToplevel->mayAb
1db90 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ort = 1;.}../*.*
1dba0 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c  * Code an OP_Hal
1dbb0 74 20 74 68 61 74 20 63 61 75 73 65 73 20 74 68  t that causes th
1dbc0 65 20 76 64 62 65 20 74 6f 20 72 65 74 75 72 6e  e vdbe to return
1dbd0 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   an SQLITE_CONST
1dbe0 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20  RAINT.** error. 
1dbf0 54 68 65 20 6f 6e 45 72 72 6f 72 20 70 61 72 61  The onError para
1dc00 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73  meter determines
1dc10 20 77 68 69 63 68 20 28 69 66 20 61 6e 79 29 20   which (if any) 
1dc20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
1dc30 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72 65  .** and/or curre
1dc40 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
1dc50 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
1dc60 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61  /.void sqlite3Ha
1dc70 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 72  ltConstraint(Par
1dc80 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1dc90 6f 6e 45 72 72 6f 72 2c 20 63 68 61 72 20 2a 70  onError, char *p
1dca0 34 2c 20 69 6e 74 20 70 34 74 79 70 65 29 7b 0a  4, int p4type){.
1dcb0 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
1dcc0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1dcd0 65 29 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f  e);.  if( onErro
1dce0 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  r==OE_Abort ){. 
1dcf0 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
1dd00 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  rt(pParse);.  }.
1dd10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1dd20 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20  Op4(v, OP_Halt, 
1dd30 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
1dd40 54 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70  T, onError, 0, p
1dd50 34 2c 20 70 34 74 79 70 65 29 3b 0a 7d 0a 0a 2f  4, p4type);.}../
1dd60 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
1dd70 65 20 69 66 20 70 49 6e 64 65 78 20 75 73 65 73  e if pIndex uses
1dd80 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
1dd90 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20  equence pColl.  
1dda0 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
1ddb0 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61  f it does and fa
1ddc0 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e  lse if it does n
1ddd0 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ot..*/.#ifndef S
1dde0 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
1ddf0 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  EX.static int co
1de00 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e  llationMatch(con
1de10 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20  st char *zColl, 
1de20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a  Index *pIndex){.
1de30 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
1de40 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20  t( zColl!=0 );. 
1de50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64   for(i=0; i<pInd
1de60 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ex->nColumn; i++
1de70 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
1de80 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61  r *z = pIndex->a
1de90 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61 73  zColl[i];.    as
1dea0 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20  sert( z!=0 );.  
1deb0 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
1dec0 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c  StrICmp(z, zColl
1ded0 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1dee0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
1def0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
1df00 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d  dif../*.** Recom
1df10 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
1df20 20 6f 66 20 70 54 61 62 20 74 68 61 74 20 75 73   of pTab that us
1df30 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  e the collating 
1df40 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a  sequence pColl..
1df50 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74  ** If pColl==0 t
1df60 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c  hen recompute al
1df70 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
1df80 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  b..*/.#ifndef SQ
1df90 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
1dfa0 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  X.static void re
1dfb0 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73 65  indexTable(Parse
1dfc0 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
1dfd0 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73  *pTab, char cons
1dfe0 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64  t *zColl){.  Ind
1dff0 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
1e000 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
1e010 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
1e020 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20  with pTab */..  
1e030 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d  for(pIndex=pTab-
1e040 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
1e050 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e   pIndex=pIndex->
1e060 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1e070 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c  zColl==0 || coll
1e080 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c  ationMatch(zColl
1e090 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  , pIndex) ){.   
1e0a0 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
1e0b0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
1e0c0 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
1e0d0 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
1e0e0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
1e0f0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
1e100 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
1e110 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66        sqlite3Ref
1e120 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
1e130 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
1e140 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
1e150 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
1e160 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
1e170 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61   all tables in a
1e180 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65  ll databases whe
1e190 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65  re the.** indice
1e1a0 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  s use the collat
1e1b0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
1e1c0 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ll.  If pColl==0
1e1d0 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a   then recompute.
1e1e0 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65  ** all indices e
1e1f0 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69  verywhere..*/.#i
1e200 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e210 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
1e220 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74   void reindexDat
1e230 61 62 61 73 65 73 28 50 61 72 73 65 20 2a 70 50  abases(Parse *pP
1e240 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74  arse, char const
1e250 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a   *zColl){.  Db *
1e260 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
1e270 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
1e280 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  gle database */.
1e290 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
1e2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e2b0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
1e2c0 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
1e2d0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1e2e0 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54  arse->db;   /* T
1e2f0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1e300 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68  ection */.  Hash
1e310 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20  Elem *k;        
1e320 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1e330 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
1e340 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54  es in pDb */.  T
1e350 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
1e360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
1e370 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
1e380 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65  abase */..  asse
1e390 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
1e3a0 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28  HoldsAllMutexes(
1e3b0 64 62 29 20 29 3b 20 20 2f 2a 20 4e 65 65 64 65  db) );  /* Neede
1e3c0 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63  d for schema acc
1e3d0 65 73 73 20 2a 2f 0a 20 20 66 6f 72 28 69 44 62  ess */.  for(iDb
1e3e0 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b  =0, pDb=db->aDb;
1e3f0 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44   iDb<db->nDb; iD
1e400 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20  b++, pDb++){.   
1e410 20 61 73 73 65 72 74 28 20 70 44 62 21 3d 30 20   assert( pDb!=0 
1e420 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c  );.    for(k=sql
1e430 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44  iteHashFirst(&pD
1e440 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b->pSchema->tblH
1e450 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69  ash);  k; k=sqli
1e460 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a  teHashNext(k)){.
1e470 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61        pTab = (Ta
1e480 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ble*)sqliteHashD
1e490 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65  ata(k);.      re
1e4a0 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73  indexTable(pPars
1e4b0 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b  e, pTab, zColl);
1e4c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
1e4d0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
1e4e0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
1e4f0 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64   REINDEX command
1e500 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52  ..**.**        R
1e510 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20  EINDEX          
1e520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e530 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20    -- 1.**       
1e540 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61   REINDEX  <colla
1e550 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20  tion>           
1e560 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20      -- 2.**     
1e570 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61     REINDEX  ?<da
1e580 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e  tabase>.?<tablen
1e590 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20  ame>  -- 3.**   
1e5a0 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c       REINDEX  ?<
1e5b0 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65  database>.?<inde
1e5c0 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a  xname>  -- 4.**.
1e5d0 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73  ** Form 1 causes
1e5e0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20   all indices in 
1e5f0 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
1e600 61 62 61 73 65 73 20 74 6f 20 62 65 20 72 65 62  abases to be reb
1e610 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20  uilt..** Form 2 
1e620 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64  rebuilds all ind
1e630 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61  ices in all data
1e640 62 61 73 65 73 20 74 68 61 74 20 75 73 65 20 74  bases that use t
1e650 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c  he named.** coll
1e660 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20  ating function. 
1e670 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72   Forms 3 and 4 r
1e680 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64  ebuild the named
1e690 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a   index or all.**
1e6a0 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
1e6b0 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ted with the nam
1e6c0 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66  ed table..*/.#if
1e6d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e6e0 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71  _REINDEX.void sq
1e6f0 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50 61 72  lite3Reindex(Par
1e700 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
1e710 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e  n *pName1, Token
1e720 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c   *pName2){.  Col
1e730 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
1e740 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
1e750 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
1e760 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20  o be reindexed, 
1e770 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61  or NULL */.  cha
1e780 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20  r *z;           
1e790 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1e7a0 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69   of a table or i
1e7b0 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndex */.  const 
1e7c0 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20  char *zDb;      
1e7d0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1e7e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
1e7f0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
1e800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e810 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65  * A table in the
1e820 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49   database */.  I
1e830 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
1e840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
1e850 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
1e860 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20  d with pTab */. 
1e870 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
1e880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e890 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64  The database ind
1e8a0 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  ex number */.  s
1e8b0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1e8c0 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68  rse->db;   /* Th
1e8d0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1e8e0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ction */.  Token
1e8f0 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20   *pObjName;     
1e900 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1e910 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  f the table or i
1e920 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64  ndex to be reind
1e930 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65  exed */..  /* Re
1e940 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
1e950 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72  schema. If an er
1e960 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76  ror occurs, leav
1e970 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
1e980 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65  ge.  ** and code
1e990 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
1e9a0 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  eturn NULL. */. 
1e9b0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
1e9c0 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
1e9d0 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
1e9e0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
1e9f0 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b  if( pName1==0 ){
1ea00 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61  .    reindexData
1ea10 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 30 29  bases(pParse, 0)
1ea20 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1ea30 7d 65 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28  }else if( NEVER(
1ea40 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e  pName2==0) || pN
1ea50 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  ame2->z==0 ){.  
1ea60 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20    char *zColl;. 
1ea70 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
1ea80 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c  1->z );.    zCol
1ea90 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
1eaa0 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
1eab0 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  >db, pName1);.  
1eac0 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72    if( !zColl ) r
1ead0 65 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c  eturn;.    pColl
1eae0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
1eaf0 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
1eb00 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20  ), zColl, 0);.  
1eb10 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
1eb20 20 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61       reindexData
1eb30 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43  bases(pParse, zC
1eb40 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oll);.      sqli
1eb50 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
1eb60 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oll);.      retu
1eb70 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  rn;.    }.    sq
1eb80 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1eb90 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44  zColl);.  }.  iD
1eba0 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
1ebb0 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
1ebc0 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
1ebd0 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  pObjName);.  if(
1ebe0 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b   iDb<0 ) return;
1ebf0 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61  .  z = sqlite3Na
1ec00 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
1ec10 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  pObjName);.  if(
1ec20 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
1ec30 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b    zDb = db->aDb[
1ec40 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54  iDb].zName;.  pT
1ec50 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
1ec60 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62  Table(db, z, zDb
1ec70 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b  );.  if( pTab ){
1ec80 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c  .    reindexTabl
1ec90 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
1eca0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  0);.    sqlite3D
1ecb0 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
1ecc0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1ecd0 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
1ece0 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c  FindIndex(db, z,
1ecf0 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   zDb);.  sqlite3
1ed00 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
1ed10 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20   if( pIndex ){. 
1ed20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
1ed30 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
1ed40 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
1ed50 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
1ed60 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
1ed70 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72  ndex, -1);.    r
1ed80 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
1ed90 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1eda0 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  rse, "unable to 
1edb0 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a  identify the obj
1edc0 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65  ect to be reinde
1edd0 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  xed");.}.#endif.
1ede0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1edf0 64 79 6e 61 6d 69 63 6c 79 20 61 6c 6c 6f 63 61  dynamicly alloca
1ee00 74 65 64 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  ted KeyInfo stru
1ee10 63 74 75 72 65 20 74 68 61 74 20 63 61 6e 20 62  cture that can b
1ee20 65 20 75 73 65 64 0a 2a 2a 20 77 69 74 68 20 4f  e used.** with O
1ee30 50 5f 4f 70 65 6e 52 65 61 64 20 6f 72 20 4f 50  P_OpenRead or OP
1ee40 5f 4f 70 65 6e 57 72 69 74 65 20 74 6f 20 61 63  _OpenWrite to ac
1ee50 63 65 73 73 20 64 61 74 61 62 61 73 65 20 69 6e  cess database in
1ee60 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20  dex pIdx..**.** 
1ee70 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  If successful, a
1ee80 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1ee90 6e 65 77 20 73 74 72 75 63 74 75 72 65 20 69 73  new structure is
1eea0 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68   returned. In th
1eeb0 69 73 20 63 61 73 65 0a 2a 2a 20 74 68 65 20 63  is case.** the c
1eec0 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
1eed0 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67  ible for calling
1eee0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1eef0 62 2c 20 29 20 6f 6e 20 74 68 65 20 72 65 74 75  b, ) on the retu
1ef00 72 6e 65 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72  rned .** pointer
1ef10 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
1ef20 63 75 72 73 20 28 6f 75 74 20 6f 66 20 6d 65 6d  curs (out of mem
1ef30 6f 72 79 20 6f 72 20 6d 69 73 73 69 6e 67 20 63  ory or missing c
1ef40 6f 6c 6c 61 74 69 6f 6e 20 0a 2a 2a 20 73 65 71  ollation .** seq
1ef50 75 65 6e 63 65 29 2c 20 4e 55 4c 4c 20 69 73 20  uence), NULL is 
1ef60 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
1ef70 20 73 74 61 74 65 20 6f 66 20 70 50 61 72 73 65   state of pParse
1ef80 20 75 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c   updated to refl
1ef90 65 63 74 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  ect.** the error
1efa0 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71  ..*/.KeyInfo *sq
1efb0 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66  lite3IndexKeyinf
1efc0 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
1efd0 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20   Index *pIdx){. 
1efe0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43   int i;.  int nC
1eff0 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ol = pIdx->nColu
1f000 6d 6e 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73  mn;.  int nBytes
1f010 20 3d 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66   = sizeof(KeyInf
1f020 6f 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69  o) + (nCol-1)*si
1f030 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b  zeof(CollSeq*) +
1f040 20 6e 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33   nCol;.  sqlite3
1f050 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1f060 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  b;.  KeyInfo *pK
1f070 65 79 20 3d 20 28 4b 65 79 49 6e 66 6f 20 2a 29  ey = (KeyInfo *)
1f080 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
1f090 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 73 29 3b  ero(db, nBytes);
1f0a0 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a  ..  if( pKey ){.
1f0b0 20 20 20 20 70 4b 65 79 2d 3e 64 62 20 3d 20 70      pKey->db = p
1f0c0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70  Parse->db;.    p
1f0d0 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  Key->aSortOrder 
1f0e0 3d 20 28 75 38 20 2a 29 26 28 70 4b 65 79 2d 3e  = (u8 *)&(pKey->
1f0f0 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20  aColl[nCol]);.  
1f100 20 20 61 73 73 65 72 74 28 20 26 70 4b 65 79 2d    assert( &pKey-
1f110 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c  >aSortOrder[nCol
1f120 5d 3d 3d 26 28 28 28 75 38 20 2a 29 70 4b 65 79  ]==&(((u8 *)pKey
1f130 29 5b 6e 42 79 74 65 73 5d 29 20 29 3b 0a 20 20  )[nBytes]) );.  
1f140 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
1f150 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  l; i++){.      c
1f160 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64  har *zColl = pId
1f170 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20  x->azColl[i];.  
1f180 20 20 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c      assert( zCol
1f190 6c 20 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d  l );.      pKey-
1f1a0 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69  >aColl[i] = sqli
1f1b0 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
1f1c0 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b  (pParse, zColl);
1f1d0 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f  .      pKey->aSo
1f1e0 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 64  rtOrder[i] = pId
1f1f0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
1f200 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79  ;.    }.    pKey
1f210 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  ->nField = (u16)
1f220 6e 43 6f 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  nCol;.  }..  if(
1f230 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
1f240 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1f250 65 65 28 64 62 2c 20 70 4b 65 79 29 3b 0a 20 20  ee(db, pKey);.  
1f260 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a    pKey = 0;.  }.
1f270 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d    return pKey;.}
1f280 0a                                               .