/ Hex Artifact Content
Login

Artifact 0132bc6631fa617a1d28ef805921f6dbac18a514:


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 2d 3e  eady(v, pParse->
1970: 6e 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 6e 4d  nVar, pParse->nM
1980: 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  em,.            
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
19a0: 72 73 65 2d 3e 6e 54 61 62 2c 20 70 50 61 72 73  rse->nTab, pPars
19b0: 65 2d 3e 6e 4d 61 78 41 72 67 2c 20 70 50 61 72  e->nMaxArg, pPar
19c0: 73 65 2d 3e 65 78 70 6c 61 69 6e 2c 0a 20 20 20  se->explain,.   
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 73        pParse->is
19f0: 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20 70 50  MultiWrite && pP
1a00: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b  arse->mayAbort);
1a10: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
1a20: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1a30: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61     pParse->colNa
1a40: 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65  mesSet = 0;.  }e
1a50: 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  lse{.    pParse-
1a60: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  >rc = SQLITE_ERR
1a70: 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65  OR;.  }.  pParse
1a80: 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70 50  ->nTab = 0;.  pP
1a90: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a  arse->nMem = 0;.
1aa0: 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d    pParse->nSet =
1ab0: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56   0;.  pParse->nV
1ac0: 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ar = 0;.  pParse
1ad0: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30  ->cookieMask = 0
1ae0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  ;.  pParse->cook
1af0: 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f  ieGoto = 0;.}../
1b00: 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70 61 72  *.** Run the par
1b10: 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ser and code gen
1b20: 65 72 61 74 6f 72 20 72 65 63 75 72 73 69 76 65  erator recursive
1b30: 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ly in order to g
1b40: 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20  enerate.** code 
1b50: 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74 61 74  for the SQL stat
1b60: 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f  ement given onto
1b70: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1b80: 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a  pParse context.*
1b90: 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  * currently unde
1ba0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
1bb0: 20 57 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   When the parser
1bc0: 20 69 73 20 72 75 6e 20 72 65 63 75 72 73 69 76   is run recursiv
1bd0: 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c  ely.** this way,
1be0: 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61   the final OP_Ha
1bf0: 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65 6e 64  lt is not append
1c00: 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69 6e 69  ed and other ini
1c10: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61  tialization.** a
1c20: 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  nd finalization 
1c30: 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74 74 65  steps are omitte
1c40: 64 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20  d because those 
1c50: 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62 79 20  are handling by 
1c60: 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74  the.** outermost
1c70: 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e   parser..**.** N
1c80: 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  ot everything is
1c90: 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68 69 73   nestable.  This
1ca0: 20 66 61 63 69 6c 69 74 79 20 69 73 20 64 65 73   facility is des
1cb0: 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69 74 0a  igned to permit.
1cc0: 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  ** INSERT, UPDAT
1cd0: 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 6f 70  E, and DELETE op
1ce0: 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e 73 74  erations against
1cf0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20   SQLITE_MASTER. 
1d00: 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69 66 20   Use.** care if 
1d10: 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20 74 72  you decide to tr
1d20: 79 20 74 6f 20 75 73 65 20 74 68 69 73 20 72 6f  y to use this ro
1d30: 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f  utine for some o
1d40: 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a  ther purposes..*
1d50: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4e 65  /.void sqlite3Ne
1d60: 73 74 65 64 50 61 72 73 65 28 50 61 72 73 65 20  stedParse(Parse 
1d70: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
1d80: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
1d90: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
1da0: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
1db0: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
1dc0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
1dd0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1de0: 0a 23 20 64 65 66 69 6e 65 20 53 41 56 45 5f 53  .# define SAVE_S
1df0: 5a 20 20 28 73 69 7a 65 6f 66 28 50 61 72 73 65  Z  (sizeof(Parse
1e00: 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 50 61 72  ) - offsetof(Par
1e10: 73 65 2c 6e 56 61 72 29 29 0a 20 20 63 68 61 72  se,nVar)).  char
1e20: 20 73 61 76 65 42 75 66 5b 53 41 56 45 5f 53 5a   saveBuf[SAVE_SZ
1e30: 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  ];..  if( pParse
1e40: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
1e50: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1e60: 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20  e->nested<10 ); 
1e70: 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75   /* Nesting shou
1e80: 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69  ld only be of li
1e90: 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20  mited depth */. 
1ea0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
1eb0: 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d  ormat);.  zSql =
1ec0: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
1ed0: 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  (db, zFormat, ap
1ee0: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
1ef0: 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
1f00: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20  {.    return;   
1f10: 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74  /* A malloc must
1f20: 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
1f30: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65    }.  pParse->ne
1f40: 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79  sted++;.  memcpy
1f50: 28 73 61 76 65 42 75 66 2c 20 26 70 50 61 72 73  (saveBuf, &pPars
1f60: 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f 53 5a  e->nVar, SAVE_SZ
1f70: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61  );.  memset(&pPa
1f80: 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20 53 41  rse->nVar, 0, SA
1f90: 56 45 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65  VE_SZ);.  sqlite
1fa0: 33 52 75 6e 50 61 72 73 65 72 28 70 50 61 72 73  3RunParser(pPars
1fb0: 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72 4d 73  e, zSql, &zErrMs
1fc0: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
1fd0: 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
1fe0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1ff0: 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d  e(db, zSql);.  m
2000: 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d 3e 6e  emcpy(&pParse->n
2010: 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20 53 41  Var, saveBuf, SA
2020: 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65  VE_SZ);.  pParse
2030: 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f  ->nested--;.}../
2040: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
2050: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
2060: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
2070: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
2080: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
2090: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
20a0: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
20b0: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
20c0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
20d0: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ** database cont
20e0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
20f0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
2100: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
2110: 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20  ** If zDatabase 
2120: 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61  is 0, all databa
2130: 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64  ses are searched
2140: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61   for the table a
2150: 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  nd the.** first 
2160: 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69  matching table i
2170: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f  s returned.  (No
2180: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75   checking for du
2190: 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a  plicate table.**
21a0: 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29   names is done.)
21b0: 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64    The search ord
21c0: 65 72 20 69 73 20 54 45 4d 50 20 66 69 72 73 74  er is TEMP first
21d0: 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65  , then MAIN, the
21e0: 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61  n any.** auxilia
21f0: 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64  ry databases add
2200: 65 64 20 75 73 69 6e 67 20 74 68 65 20 41 54 54  ed using the ATT
2210: 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  ACH command..**.
2220: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
2230: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29  te3LocateTable()
2240: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
2250: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c  te3FindTable(sql
2260: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
2270: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
2280: 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61  st char *zDataba
2290: 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20  se){.  Table *p 
22a0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
22b0: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 61 73 73  int nName;.  ass
22c0: 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20 29 3b  ert( zName!=0 );
22d0: 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  nName = sqlit
22e0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
22f0: 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65  );.  /* All mute
2300: 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  xes are required
2310: 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
2320: 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77  ss.  Make sure w
2330: 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a  e hold them. */.
2340: 20 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62    assert( zDatab
2350: 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase!=0 || sqlite
2360: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
2370: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20 66  texes(db) );.  f
2380: 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42  or(i=OMIT_TEMPDB
2390: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
23a0: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28  ){.    int j = (
23b0: 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20  i<2) ? i^1 : i; 
23c0: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
23d0: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
23e0: 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73      if( zDatabas
23f0: 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  e!=0 && sqlite3S
2400: 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65  trICmp(zDatabase
2410: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61  , db->aDb[j].zNa
2420: 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  me) ) continue;.
2430: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2440: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
2450: 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a  ld(db, j, 0) );.
2460: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
2470: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62  ashFind(&db->aDb
2480: 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  [j].pSchema->tbl
2490: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Hash, zName, nNa
24a0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  me);.    if( p )
24b0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
24c0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
24d0: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
24e0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
24f0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
2500: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
2510: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
2520: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
2530: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
2540: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
2550: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
2560: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
2570: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
2580: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
2590: 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c  t found.  Also l
25a0: 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eave an.** error
25b0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
25c0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
25d0: 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
25e0: 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
25f0: 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74  outine and sqlit
2600: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73  e3FindTable() is
2610: 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f   that this.** ro
2620: 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20  utine leaves an 
2630: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
2640: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
2650: 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65   where.** sqlite
2660: 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65  3FindTable() doe
2670: 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20  s not..*/.Table 
2680: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61  *sqlite3LocateTa
2690: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
26a0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
26b0: 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63   context in whic
26c0: 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f  h to report erro
26d0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  rs */.  int isVi
26e0: 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew,            /
26f0: 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69 6e  * True if lookin
2700: 67 20 66 6f 72 20 61 20 56 49 45 57 20 72 61 74  g for a VIEW rat
2710: 68 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c 45  her than a TABLE
2720: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2730: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20   *zName,     /* 
2740: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
2750: 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  e we are looking
2760: 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   for */.  const 
2770: 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20 20  char *zDbase    
2780: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2790: 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68 74  database.  Might
27a0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
27b0: 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a   Table *p;..  /*
27c0: 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
27d0: 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
27e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
27f0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
2800: 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
2810: 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
2820: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
2830: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
2840: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
2850: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
2860: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2870: 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  }..  p = sqlite3
2880: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
2890: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  ->db, zName, zDb
28a0: 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ase);.  if( p==0
28b0: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
28c0: 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69 65  ar *zMsg = isVie
28d0: 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65  w ? "no such vie
28e0: 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61  w" : "no such ta
28f0: 62 6c 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44  ble";.    if( zD
2900: 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71  base ){.      sq
2910: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2920: 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73  arse, "%s: %s.%s
2930: 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c  ", zMsg, zDbase,
2940: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
2950: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
2960: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2970: 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67  , "%s: %s", zMsg
2980: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , zName);.    }.
2990: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
29a0: 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d  kSchema = 1;.  }
29b0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
29c0: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
29d0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
29e0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
29f0: 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63  bes .** a partic
2a00: 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e  ular index given
2a10: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
2a20: 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  t index.** and t
2a30: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
2a40: 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e  atabase that con
2a50: 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e  tains the index.
2a60: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
2a70: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
2a80: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
2a90: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
2aa0: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
2ab0: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62  d for the.** tab
2ac0: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  le and the first
2ad0: 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20   matching index 
2ae0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
2af0: 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f  o checking.** fo
2b00: 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65  r duplicate inde
2b10: 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  x names is done.
2b20: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
2b30: 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66  der is.** TEMP f
2b40: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2b50: 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69   then any auxili
2b60: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
2b70: 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ded.** using the
2b80: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
2b90: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
2ba0: 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69  e3FindIndex(sqli
2bb0: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
2bc0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
2bd0: 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
2be0: 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20  Index *p = 0;.  
2bf0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61  int i;.  int nNa
2c00: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2c10: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 2f  en30(zName);.  /
2c20: 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72  * All mutexes ar
2c30: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  e required for s
2c40: 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d  chema access.  M
2c50: 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64  ake sure we hold
2c60: 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65   them. */.  asse
2c70: 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71  rt( zDb!=0 || sq
2c80: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
2c90: 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
2ca0: 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45  .  for(i=OMIT_TE
2cb0: 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  MPDB; i<db->nDb;
2cc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
2cd0: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
2ce0: 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54   i;  /* Search T
2cf0: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
2d00: 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  */.    Schema *p
2d10: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
2d20: 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [j].pSchema;.   
2d30: 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61   assert( pSchema
2d40: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20   );.    if( zDb 
2d50: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2d60: 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a  p(zDb, db->aDb[j
2d70: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
2d80: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
2d90: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
2da0: 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30  texHeld(db, j, 0
2db0: 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  ) );.    p = sql
2dc0: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 53  ite3HashFind(&pS
2dd0: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
2de0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
2df0: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
2e00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
2e10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61  ;.}../*.** Recla
2e20: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73  im the memory us
2e30: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a  ed by an index.*
2e40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
2e50: 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  eeIndex(sqlite3 
2e60: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a  *db, Index *p){.
2e70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2e80: 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71  MIT_ANALYZE.  sq
2e90: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
2ea0: 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a  Samples(db, p);.
2eb0: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
2ec0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 43  DbFree(db, p->zC
2ed0: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
2ee0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
2ef0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  }../*.** For the
2f00: 20 69 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49   index called zI
2f10: 64 78 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20  dxName which is 
2f20: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74  found in the dat
2f30: 61 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e  abase iDb,.** un
2f40: 6c 69 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20  like that index 
2f50: 66 72 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74  from its Table t
2f60: 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69  hen remove the i
2f70: 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  ndex from.** the
2f80: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
2f90: 65 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d  e and free all m
2fa0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
2fb0: 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
2fc0: 69 74 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ith the index..*
2fd0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
2fe0: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
2ff0: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
3000: 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63  int iDb, const c
3010: 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a  har *zIdxName){.
3020: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
3030: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 48 61  .  int len;.  Ha
3040: 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73  sh *pHash;..  as
3050: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
3060: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
3070: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48   iDb, 0) );.  pH
3080: 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  ash = &db->aDb[i
3090: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db].pSchema->idx
30a0: 48 61 73 68 3b 0a 20 20 6c 65 6e 20 3d 20 73 71  Hash;.  len = sq
30b0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49  lite3Strlen30(zI
30c0: 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65  dxName);.  pInde
30d0: 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  x = sqlite3HashI
30e0: 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64  nsert(pHash, zId
30f0: 78 4e 61 6d 65 2c 20 6c 65 6e 2c 20 30 29 3b 0a  xName, len, 0);.
3100: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e    if( ALWAYS(pIn
3110: 64 65 78 29 20 29 7b 0a 20 20 20 20 69 66 28 20  dex) ){.    if( 
3120: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
3130: 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29  pIndex==pIndex )
3140: 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
3150: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
3160: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
3170: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3180: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20   Index *p;.     
3190: 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f   /* Justificatio
31a0: 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3b 20 20  n of ALWAYS();  
31b0: 54 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62  The index must b
31c0: 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  e on the list of
31d0: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 65  .      ** indice
31e0: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 20 3d 20  s. */.      p = 
31f0: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
3200: 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68  pIndex;.      wh
3210: 69 6c 65 28 20 41 4c 57 41 59 53 28 70 29 20 26  ile( ALWAYS(p) &
3220: 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64  & p->pNext!=pInd
3230: 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  ex ){ p = p->pNe
3240: 78 74 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  xt; }.      if( 
3250: 41 4c 57 41 59 53 28 70 20 26 26 20 70 2d 3e 70  ALWAYS(p && p->p
3260: 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29 20 29 7b  Next==pIndex) ){
3270: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  .        p->pNex
3280: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
3290: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
32a0: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64  .    freeIndex(d
32b0: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
32c0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
32d0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
32e0: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  ges;.}../*.** Er
32f0: 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69  ase all schema i
3300: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
3310: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  the in-memory ha
3320: 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20  sh tables of.** 
3330: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
3340: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
3350: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
3360: 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20  claim memory.** 
3370: 62 65 66 6f 72 65 20 74 68 65 20 64 61 74 61 62  before the datab
3380: 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49 74 20  ase closes.  It 
3390: 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64  is also called d
33a0: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
33b0: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65 72  .** if there wer
33c0: 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  e schema changes
33d0: 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e   during the tran
33e0: 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20 61 0a  saction or if a.
33f0: 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65  ** schema-cookie
3400: 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75 72 73   mismatch occurs
3410: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30  ..**.** If iDb<0
3420: 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20   then reset the 
3430: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
3440: 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64  tables for all d
3450: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73  atabase.** files
3460: 2e 20 20 49 66 20 69 44 62 3e 3d 30 20 74 68 65  .  If iDb>=0 the
3470: 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65  n reset the inte
3480: 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f 72 20  rnal schema for 
3490: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67  only the.** sing
34a0: 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74 65  le file indicate
34b0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
34c0: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
34d0: 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64  chema(sqlite3 *d
34e0: 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69  b, int iDb){.  i
34f0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 73 73 65 72  nt i, j;.  asser
3500: 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  t( iDb<db->nDb )
3510: 3b 0a 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20  ;..  if( iDb>=0 
3520: 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31  ){.    /* Case 1
3530: 3a 20 20 52 65 73 65 74 20 74 68 65 20 73 69 6e  :  Reset the sin
3540: 67 6c 65 20 73 63 68 65 6d 61 20 69 64 65 6e 74  gle schema ident
3550: 69 66 69 65 64 20 62 79 20 69 44 62 20 2a 2f 0a  ified by iDb */.
3560: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
3570: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20  b->aDb[iDb];.   
3580: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3590: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
35a0: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
35b0: 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e     assert( pDb->
35c0: 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20  pSchema!=0 );.  
35d0: 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43    sqlite3SchemaC
35e0: 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d  lear(pDb->pSchem
35f0: 61 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61  a);..    /* If a
3600: 6e 79 20 64 61 74 61 62 61 73 65 20 6f 74 68 65  ny database othe
3610: 72 20 74 68 61 6e 20 54 45 4d 50 20 69 73 20 72  r than TEMP is r
3620: 65 73 65 74 2c 20 74 68 65 6e 20 61 6c 73 6f 20  eset, then also 
3630: 72 65 73 65 74 20 54 45 4d 50 0a 20 20 20 20 2a  reset TEMP.    *
3640: 2a 20 73 69 6e 63 65 20 54 45 4d 50 20 6d 69 67  * since TEMP mig
3650: 68 74 20 62 65 20 68 6f 6c 64 69 6e 67 20 74 72  ht be holding tr
3660: 69 67 67 65 72 73 20 74 68 61 74 20 72 65 66 65  iggers that refe
3670: 72 65 6e 63 65 20 74 61 62 6c 65 73 20 69 6e 20  rence tables in 
3680: 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  the.    ** other
3690: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a   database..    *
36a0: 2f 0a 20 20 20 20 69 66 28 20 69 44 62 21 3d 31  /.    if( iDb!=1
36b0: 20 29 7b 0a 20 20 20 20 20 20 70 44 62 20 3d 20   ){.      pDb = 
36c0: 26 64 62 2d 3e 61 44 62 5b 31 5d 3b 0a 20 20 20  &db->aDb[1];.   
36d0: 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e     assert( pDb->
36e0: 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20  pSchema!=0 );.  
36f0: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
3700: 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68  aClear(pDb->pSch
3710: 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ema);.    }.    
3720: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 2f 2a  return;.  }.  /*
3730: 20 43 61 73 65 20 32 20 28 66 72 6f 6d 20 68 65   Case 2 (from he
3740: 72 65 20 74 6f 20 74 68 65 20 65 6e 64 29 3a 20  re to the end): 
3750: 52 65 73 65 74 20 61 6c 6c 20 73 63 68 65 6d 61  Reset all schema
3760: 73 20 66 6f 72 20 61 6c 6c 20 61 74 74 61 63 68  s for all attach
3770: 65 64 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  ed.  ** database
3780: 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  s. */.  assert( 
3790: 69 44 62 3c 30 20 29 3b 0a 20 20 73 71 6c 69 74  iDb<0 );.  sqlit
37a0: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
37b0: 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  db);.  for(i=0; 
37c0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
37d0: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
37e0: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
37f0: 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
3800: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3810: 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62  3SchemaClear(pDb
3820: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
3830: 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67  }.  }.  db->flag
3840: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
3850: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71  ernChanges;.  sq
3860: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c  lite3VtabUnlockL
3870: 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ist(db);.  sqlit
3880: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
3890: 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  db);..  /* If on
38a0: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
38b0: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
38c0: 61 73 65 20 66 69 6c 65 73 20 68 61 73 20 62 65  ase files has be
38d0: 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20  en closed,.  ** 
38e0: 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 6d  then remove them
38f0: 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c 69   from the auxili
3900: 61 72 79 20 64 61 74 61 62 61 73 65 20 6c 69 73  ary database lis
3910: 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65 0a  t.  We take the.
3920: 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79    ** opportunity
3930: 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72 65   to do this here
3940: 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6a   since we have j
3950: 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c 20  ust deleted all 
3960: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68 65  of the.  ** sche
3970: 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 20 61  ma hash tables a
3980: 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f 20  nd therefore do 
3990: 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b 65  not have to make
39a0: 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20 2a   any changes.  *
39b0: 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73  * to any of thos
39c0: 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
39d0: 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62   for(i=j=2; i<db
39e0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
39f0: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
3a00: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
3a10: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
3a20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
3a30: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
3a40: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
3a50: 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b   pDb->zName = 0;
3a60: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
3a70: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
3a80: 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  <i ){.      db->
3a90: 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62  aDb[j] = db->aDb
3aa0: 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  [i];.    }.    j
3ab0: 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ++;.  }.  memset
3ac0: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c  (&db->aDb[j], 0,
3ad0: 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a   (db->nDb-j)*siz
3ae0: 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29  eof(db->aDb[j]))
3af0: 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b  ;.  db->nDb = j;
3b00: 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d  .  if( db->nDb<=
3b10: 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62  2 && db->aDb!=db
3b20: 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20  ->aDbStatic ){. 
3b30: 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44     memcpy(db->aD
3b40: 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62  bStatic, db->aDb
3b50: 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61  , 2*sizeof(db->a
3b60: 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c  Db[0]));.    sql
3b70: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 64  ite3DbFree(db, d
3b80: 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d  b->aDb);.    db-
3b90: 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74  >aDb = db->aDbSt
3ba0: 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  atic;.  }.}../*.
3bb0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3bc0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
3bd0: 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a   commit occurs..
3be0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
3bf0: 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
3c00: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
3c10: 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  ){.  db->flags &
3c20: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  = ~SQLITE_Intern
3c30: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
3c40: 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79 20  * Delete memory 
3c50: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
3c60: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f  e column names o
3c70: 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
3c80: 77 20 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65 2e  w (the.** Table.
3c90: 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a 2a  aCol[] array)..*
3ca0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
3cb0: 6c 69 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  liteDeleteColumn
3cc0: 4e 61 6d 65 73 28 73 71 6c 69 74 65 33 20 2a 64  Names(sqlite3 *d
3cd0: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
3ce0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f  ){.  int i;.  Co
3cf0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73  lumn *pCol;.  as
3d00: 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20  sert( pTable!=0 
3d10: 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d  );.  if( (pCol =
3d20: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d   pTable->aCol)!=
3d30: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
3d40: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
3d50: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
3d60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
3d70: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e  ree(db, pCol->zN
3d80: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
3d90: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
3da0: 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  , pCol->pDflt);.
3db0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
3dc0: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44  ree(db, pCol->zD
3dd0: 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  flt);.      sqli
3de0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
3df0: 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20  ol->zType);.    
3e00: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3e10: 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29  db, pCol->zColl)
3e20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
3e30: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
3e40: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d  able->aCol);.  }
3e50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
3e60: 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61   the memory data
3e70: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
3e80: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
3e90: 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20  given.** Table. 
3ea0: 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
3eb0: 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20  made to disk by 
3ec0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
3ed0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3ee0: 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68   just deletes th
3ef0: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
3f00: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75  .  It does not u
3f10: 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62  nlink.** the tab
3f20: 6c 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  le data structur
3f30: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
3f40: 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64  table.  But it d
3f50: 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d  oes destroy.** m
3f60: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
3f70: 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20   of the indices 
3f80: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
3f90: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3fa0: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a   .** the table..
3fb0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
3fc0: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
3fd0: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
3fe0: 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20  Table){.  Index 
3ff0: 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b  *pIndex, *pNext;
4000: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 54 61  ..  assert( !pTa
4010: 62 6c 65 20 7c 7c 20 70 54 61 62 6c 65 2d 3e 6e  ble || pTable->n
4020: 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 44  Ref>0 );..  /* D
4030: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
4040: 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65   table until the
4050: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
4060: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a   reaches zero. *
4070: 2f 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65 20  /.  if( !pTable 
4080: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
4090: 28 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42  ((!db || db->pnB
40a0: 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26  ytesFreed==0) &&
40b0: 20 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 52 65 66   (--pTable->nRef
40c0: 29 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  )>0) ) return;..
40d0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
40e0: 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
40f0: 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62  ed with this tab
4100: 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e  le. */.  for(pIn
4110: 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49  dex = pTable->pI
4120: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
4130: 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ndex=pNext){.   
4140: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
4150: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65  >pNext;.    asse
4160: 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  rt( pIndex->pSch
4170: 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63  ema==pTable->pSc
4180: 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20  hema );.    if( 
4190: 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74  !db || db->pnByt
41a0: 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20  esFreed==0 ){.  
41b0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
41c0: 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b  = pIndex->zName;
41d0: 20 0a 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59   .      TESTONLY
41e0: 20 28 20 49 6e 64 65 78 20 2a 70 4f 6c 64 20 3d   ( Index *pOld =
41f0: 20 29 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   ) sqlite3HashIn
4200: 73 65 72 74 28 0a 09 20 20 26 70 49 6e 64 65 78  sert(..  &pIndex
4210: 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
4220: 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74  sh, zName, sqlit
4230: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
4240: 29 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  ), 0.      );.  
4250: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d      assert( db==
4260: 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 63 68 65  0 || sqlite3Sche
4270: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
4280: 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  0, pIndex->pSche
4290: 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ma) );.      ass
42a0: 65 72 74 28 20 70 4f 6c 64 3d 3d 70 49 6e 64 65  ert( pOld==pInde
42b0: 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29 3b 0a  x || pOld==0 );.
42c0: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e      }.    freeIn
42d0: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
42e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
42f0: 65 20 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65  e any foreign ke
4300: 79 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ys attached to t
4310: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
4320: 73 71 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28  sqlite3FkDelete(
4330: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20  db, pTable);..  
4340: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61  /* Delete the Ta
4350: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74  ble structure it
4360: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  self..  */.  sql
4370: 69 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  iteDeleteColumnN
4380: 61 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29  ames(db, pTable)
4390: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
43a0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  e(db, pTable->zN
43b0: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
43c0: 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65  bFree(db, pTable
43d0: 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71  ->zColAff);.  sq
43e0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
43f0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53  e(db, pTable->pS
4400: 65 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65 66 20  elect);.#ifndef 
4410: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
4420: 4b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  K.  sqlite3ExprD
4430: 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65  elete(db, pTable
4440: 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69  ->pCheck);.#endi
4450: 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
4460: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
4470: 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  LE.  sqlite3Vtab
4480: 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65  Clear(db, pTable
4490: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
44a0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
44b0: 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  able);.}../*.** 
44c0: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
44d0: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
44e0: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
44f0: 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a  the delete the.*
4500: 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  * table structur
4510: 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69  e with all its i
4520: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
4530: 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64  gn keys..*/.void
4540: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
4550: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
4560: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
4570: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
4580: 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c  TabName){.  Tabl
4590: 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b  e *p;.  Db *pDb;
45a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
45b0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
45c0: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
45d0: 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
45e0: 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20  ( zTabName );.  
45f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
4600: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
4610: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
4620: 74 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61  testcase( zTabNa
4630: 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20  me[0]==0 );  /* 
4640: 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c  Zero-length tabl
4650: 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f  e names are allo
4660: 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26  wed */.  pDb = &
4670: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
4680: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
4690: 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68  nsert(&pDb->pSch
46a0: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54  ema->tblHash, zT
46b0: 61 62 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  abName,.        
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46d0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
46e0: 7a 54 61 62 4e 61 6d 65 29 2c 30 29 3b 0a 20 20  zTabName),0);.  
46f0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
4700: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d  le(db, p);.  db-
4710: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
4720: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
4730: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
4740: 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61   token, return a
4750: 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e   string that con
4760: 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78  sists of the tex
4770: 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b  t of that.** tok
4780: 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  en.  Space to ho
4790: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
47a0: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74  string.** is obt
47b0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
47c0: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
47d0: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
47e0: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
47f0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e  nction..**.** An
4800: 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b  y quotation mark
4810: 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20  s (ex:  "name", 
4820: 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20  'name', [name], 
4830: 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a  or `name`) that.
4840: 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20  ** surround the 
4850: 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65  body of the toke
4860: 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a  n are removed..*
4870: 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20  *.** Tokens are 
4880: 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74  often just point
4890: 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ers into the ori
48a0: 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61  ginal SQL text a
48b0: 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74  nd so.** are not
48c0: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
48d0: 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72   and are not per
48e0: 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65  sistent.  The re
48f0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a  turned string.**
4900: 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61   is \000 termina
4910: 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69  ted and is persi
4920: 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a  stent..*/.char *
4930: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
4940: 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  oken(sqlite3 *db
4950: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
4960: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
4970: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
4980: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
4990: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
49a0: 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c  (char*)pName->z,
49b0: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
49c0: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
49d0: 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Name);.  }else{.
49e0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20      zName = 0;. 
49f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d   }.  return zNam
4a00: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  e;.}../*.** Open
4a10: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
4a20: 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20  er table stored 
4a30: 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62  in database numb
4a40: 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72  er iDb for.** wr
4a50: 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65  iting. The table
4a60: 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67   is opened using
4a70: 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f   cursor 0..*/.vo
4a80: 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61  id sqlite3OpenMa
4a90: 73 74 65 72 54 61 62 6c 65 28 50 61 72 73 65 20  sterTable(Parse 
4aa0: 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  *p, int iDb){.  
4ab0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
4ac0: 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73  3GetVdbe(p);.  s
4ad0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
4ae0: 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52  p, iDb, MASTER_R
4af0: 4f 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54  OOT, 1, SCHEMA_T
4b00: 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 73 71  ABLE(iDb));.  sq
4b10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4b20: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
4b30: 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c   0, MASTER_ROOT,
4b40: 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   iDb);.  sqlite3
4b50: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
4b60: 2d 31 2c 20 28 63 68 61 72 20 2a 29 35 2c 20 50  -1, (char *)5, P
4b70: 34 5f 49 4e 54 33 32 29 3b 20 20 2f 2a 20 35 20  4_INT32);  /* 5 
4b80: 63 6f 6c 75 6d 6e 20 74 61 62 6c 65 20 2a 2f 0a  column table */.
4b90: 20 20 69 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30    if( p->nTab==0
4ba0: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20   ){.    p->nTab 
4bb0: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
4bc0: 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d  * Parameter zNam
4bd0: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75  e points to a nu
4be0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 62 75 66  l-terminated buf
4bf0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
4c00: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20  he name.** of a 
4c10: 64 61 74 61 62 61 73 65 20 28 22 6d 61 69 6e 22  database ("main"
4c20: 2c 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  , "temp" or the 
4c30: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
4c40: 68 65 64 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a  hed db). This.**
4c50: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
4c60: 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
4c70: 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73  he named databas
4c80: 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20  e in db->aDb[], 
4c90: 6f 72 0a 2a 2a 20 2d 31 20 69 66 20 74 68 65 20  or.** -1 if the 
4ca0: 6e 61 6d 65 64 20 64 62 20 63 61 6e 6e 6f 74 20  named db cannot 
4cb0: 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  be found..*/.int
4cc0: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
4cd0: 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  me(sqlite3 *db, 
4ce0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
4cf0: 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31  e){.  int i = -1
4d00: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ;         /* Dat
4d10: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  abase number */.
4d20: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
4d30: 20 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 20 20     Db *pDb;.    
4d40: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
4d50: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
4d60: 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e      for(i=(db->n
4d70: 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e  Db-1), pDb=&db->
4d80: 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d  aDb[i]; i>=0; i-
4d90: 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20  -, pDb--){.     
4da0: 20 69 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50   if( (!OMIT_TEMP
4db0: 44 42 20 7c 7c 20 69 21 3d 31 20 29 20 26 26 20  DB || i!=1 ) && 
4dc0: 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  n==sqlite3Strlen
4dd0: 33 30 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26  30(pDb->zName) &
4de0: 26 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d 3d  & .          0==
4df0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
4e00: 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  Db->zName, zName
4e10: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  ) ){.        bre
4e20: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4e30: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  }.  }.  return i
4e40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  ;.}../*.** The t
4e50: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74  oken *pName cont
4e60: 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  ains the name of
4e70: 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69 74   a database (eit
4e80: 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a  her "main" or.**
4e90: 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e   "temp" or the n
4ea0: 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68  ame of an attach
4eb0: 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75  ed db). This rou
4ec0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
4ed0: 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65  .** index of the
4ee0: 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
4ef0: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72  in db->aDb[], or
4f00: 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64   -1 if the named
4f10: 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74   db .** does not
4f20: 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73   exist..*/.int s
4f30: 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c  qlite3FindDb(sql
4f40: 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20  ite3 *db, Token 
4f50: 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *pName){.  int i
4f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f80: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
4f90: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  er */.  char *zN
4fa0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
4fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4fc0: 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 72  Name we are sear
4fd0: 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a  ching for */.  z
4fe0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
4ff0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
5000: 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71  pName);.  i = sq
5010: 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
5020: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  db, zName);.  sq
5030: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5040: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
5050: 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61   i;.}../* The ta
5060: 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74  ble or view or t
5070: 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70  rigger name is p
5080: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f  assed to this ro
5090: 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73  utine via tokens
50a0: 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70  .** pName1 and p
50b0: 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61  Name2. If the ta
50c0: 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c  ble name was ful
50d0: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f  ly qualified, fo
50e0: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
50f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
5100: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20  x.yyy (...);.** 
5110: 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20  .** Then pName1 
5120: 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20  is set to "xxx" 
5130: 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22  and pName2 "yyy"
5140: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
5150: 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  and if.** the ta
5160: 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  ble name is not 
5170: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
5180: 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45   i.e.:.**.** CRE
5190: 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e  ATE TABLE yyy(..
51a0: 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70  .);.**.** Then p
51b0: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
51c0: 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32  "yyy" and pName2
51d0: 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68   is ""..**.** Th
51e0: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
51f0: 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f  the *ppUnqual po
5200: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
5210: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
5220: 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32  me1 or.** pName2
5230: 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  ) that stores th
5240: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61  e unqualified ta
5250: 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69  ble name.  The i
5260: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64  ndex of the.** d
5270: 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69 73  atabase "xxx" is
5280: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
5290: 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  t sqlite3TwoPart
52a0: 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70  Name(.  Parse *p
52b0: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
52c0: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
52d0: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
52e0: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
52f0: 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54  Name1,      /* T
5300: 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 20  he "xxx" in the 
5310: 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f  name "xxx.yyy" o
5320: 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b  r "xxx" */.  Tok
5330: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
5340: 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e   /* The "yyy" in
5350: 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79   the name "xxx.y
5360: 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  yy" */.  Token *
5370: 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20  *pUnqual     /* 
5380: 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c  Write the unqual
5390: 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d  ified object nam
53a0: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
53b0: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
53c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
53d0: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74  tabase holding t
53e0: 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  he object */.  s
53f0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
5400: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
5410: 41 4c 57 41 59 53 28 70 4e 61 6d 65 32 21 3d 30  ALWAYS(pName2!=0
5420: 29 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  ) && pName2->n>0
5430: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
5440: 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20  init.busy ) {.  
5450: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
5460: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72  Msg(pParse, "cor
5470: 72 75 70 74 20 64 61 74 61 62 61 73 65 22 29 3b  rupt database");
5480: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
5490: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Err++;.      ret
54a0: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
54b0: 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61    *pUnqual = pNa
54c0: 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  me2;.    iDb = s
54d0: 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c  qlite3FindDb(db,
54e0: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66   pName1);.    if
54f0: 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20  ( iDb<0 ){.     
5500: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5510: 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
5520: 6e 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20  n database %T", 
5530: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 70  pName1);.      p
5540: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
5550: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
5560: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
5570: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69     assert( db->i
5580: 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62  nit.iDb==0 || db
5590: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
55a0: 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69     iDb = db->ini
55b0: 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71  t.iDb;.    *pUnq
55c0: 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20  ual = pName1;.  
55d0: 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a  }.  return iDb;.
55e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
55f0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
5600: 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 55 54   check if the UT
5610: 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65  F-8 string zName
5620: 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75   is a legal.** u
5630: 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
5640: 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61  for a new schema
5650: 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20   object (table, 
5660: 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a  index, view or.*
5670: 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20  * trigger). All 
5680: 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20  names are legal 
5690: 65 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61  except those tha
56a0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  t begin with the
56b0: 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69   string.** "sqli
56c0: 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20  te_" (in upper, 
56d0: 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63  lower or mixed c
56e0: 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69  ase). This porti
56f0: 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70  on of the namesp
5700: 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76  ace.** is reserv
5710: 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  ed for internal 
5720: 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
5730: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
5740: 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  me(Parse *pParse
5750: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
5760: 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61  ame){.  if( !pPa
5770: 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  rse->db->init.bu
5780: 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65  sy && pParse->ne
5790: 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20  sted==0 .       
57a0: 20 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64     && (pParse->d
57b0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
57c0: 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d  E_WriteSchema)==
57d0: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30  0.          && 0
57e0: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
57f0: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
5800: 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71  _", 7) ){.    sq
5810: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5820: 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61  arse, "object na
5830: 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  me reserved for 
5840: 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73  internal use: %s
5850: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ", zName);.    r
5860: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
5870: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
5880: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
5890: 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74  *.** Begin const
58a0: 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ructing a new ta
58b0: 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
58c0: 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54  on in memory.  T
58d0: 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  his is.** the fi
58e0: 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61  rst of several a
58f0: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74  ction routines t
5900: 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69  hat get called i
5910: 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f  n response.** to
5920: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
5930: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70  statement.  In p
5940: 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20  articular, this 
5950: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
5960: 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e  d.** after seein
5970: 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45  g tokens "CREATE
5980: 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e  " and "TABLE" an
5990: 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  d the table name
59a0: 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20  . The isTemp.** 
59b0: 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
59c0: 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  the table should
59d0: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68   be stored in th
59e0: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
59f0: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73  base.** file ins
5a00: 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d  tead of in the m
5a10: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
5a20: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
5a30: 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a  ally the case.**
5a40: 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22   when the "TEMP"
5a50: 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20   or "TEMPORARY" 
5a60: 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69  keyword occurs i
5a70: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45  n between.** CRE
5a80: 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a  ATE and TABLE..*
5a90: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62  *.** The new tab
5aa0: 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69  le record is ini
5ab0: 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74  tialized and put
5ac0: 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   in pParse->pNew
5ad0: 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72  Table..** As mor
5ae0: 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  e of the CREATE 
5af0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
5b00: 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74  is parsed, addit
5b10: 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20  ional action.** 
5b20: 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65  routines will be
5b30: 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d   called to add m
5b40: 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
5b50: 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a  to this record..
5b60: 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
5b70: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
5b80: 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
5b90: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
5ba0: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  () routine.** is
5bb0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
5bc0: 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63  ete the construc
5bd0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
5be0: 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  table record..*/
5bf0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61  .void sqlite3Sta
5c00: 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  rtTable(.  Parse
5c10: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
5c20: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
5c30: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
5c40: 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72  ,   /* First par
5c50: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
5c60: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
5c70: 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ew */.  Token *p
5c80: 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f  Name2,   /* Seco
5c90: 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  nd part of the n
5ca0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
5cb0: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e   or view */.  in
5cc0: 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f  t isTemp,      /
5cd0: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
5ce0: 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a  s a TEMP table *
5cf0: 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20  /.  int isView, 
5d00: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5d10: 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a  this is a VIEW *
5d20: 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75 61  /.  int isVirtua
5d30: 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  l,   /* True if 
5d40: 74 68 69 73 20 69 73 20 61 20 56 49 52 54 55 41  this is a VIRTUA
5d50: 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  L table */.  int
5d60: 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a   noErr        /*
5d70: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
5d80: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
5d90: 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
5da0: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61  e *pTable;.  cha
5db0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a  r *zName = 0; /*
5dc0: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
5dd0: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
5de0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
5df0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
5e00: 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20   *v;.  int iDb; 
5e10: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
5e20: 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72  ase number to cr
5e30: 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  eate the table i
5e40: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
5e50: 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61  ame;    /* Unqua
5e60: 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
5e70: 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61  he table to crea
5e80: 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  te */..  /* The 
5e90: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
5ea0: 6d 65 20 74 6f 20 63 72 65 61 74 65 20 69 73 20  me to create is 
5eb0: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
5ec0: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
5ed0: 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e  s.  ** pName1 an
5ee0: 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65  d pName2. If the
5ef0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20   table name was 
5f00: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
5f10: 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20   for example:.  
5f20: 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54  **.  ** CREATE T
5f30: 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e  ABLE xxx.yyy (..
5f40: 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54  .);.  ** .  ** T
5f50: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
5f60: 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70  t to "xxx" and p
5f70: 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20  Name2 "yyy". On 
5f80: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69  the other hand i
5f90: 66 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65  f.  ** the table
5fa0: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c   name is not ful
5fb0: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e  ly qualified, i.
5fc0: 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52  e.:.  **.  ** CR
5fd0: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
5fe0: 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ..);.  **.  ** T
5ff0: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
6000: 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70  t to "yyy" and p
6010: 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20 2a  Name2 is ""..  *
6020: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20  *.  ** The call 
6030: 62 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20 70  below sets the p
6040: 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  Name pointer to 
6050: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b  point at the tok
6060: 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20  en (pName1 or.  
6070: 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20  ** pName2) that 
6080: 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61  stores the unqua
6090: 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d  lified table nam
60a0: 65 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65 20  e. The variable 
60b0: 69 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74 20  iDb is.  ** set 
60c0: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
60d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
60e0: 74 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  t the table or v
60f0: 69 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20 2a  iew is to be.  *
6100: 2a 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20 20  * created in..  
6110: 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  */.  iDb = sqlit
6120: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
6130: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
6140: 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
6150: 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74   if( iDb<0 ) ret
6160: 75 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d 49 54  urn;.  if( !OMIT
6170: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
6180: 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  p && pName2->n>0
6190: 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20 20   && iDb!=1 ){.  
61a0: 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67    /* If creating
61b0: 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74   a temp table, t
61c0: 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20  he name may not 
61d0: 62 65 20 71 75 61 6c 69 66 69 65 64 2e 20 55 6e  be qualified. Un
61e0: 6c 65 73 73 20 0a 20 20 20 20 2a 2a 20 74 68 65  less .    ** the
61f0: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
6200: 73 20 22 74 65 6d 70 22 20 61 6e 79 77 61 79 2e  s "temp" anyway.
6210: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
6220: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6230: 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c   "temporary tabl
6240: 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75  e name must be u
6250: 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20  nqualified");.  
6260: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
6270: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
6280: 20 26 26 20 69 73 54 65 6d 70 20 29 20 69 44 62   && isTemp ) iDb
6290: 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d   = 1;..  pParse-
62a0: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70  >sNameToken = *p
62b0: 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  Name;.  zName = 
62c0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
62d0: 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
62e0: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
62f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
6300: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
6310: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
6320: 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
6330: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67   ){.    goto beg
6340: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
6350: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e    }.  if( db->in
6360: 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65  it.iDb==1 ) isTe
6370: 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  mp = 1;.#ifndef 
6380: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
6390: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65  ORIZATION.  asse
63a0: 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29  rt( (isTemp & 1)
63b0: 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a  ==isTemp );.  {.
63c0: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
63d0: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
63e0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
63f0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
6400: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
6410: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
6420: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
6430: 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
6440: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
6450: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6460: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
6470: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
6480: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
6490: 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  && isTemp ){.   
64a0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
64b0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
64c0: 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
64d0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
64e0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
64f0: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
6500: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
6510: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
6520: 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  & isTemp ){.    
6530: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
6540: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
6550: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
6560: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
6570: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
6580: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
6590: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56    }.    if( !isV
65a0: 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65  irtual && sqlite
65b0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
65c0: 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20  e, code, zName, 
65d0: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
65e0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
65f0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
6600: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
6610: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
6620: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
6630: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
6640: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
6650: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
6660: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
6670: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
6680: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
6690: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
66a0: 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70   does. The excep
66b0: 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73  tion is if the s
66c0: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70  tatement being p
66d0: 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64  arsed was passed
66e0: 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69  .  ** to an sqli
66f0: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
6700: 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74  () call. In that
6710: 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63   case only the c
6720: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a  olumn names.  **
6730: 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20   and types will 
6740: 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72  be used, so ther
6750: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
6760: 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61  test for namespa
6770: 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f  ce.  ** collisio
6780: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
6790: 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
67a0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62  ){.    char *zDb
67b0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
67c0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 53  zName;.    if( S
67d0: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
67e0: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
67f0: 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  se) ){.      got
6800: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
6810: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ror;.    }.    p
6820: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46  Table = sqlite3F
6830: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
6840: 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66  me, zDb);.    if
6850: 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( pTable ){.    
6860: 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a    if( !noErr ){.
6870: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
6880: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6890: 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64  "table %T alread
68a0: 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65  y exists", pName
68b0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
68c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
68d0: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
68e0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
68f0: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
6900: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
6910: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
6920: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
6930: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
6940: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49  if( sqlite3FindI
6950: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
6960: 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  zDb)!=0 ){.     
6970: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
6980: 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
6990: 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e  is already an in
69a0: 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  dex named %s", z
69b0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
69c0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
69d0: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ror;.    }.  }..
69e0: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
69f0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
6a00: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
6a10: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
6a20: 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  =0 ){.    db->ma
6a30: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
6a40: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
6a50: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
6a60: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
6a70: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69  +;.    goto begi
6a80: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
6a90: 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61   }.  pTable->zNa
6aa0: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54  me = zName;.  pT
6ab0: 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  able->iPKey = -1
6ac0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68  ;.  pTable->pSch
6ad0: 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ema = db->aDb[iD
6ae0: 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54  b].pSchema;.  pT
6af0: 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  able->nRef = 1;.
6b00: 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 45 73    pTable->nRowEs
6b10: 74 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 61  t = 1000000;.  a
6b20: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
6b30: 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  NewTable==0 );. 
6b40: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
6b50: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20  le = pTable;..  
6b60: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
6b70: 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73  e magic sqlite_s
6b80: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73  equence table us
6b90: 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d  ed by autoincrem
6ba0: 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  ent,.  ** then r
6bb0: 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20  ecord a pointer 
6bc0: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e  to this table in
6bd0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
6be0: 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
6bf0: 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54  * so that INSERT
6c00: 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61   can find the ta
6c10: 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f  ble easily..  */
6c20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6c30: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
6c40: 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  NT.  if( !pParse
6c50: 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72 63  ->nested && strc
6c60: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
6c70: 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20  e_sequence")==0 
6c80: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
6c90: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
6ca0: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
6cb0: 29 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  ) );.    pTable-
6cc0: 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61  >pSchema->pSeqTa
6cd0: 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a  b = pTable;.  }.
6ce0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67  #endif..  /* Beg
6cf0: 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  in generating th
6d00: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
6d10: 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c   insert the tabl
6d20: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20  e record into.  
6d30: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  ** the SQLITE_MA
6d40: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74  STER table.  Not
6d50: 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20  e in particular 
6d60: 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20  that we must go 
6d70: 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61  ahead.  ** and a
6d80: 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f  llocate the reco
6d90: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
6da0: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f  e table entry no
6db0: 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20  w.  Before any. 
6dc0: 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
6dd0: 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72  or UNIQUE keywor
6de0: 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20  ds are parsed.  
6df0: 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77  Those keywords w
6e00: 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69  ill cause.  ** i
6e10: 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65  ndices to be cre
6e20: 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62  ated and the tab
6e30: 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63  le record must c
6e40: 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a  ome before the .
6e50: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48    ** indices.  H
6e60: 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64  ence, the record
6e70: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
6e80: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c  table must be al
6e90: 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77  located.  ** now
6ea0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
6eb0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28  ->init.busy && (
6ec0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
6ed0: 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29  be(pParse))!=0 )
6ee0: 7b 0a 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20  {.    int j1;.  
6ef0: 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74    int fileFormat
6f00: 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20  ;.    int reg1, 
6f10: 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20  reg2, reg3;.    
6f20: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
6f30: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
6f40: 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66  e, 0, iDb);..#if
6f50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6f60: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
6f70: 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c 20    if( isVirtual 
6f80: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6f90: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
6fa0: 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a  _VBegin);.    }.
6fb0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
6fc0: 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  f the file forma
6fd0: 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69  t and encoding i
6fe0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
6ff0: 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74  ave not been set
7000: 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  , .    ** set th
7010: 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20  em now..    */. 
7020: 20 20 20 72 65 67 31 20 3d 20 70 50 61 72 73 65     reg1 = pParse
7030: 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70  ->regRowid = ++p
7040: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
7050: 20 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e   reg2 = pParse->
7060: 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72  regRoot = ++pPar
7070: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
7080: 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  g3 = ++pParse->n
7090: 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
70a0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
70b0: 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62  _ReadCookie, iDb
70c0: 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46 49  , reg3, BTREE_FI
70d0: 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20  LE_FORMAT);.    
70e0: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
70f0: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
7100: 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
7110: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
7120: 66 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 66 69  f, reg3);.    fi
7130: 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e  leFormat = (db->
7140: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c  flags & SQLITE_L
7150: 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30  egacyFileFmt)!=0
7160: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
7170: 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f       1 : SQLITE_
7180: 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b  MAX_FILE_FORMAT;
7190: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
71a0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
71b0: 65 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74  eger, fileFormat
71c0: 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c  , reg3);.    sql
71d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
71e0: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
71f0: 69 44 62 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f  iDb, BTREE_FILE_
7200: 46 4f 52 4d 41 54 2c 20 72 65 67 33 29 3b 0a 20  FORMAT, reg3);. 
7210: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7220: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
7230: 65 72 2c 20 45 4e 43 28 64 62 29 2c 20 72 65 67  er, ENC(db), reg
7240: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
7250: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7260: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
7270: 42 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44  BTREE_TEXT_ENCOD
7280: 49 4e 47 2c 20 72 65 67 33 29 3b 0a 20 20 20 20  ING, reg3);.    
7290: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
72a0: 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 20  ere(v, j1);..   
72b0: 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72   /* This just cr
72c0: 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f  eates a place-ho
72d0: 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74  lder record in t
72e0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
72f0: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54   table..    ** T
7300: 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74 65  he record create
7310: 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  d does not conta
7320: 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e  in anything yet.
7330: 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70    It will be rep
7340: 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  laced.    ** by 
7350: 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69  the real entry i
7360: 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  n code generated
7370: 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61   at sqlite3EndTa
7380: 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ble()..    **.  
7390: 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66    ** The rowid f
73a0: 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  or the new entry
73b0: 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69   is left in regi
73c0: 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67  ster pParse->reg
73d0: 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68  Rowid..    ** Th
73e0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
73f0: 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  er of the new ta
7400: 62 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72  ble is left in r
7410: 65 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  eg pParse->regRo
7420: 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  ot..    ** The r
7430: 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61  owid and root pa
7440: 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73  ge number values
7450: 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74   are needed by t
7460: 68 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20  he code that.   
7470: 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61   ** sqlite3EndTa
7480: 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  ble will generat
7490: 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64  e..    */.#if !d
74a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
74b0: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
74c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
74d0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20  _VIRTUALTABLE). 
74e0: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c     if( isView ||
74f0: 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20   isVirtual ){.  
7500: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7510: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
7520: 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20  ger, 0, reg2);. 
7530: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
7540: 20 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69      {.      sqli
7550: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7560: 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c   OP_CreateTable,
7570: 20 69 44 62 2c 20 72 65 67 32 29 3b 0a 20 20 20   iDb, reg2);.   
7580: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70   }.    sqlite3Op
7590: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50  enMasterTable(pP
75a0: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
75b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
75c0: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
75d0: 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  , 0, reg1);.    
75e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
75f0: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
7600: 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69   reg3);.    sqli
7610: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7620: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72   OP_Insert, 0, r
7630: 65 67 33 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  eg3, reg1);.    
7640: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7650: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
7660: 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74  PEND);.    sqlit
7670: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
7680: 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a  OP_Close);.  }..
7690: 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e    /* Normal (non
76a0: 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20  -error) return. 
76b0: 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  */.  return;..  
76c0: 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
76d0: 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68  ccurs, we jump h
76e0: 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62  ere */.begin_tab
76f0: 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69  le_error:.  sqli
7700: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
7710: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
7720: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61  }../*.** This ma
7730: 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20 63  cro is used to c
7740: 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 72 69 6e  ompare two strin
7750: 67 73 20 69 6e 20 61 20 63 61 73 65 2d 69 6e 73  gs in a case-ins
7760: 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65 72 2e  ensitive manner.
7770: 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69 67 68 74  .** It is slight
7780: 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e 20 63  ly faster than c
7790: 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 53 74  alling sqlite3St
77a0: 72 49 43 6d 70 28 29 20 64 69 72 65 63 74 6c 79  rICmp() directly
77b0: 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63 65  , but.** produce
77c0: 73 20 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a 2a  s larger code..*
77d0: 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68  *.** WARNING: Th
77e0: 69 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20  is macro is not 
77f0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
7800: 74 68 65 20 73 74 72 63 6d 70 28 29 20 66 61 6d  the strcmp() fam
7810: 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75 72  ily. It.** retur
7820: 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74  ns true if the t
7830: 77 6f 20 73 74 72 69 6e 67 73 20 61 72 65 20 65  wo strings are e
7840: 71 75 61 6c 2c 20 6f 74 68 65 72 77 69 73 65 20  qual, otherwise 
7850: 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  false..*/.#defin
7860: 65 20 53 54 52 49 43 4d 50 28 78 2c 20 79 29 20  e STRICMP(x, y) 
7870: 28 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54  (\.sqlite3UpperT
7880: 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65  oLower[*(unsigne
7890: 64 20 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d 20  d char *)(x)]== 
78a0: 20 20 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72    \.sqlite3Upper
78b0: 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e  ToLower[*(unsign
78c0: 65 64 20 63 68 61 72 20 2a 29 28 79 29 5d 20 20  ed char *)(y)]  
78d0: 20 20 20 5c 0a 26 26 20 73 71 6c 69 74 65 33 53     \.&& sqlite3S
78e0: 74 72 49 43 6d 70 28 28 78 29 2b 31 2c 28 79 29  trICmp((x)+1,(y)
78f0: 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20  +1)==0 )../*.** 
7900: 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e  Add a new column
7910: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
7920: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
7930: 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a  nstructed..**.**
7940: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
7950: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  s this routine o
7960: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  nce for each col
7970: 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  umn declaration.
7980: 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  ** in a CREATE T
7990: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
79a0: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
79b0: 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64  le() gets called
79c0: 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74  .** first to get
79d0: 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20   things going.  
79e0: 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  Then this routin
79f0: 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
7a00: 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a  each.** column..
7a10: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
7a20: 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a  ddColumn(Parse *
7a30: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
7a40: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
7a50: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
7a60: 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20  ar *z;.  Column 
7a70: 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33  *pCol;.  sqlite3
7a80: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
7a90: 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  b;.  if( (p = pP
7aa0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
7ab0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69  ==0 ) return;.#i
7ac0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  f SQLITE_MAX_COL
7ad0: 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f  UMN.  if( p->nCo
7ae0: 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  l+1>db->aLimit[S
7af0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
7b00: 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MN] ){.    sqlit
7b10: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7b20: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
7b30: 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e  umns on %s", p->
7b40: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
7b50: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rn;.  }.#endif. 
7b60: 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65   z = sqlite3Name
7b70: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
7b80: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  ame);.  if( z==0
7b90: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
7ba0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
7bb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53   i++){.    if( S
7bc0: 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f  TRICMP(z, p->aCo
7bd0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20  l[i].zName) ){. 
7be0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7bf0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75  rMsg(pParse, "du
7c00: 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e  plicate column n
7c10: 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ame: %s", z);.  
7c20: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
7c30: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
7c40: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
7c50: 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c  }.  if( (p->nCol
7c60: 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20   & 0x7)==0 ){.  
7c70: 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a    Column *aNew;.
7c80: 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
7c90: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70  e3DbRealloc(db,p
7ca0: 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b  ->aCol,(p->nCol+
7cb0: 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  8)*sizeof(p->aCo
7cc0: 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  l[0]));.    if( 
7cd0: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
7ce0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7cf0: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  b, z);.      ret
7d00: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
7d10: 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20  ->aCol = aNew;. 
7d20: 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e   }.  pCol = &p->
7d30: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20  aCol[p->nCol];. 
7d40: 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c   memset(pCol, 0,
7d50: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b   sizeof(p->aCol[
7d60: 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e  0]));.  pCol->zN
7d70: 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20  ame = z;. .  /* 
7d80: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74  If there is no t
7d90: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63  ype specified, c
7da0: 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20  olumns have the 
7db0: 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79  default affinity
7dc0: 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66  .  ** 'NONE'. If
7dd0: 20 74 68 65 72 65 20 69 73 20 61 20 74 79 70 65   there is a type
7de0: 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e   specified, then
7df0: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
7e00: 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a  nType() will.  *
7e10: 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74  * be called next
7e20: 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66   to set pCol->af
7e30: 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79  finity correctly
7e40: 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61  ..  */.  pCol->a
7e50: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
7e60: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e  _AFF_NONE;.  p->
7e70: 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nCol++;.}../*.**
7e80: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
7e90: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
7ea0: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
7eb0: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
7ec0: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
7ed0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
7ee0: 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20  .  A "NOT NULL" 
7ef0: 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a  constraint has.*
7f00: 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61  * been seen on a
7f10: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72   column.  This r
7f20: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
7f30: 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a  notNull flag on.
7f40: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75  ** the column cu
7f50: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
7f60: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
7f70: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f  oid sqlite3AddNo
7f80: 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61  tNull(Parse *pPa
7f90: 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72  rse, int onError
7fa0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
7fb0: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
7fc0: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
7fd0: 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e  =0 || NEVER(p->n
7fe0: 43 6f 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b  Col<1) ) return;
7ff0: 0a 20 20 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43  .  p->aCol[p->nC
8000: 6f 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20  ol-1].notNull = 
8010: 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a  (u8)onError;.}..
8020: 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63  /*.** Scan the c
8030: 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20  olumn type name 
8040: 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54  zType (length nT
8050: 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20  ype) and return 
8060: 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  the.** associate
8070: 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e  d affinity type.
8080: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
8090: 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d  ine does a case-
80a0: 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72  independent sear
80b0: 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20  ch of zType for 
80c0: 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e  the .** substrin
80d0: 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  gs in the follow
80e0: 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e  ing table. If on
80f0: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
8100: 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c  ngs is.** found,
8110: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
8120: 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72  ng affinity is r
8130: 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70  eturned. If zTyp
8140: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f  e contains.** mo
8150: 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74  re than one of t
8160: 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65  he substrings, e
8170: 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68  ntries toward th
8180: 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65  e top of .** the
8190: 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f   table take prio
81a0: 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c  rity. For exampl
81b0: 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27  e, if zType is '
81c0: 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51  BLOBINT', .** SQ
81d0: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
81e0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
81f0: 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20  .** Substring   
8200: 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20    | Affinity.** 
8210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8230: 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20  .** 'INT'       
8240: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49    | SQLITE_AFF_I
8250: 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27  NTEGER.** 'CHAR'
8260: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
8270: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c  _AFF_TEXT.** 'CL
8280: 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OB'        | SQL
8290: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
82a0: 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20  'TEXT'        | 
82b0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
82c0: 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20  ** 'BLOB'       
82d0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   | SQLITE_AFF_NO
82e0: 4e 45 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20  NE.** 'REAL'    
82f0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
8300: 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20  _REAL.** 'FLOA' 
8310: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
8320: 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55  AFF_REAL.** 'DOU
8330: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
8340: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a  TE_AFF_REAL.**.*
8350: 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
8360: 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74   substrings in t
8370: 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61  he above table a
8380: 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c  re found,.** SQL
8390: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
83a0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
83b0: 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69  char sqlite3Affi
83c0: 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63  nityType(const c
83d0: 68 61 72 20 2a 7a 49 6e 29 7b 0a 20 20 75 33 32  har *zIn){.  u32
83e0: 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61   h = 0;.  char a
83f0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
8400: 4e 55 4d 45 52 49 43 3b 0a 0a 20 20 69 66 28 20  NUMERIC;..  if( 
8410: 7a 49 6e 20 29 20 77 68 69 6c 65 28 20 7a 49 6e  zIn ) while( zIn
8420: 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20 28  [0] ){.    h = (
8430: 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55  h<<8) + sqlite3U
8440: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49  pperToLower[(*zI
8450: 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49  n)&0xff];.    zI
8460: 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d  n++;.    if( h==
8470: 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c  (('c'<<24)+('h'<
8480: 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72  <16)+('a'<<8)+'r
8490: 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  ') ){           
84a0: 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20    /* CHAR */.   
84b0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
84c0: 41 46 46 5f 54 45 58 54 3b 20 0a 20 20 20 20 7d  AFF_TEXT; .    }
84d0: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63  else if( h==(('c
84e0: 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29  '<<24)+('l'<<16)
84f0: 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29  +('o'<<8)+'b') )
8500: 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20  {       /* CLOB 
8510: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
8520: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
8530: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
8540: 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27  =(('t'<<24)+('e'
8550: 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27  <<16)+('x'<<8)+'
8560: 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20  t') ){       /* 
8570: 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66  TEXT */.      af
8580: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
8590: 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EXT;.    }else i
85a0: 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29  f( h==(('b'<<24)
85b0: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
85c0: 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20  <8)+'b')        
85d0: 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20    /* BLOB */.   
85e0: 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51       && (aff==SQ
85f0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
8600: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
8610: 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20  AFF_REAL) ){.   
8620: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8630: 41 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66 6e 64 65  AFF_NONE;.#ifnde
8640: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
8650: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
8660: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
8670: 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31  'r'<<24)+('e'<<1
8680: 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29  6)+('a'<<8)+'l')
8690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41            /* REA
86a0: 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  L */.        && 
86b0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
86c0: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
86d0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
86e0: 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73  F_REAL;.    }els
86f0: 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c  e if( h==(('f'<<
8700: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
8710: 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20  o'<<8)+'a')     
8720: 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a       /* FLOA */.
8730: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
8740: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
8750: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
8760: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
8770: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  L;.    }else if(
8780: 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28   h==(('d'<<24)+(
8790: 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38  'o'<<16)+('u'<<8
87a0: 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20  )+'b')          
87b0: 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20  /* DOUB */.     
87c0: 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54     && aff==SQLIT
87d0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
87e0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
87f0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65  ITE_AFF_REAL;.#e
8800: 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69  ndif.    }else i
8810: 66 28 20 28 68 26 30 78 30 30 46 46 46 46 46 46  f( (h&0x00FFFFFF
8820: 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27  )==(('i'<<16)+('
8830: 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20  n'<<8)+'t') ){  
8840: 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20    /* INT */.    
8850: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
8860: 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  FF_INTEGER;.    
8870: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8880: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 66 66   }..  return aff
8890: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
88a0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
88b0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
88c0: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
88d0: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
88e0: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
88f0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
8900: 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73   pFirst token is
8910: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f   the first.** to
8920: 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65  ken in the seque
8930: 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68  nce of tokens th
8940: 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65 20  at describe the 
8950: 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  type of the.** c
8960: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
8970: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
8980: 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74  on.   pLast is t
8990: 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a  he last token.**
89a0: 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65   in the sequence
89b0: 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f  .  Use this info
89c0: 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74  rmation to const
89d0: 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a  ruct a string.**
89e0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
89f0: 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74  he typename of t
8a00: 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74  he column and st
8a10: 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a  ore that string.
8a20: 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20  ** in zType..*/ 
8a30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
8a40: 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65  ColumnType(Parse
8a50: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
8a60: 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65  *pType){.  Table
8a70: 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *p;.  Column *p
8a80: 43 6f 6c 3b 0a 0a 20 20 70 20 3d 20 70 50 61 72  Col;..  p = pPar
8a90: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
8aa0: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56   if( p==0 || NEV
8ab0: 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20  ER(p->nCol<1) ) 
8ac0: 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d  return;.  pCol =
8ad0: 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f   &p->aCol[p->nCo
8ae0: 6c 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  l-1];.  assert( 
8af0: 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29  pCol->zType==0 )
8b00: 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20  ;.  pCol->zType 
8b10: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
8b20: 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
8b30: 62 2c 20 70 54 79 70 65 29 3b 0a 20 20 70 43 6f  b, pType);.  pCo
8b40: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
8b50: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
8b60: 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a  e(pCol->zType);.
8b70: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70  }../*.** The exp
8b80: 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64  ression is the d
8b90: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
8ba0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
8bb0: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a  ly added column.
8bc0: 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
8bd0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
8be0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a  construction..**
8bf0: 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75  .** Default valu
8c00: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75  e expressions mu
8c10: 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20  st be constant. 
8c20: 20 52 61 69 73 65 20 61 6e 20 65 78 63 65 70 74   Raise an except
8c30: 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69  ion if this.** i
8c40: 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a  s not the case..
8c50: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8c60: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
8c70: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
8c80: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
8c90: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
8ca0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
8cb0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
8cc0: 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74  qlite3AddDefault
8cd0: 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61  Value(Parse *pPa
8ce0: 72 73 65 2c 20 45 78 70 72 53 70 61 6e 20 2a 70  rse, ExprSpan *p
8cf0: 53 70 61 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Span){.  Table *
8d00: 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  p;.  Column *pCo
8d10: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  l;.  sqlite3 *db
8d20: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
8d30: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
8d40: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 21  wTable;.  if( p!
8d50: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d  =0 ){.    pCol =
8d60: 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43   &(p->aCol[p->nC
8d70: 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20  ol-1]);.    if( 
8d80: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
8d90: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
8da0: 28 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 20 29  (pSpan->pExpr) )
8db0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
8dc0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8dd0: 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f  "default value o
8de0: 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73  f column [%s] is
8df0: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a   not constant",.
8e00: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
8e10: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
8e20: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63 6f  e{.      /* A co
8e30: 70 79 20 6f 66 20 70 45 78 70 72 20 69 73 20 75  py of pExpr is u
8e40: 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74  sed instead of t
8e50: 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20  he original, as 
8e60: 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20  pExpr contains. 
8e70: 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74       ** tokens t
8e80: 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c  hat point to vol
8e90: 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 20 54 68  atile memory. Th
8ea0: 65 20 27 73 70 61 6e 27 20 6f 66 20 74 68 65 20  e 'span' of the 
8eb0: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20  expression.     
8ec0: 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 20   ** is required 
8ed0: 62 79 20 70 72 61 67 6d 61 20 74 61 62 6c 65 5f  by pragma table_
8ee0: 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  info..      */. 
8ef0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8f00: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d  Delete(db, pCol-
8f10: 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 70  >pDflt);.      p
8f20: 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c  Col->pDflt = sql
8f30: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
8f40: 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c 20 45 58  pSpan->pExpr, EX
8f50: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
8f60: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
8f70: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66  ee(db, pCol->zDf
8f80: 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  lt);.      pCol-
8f90: 3e 7a 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33  >zDflt = sqlite3
8fa0: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
8fb0: 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61  har*)pSpan->zSta
8fc0: 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt,.            
8fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fe0: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70           (int)(p
8ff0: 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70  Span->zEnd - pSp
9000: 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20  an->zStart));.  
9010: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
9020: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
9030: 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d  pSpan->pExpr);.}
9040: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74  ../*.** Designat
9050: 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  e the PRIMARY KE
9060: 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  Y for the table.
9070: 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73    pList is a lis
9080: 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f  t of names .** o
9090: 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66  f columns that f
90a0: 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20  orm the primary 
90b0: 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69  key.  If pList i
90c0: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  s NULL, then the
90d0: 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  .** most recentl
90e0: 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f  y added column o
90f0: 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74  f the table is t
9100: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a  he primary key..
9110: 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61  **.** A table ca
9120: 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f  n have at most o
9130: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  ne primary key. 
9140: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   If the table al
9150: 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70  ready has.** a p
9160: 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20  rimary key (and 
9170: 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f  this is the seco
9180: 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20  nd primary key) 
9190: 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a  then create an.*
91a0: 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  * error..**.** I
91b0: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
91c0: 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65  Y is on a single
91d0: 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61   column whose da
91e0: 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47 45  tatype is INTEGE
91f0: 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69  R,.** then we wi
9200: 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  ll try to use th
9210: 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65  at column as the
9220: 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65   rowid.  Set the
9230: 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20   Table.iPKey.** 
9240: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62  field of the tab
9250: 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
9260: 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20  ction to be the 
9270: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
9280: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
9290: 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62  KEY column.  Tab
92a0: 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20  le.iPKey is set 
92b0: 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69  to -1 if there i
92c0: 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20  s.** no INTEGER 
92d0: 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a  PRIMARY KEY..**.
92e0: 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73  ** If the key is
92f0: 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20   not an INTEGER 
9300: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
9310: 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  n create a uniqu
9320: 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74  e.** index for t
9330: 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65  he key.  No inde
9340: 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72  x is created for
9350: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
9360: 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   KEYs..*/.void s
9370: 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79  qlite3AddPrimary
9380: 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Key(.  Parse *pP
9390: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
93a0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
93b0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
93c0: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69  ,  /* List of fi
93d0: 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20  eld names to be 
93e0: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
93f0: 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
9400: 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
9410: 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63  h a uniqueness c
9420: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74  onflict */.  int
9430: 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f   autoInc,      /
9440: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41 55  * True if the AU
9450: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77  TOINCREMENT keyw
9460: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
9470: 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
9480: 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  r     /* SQLITE_
9490: 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45  SO_ASC or SQLITE
94a0: 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20  _SO_DESC */.){. 
94b0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
94c0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
94d0: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20  ;.  char *zType 
94e0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20  = 0;.  int iCol 
94f0: 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70  = -1, i;.  if( p
9500: 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43  Tab==0 || IN_DEC
9510: 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f  LARE_VTAB ) goto
9520: 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69   primary_key_exi
9530: 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74  t;.  if( pTab->t
9540: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73  abFlags & TF_Has
9550: 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20  PrimaryKey ){.  
9560: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9570: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
9580: 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68   "table \"%s\" h
9590: 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
95a0: 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70   primary key", p
95b0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
95c0: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
95d0: 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54  y_exit;.  }.  pT
95e0: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
95f0: 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79  TF_HasPrimaryKey
9600: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
9610: 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
9620: 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20  Tab->nCol - 1;. 
9630: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43     pTab->aCol[iC
9640: 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20  ol].isPrimKey = 
9650: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
9660: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
9670: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
9680: 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b       for(iCol=0;
9690: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
96a0: 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
96b0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
96c0: 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
96d0: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61  ].zName, pTab->a
96e0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29  Col[iCol].zName)
96f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
9700: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
9710: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
9720: 69 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  if( iCol<pTab->n
9730: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Col ){.        p
9740: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
9750: 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20  isPrimKey = 1;. 
9760: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9770: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70   if( pList->nExp
9780: 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b  r>1 ) iCol = -1;
9790: 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e  .  }.  if( iCol>
97a0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
97b0: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79  >nCol ){.    zTy
97c0: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
97d0: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d  iCol].zType;.  }
97e0: 0a 20 20 69 66 28 20 7a 54 79 70 65 20 26 26 20  .  if( zType && 
97f0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
9800: 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29  Type, "INTEGER")
9810: 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 73  ==0.        && s
9820: 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45  ortOrder==SQLITE
9830: 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 70  _SO_ASC ){.    p
9840: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f  Tab->iPKey = iCo
9850: 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79  l;.    pTab->key
9860: 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72  Conf = (u8)onErr
9870: 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  or;.    assert( 
9880: 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75  autoInc==0 || au
9890: 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20  toInc==1 );.    
98a0: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
98b0: 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74  = autoInc*TF_Aut
98c0: 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 7d 65  oincrement;.  }e
98d0: 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20  lse if( autoInc 
98e0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
98f0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
9900: 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33  MENT.    sqlite3
9910: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9920: 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20   "AUTOINCREMENT 
9930: 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20  is only allowed 
9940: 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22  on an ".       "
9950: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
9960: 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  KEY");.#endif.  
9970: 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65 78  }else{.    Index
9980: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c   *p;.    p = sql
9990: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
99a0: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c  pParse, 0, 0, 0,
99b0: 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c   pList, onError,
99c0: 20 30 2c 20 30 2c 20 73 6f 72 74 4f 72 64 65 72   0, 0, sortOrder
99d0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 20  , 0);.    if( p 
99e0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  ){.      p->auto
99f0: 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20 20 20 7d  Index = 2;.    }
9a00: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a  .    pList = 0;.
9a10: 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79    }..primary_key
9a20: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
9a30: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
9a40: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74  Parse->db, pList
9a50: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
9a60: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
9a70: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
9a80: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
9a90: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
9aa0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
9ab0: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 68  oid sqlite3AddCh
9ac0: 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  eckConstraint(. 
9ad0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9ae0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
9af0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
9b00: 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20  *pCheckExpr  /* 
9b10: 54 68 65 20 63 68 65 63 6b 20 65 78 70 72 65 73  The check expres
9b20: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  sion */.){.  sql
9b30: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9b40: 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53  e->db;.#ifndef S
9b50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
9b60: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
9b70: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
9b80: 6c 65 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26  le;.  if( pTab &
9b90: 26 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  & !IN_DECLARE_VT
9ba0: 41 42 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  AB ){.    pTab->
9bb0: 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33  pCheck = sqlite3
9bc0: 45 78 70 72 41 6e 64 28 64 62 2c 20 70 54 61 62  ExprAnd(db, pTab
9bd0: 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68 65 63 6b  ->pCheck, pCheck
9be0: 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  Expr);.  }else.#
9bf0: 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71  endif.  {.    sq
9c00: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
9c10: 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b  db, pCheckExpr);
9c20: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
9c30: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  t the collation 
9c40: 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  function of the 
9c50: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61  most recently pa
9c60: 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d  rsed table colum
9c70: 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c  n.** to the Coll
9c80: 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f  Seq given..*/.vo
9c90: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
9ca0: 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a  lateType(Parse *
9cb0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
9cc0: 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20  Token){.  Table 
9cd0: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
9ce0: 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20  har *zColl;     
9cf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75           /* Dequ
9d00: 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c  oted name of col
9d10: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
9d20: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
9d30: 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  ;..  if( (p = pP
9d40: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
9d50: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
9d60: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
9d70: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
9d80: 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  ;.  zColl = sqli
9d90: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
9da0: 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  (db, pToken);.  
9db0: 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74  if( !zColl ) ret
9dc0: 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  urn;..  if( sqli
9dd0: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
9de0: 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20  (pParse, zColl) 
9df0: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
9e00: 64 78 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b  dx;.    p->aCol[
9e10: 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c  i].zColl = zColl
9e20: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  ;.  .    /* If t
9e30: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63  he column is dec
9e40: 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e  lared as "<name>
9e50: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c   PRIMARY KEY COL
9e60: 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20  LATE <type>",.  
9e70: 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64    ** then an ind
9e80: 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ex may have been
9e90: 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73   created on this
9ea0: 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74   column before t
9eb0: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74  he.    ** collat
9ec0: 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64  ion type was add
9ed0: 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73  ed. Correct this
9ee0: 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61   if it is the ca
9ef0: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  se..    */.    f
9f00: 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65  or(pIdx=p->pInde
9f10: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
9f20: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
9f30: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
9f40: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
9f50: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
9f60: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a  Column[0]==i ){.
9f70: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
9f80: 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f  Coll[0] = p->aCo
9f90: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[i].zColl;.    
9fa0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
9fb0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  e{.    sqlite3Db
9fc0: 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
9fd0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
9fe0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
9ff0: 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  rns the collatio
a000: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64  n sequence for d
a010: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74  atabase native t
a020: 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20  ext.** encoding 
a030: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
a040: 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20  e string zName, 
a050: 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a  length nName..**
a060: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
a070: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  sted collation s
a080: 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61  equence is not a
a090: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74  vailable, or not
a0a0: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e   available.** in
a0b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
a0c0: 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74  tive encoding, t
a0d0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
a0e0: 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20  tory is invoked 
a0f0: 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74  to.** request it
a100: 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  . If the collati
a110: 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20  on factory does 
a120: 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20  not supply such 
a130: 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61  a sequence,.** a
a140: 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  nd the sequence 
a150: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
a160: 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63  another text enc
a170: 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74  oding, then that
a180: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
a190: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
a1a0: 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66  f no versions of
a1b0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
a1c0: 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e  ollations sequen
a1d0: 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ce are available
a1e0: 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20  , or.** another 
a1f0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
a200: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
a210: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nd an error mess
a220: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
a230: 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a  .** pParse..**.*
a240: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
a250: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
a260: 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  nd sqlite3FindCo
a270: 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20 72  llSeq().  This r
a280: 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65  outine.** invoke
a290: 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
a2a0: 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e  factory if the n
a2b0: 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63  amed collation c
a2c0: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a  annot be found.*
a2d0: 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20  * and generates 
a2e0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
a2f0: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
a300: 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  : sqlite3FindCol
a310: 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33 47  lSeq(), sqlite3G
a320: 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43  etCollSeq().*/.C
a330: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c  ollSeq *sqlite3L
a340: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72  ocateCollSeq(Par
a350: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
a360: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
a370: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
a380: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38  pParse->db;.  u8
a390: 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a   enc = ENC(db);.
a3a0: 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20    u8 initbusy = 
a3b0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20  db->init.busy;. 
a3c0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
a3d0: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
a3e0: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
a3f0: 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69  b, enc, zName, i
a400: 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20  nitbusy);.  if( 
a410: 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70  !initbusy && (!p
a420: 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e  Coll || !pColl->
a430: 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f  xCmp) ){.    pCo
a440: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43  ll = sqlite3GetC
a450: 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20  ollSeq(db, enc, 
a460: 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20  pColl, zName);. 
a470: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
a480: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
a490: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
a4a0: 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f  no such collatio
a4b0: 6e 20 73 65 71 75 65 6e 63 65 3a 20 25 73 22 2c  n sequence: %s",
a4c0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   zName);.    }. 
a4d0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f   }..  return pCo
a4e0: 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  ll;.}.../*.** Ge
a4f0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
a500: 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20   will increment 
a510: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
a520: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68  e..**.** The sch
a530: 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73  ema cookie is us
a540: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
a550: 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20  when the schema 
a560: 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  for the.** datab
a570: 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66  ase changes.  Af
a580: 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61 20  ter each schema 
a590: 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b  change, the cook
a5a0: 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e  ie value.** chan
a5b0: 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f  ges.  When a pro
a5c0: 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64 73  cess first reads
a5d0: 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20 72   the schema it r
a5e0: 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f  ecords the.** co
a5f0: 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74 65  okie.  Thereafte
a600: 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20 67  r, whenever it g
a610: 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68  oes to access th
a620: 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69  e database,.** i
a630: 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f  t checks the coo
a640: 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  kie to make sure
a650: 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20   the schema has 
a660: 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73  not changed.** s
a670: 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74  ince it was last
a680: 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   read..**.** Thi
a690: 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f  s plan is not co
a6a0: 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d  mpletely bullet-
a6b0: 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f  proof.  It is po
a6c0: 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68  ssible for.** th
a6d0: 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e  e schema to chan
a6e0: 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ge multiple time
a6f0: 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f  s and for the co
a700: 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65  okie to be.** se
a710: 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20  t back to prior 
a720: 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65  value.  But sche
a730: 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 69  ma changes are i
a740: 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64  nfrequent.** and
a750: 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
a760: 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65 20   of hitting the 
a770: 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75  same cookie valu
a780: 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63  e is only.** 1 c
a790: 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20  hance in 2^32.  
a7a0: 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65 6e  So we're safe en
a7b0: 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ough..*/.void sq
a7c0: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
a7d0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
a7e0: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74   int iDb){.  int
a7f0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
a800: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
a810: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
a820: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
a830: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
a840: 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
a850: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
a860: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
a870: 2c 20 30 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  , 0) );.  sqlite
a880: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a890: 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61  P_Integer, db->a
a8a0: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
a8b0: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31  >schema_cookie+1
a8c0: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
a8d0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
a8e0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
a8f0: 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45   BTREE_SCHEMA_VE
a900: 52 53 49 4f 4e 2c 20 72 31 29 3b 0a 20 20 73 71  RSION, r1);.  sq
a910: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
a920: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
a930: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72  .}../*.** Measur
a940: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
a950: 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65  characters neede
a960: 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  d to output the 
a970: 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66  given.** identif
a980: 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ier.  The number
a990: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
a9a0: 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73  es any quotes us
a9b0: 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e  ed.** but does n
a9c0: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  ot include the n
a9d0: 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ull terminator..
a9e0: 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61  **.** The estima
a9f0: 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69  te is conservati
aa00: 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65  ve.  It might be
aa10: 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61   larger that wha
aa20: 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e  t is.** really n
aa30: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
aa40: 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68   int identLength
aa50: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
aa60: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28  .  int n;.  for(
aa70: 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b  n=0; *z; n++, z+
aa80: 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
aa90: 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20  '"' ){ n++; }.  
aaa0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32  }.  return n + 2
aab0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
aac0: 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 69  irst parameter i
aad0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
aae0: 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  n output buffer.
aaf0: 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   The second .** 
ab00: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
ab10: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74  ointer to an int
ab20: 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69  eger that contai
ab30: 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20 61 74  ns the offset at
ab40: 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72 69  .** which to wri
ab50: 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  te into the outp
ab60: 75 74 20 62 75 66 66 65 72 2e 20 54 68 69 73 20  ut buffer. This 
ab70: 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73 20  function copies 
ab80: 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  the.** nul-termi
ab90: 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f 69  nated string poi
aba0: 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 74  nted to by the t
abb0: 68 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c 20  hird parameter, 
abc0: 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a  zSignedIdent,.**
abd0: 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
abe0: 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  d offset in the 
abf0: 62 75 66 66 65 72 20 61 6e 64 20 75 70 64 61 74  buffer and updat
ac00: 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66 65  es *pIdx to refe
ac10: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73  r.** to the firs
ac20: 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68 65  t byte after the
ac30: 20 6c 61 73 74 20 62 79 74 65 20 77 72 69 74 74   last byte writt
ac40: 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  en before return
ac50: 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  ing..** .** If t
ac60: 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e 65  he string zSigne
ac70: 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73 20  dIdent consists 
ac80: 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70 68  entirely of alph
ac90: 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61  a-numeric.** cha
aca0: 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e 6f  racters, does no
acb0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 64  t begin with a d
acc0: 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74 20  igit and is not 
acd0: 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c 0a  an SQL keyword,.
ace0: 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f  ** then it is co
acf0: 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70  pied to the outp
ad00: 75 74 20 62 75 66 66 65 72 20 65 78 61 63 74 6c  ut buffer exactl
ad10: 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68 65  y as it is. Othe
ad20: 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20  rwise,.** it is 
ad30: 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f 75  quoted using dou
ad40: 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73  ble-quotes..*/.s
ad50: 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74  tatic void ident
ad60: 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74  Put(char *z, int
ad70: 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53   *pIdx, char *zS
ad80: 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75  ignedIdent){.  u
ad90: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
ada0: 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  dent = (unsigned
adb0: 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64   char*)zSignedId
adc0: 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  ent;.  int i, j,
add0: 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20   needQuote;.  i 
ade0: 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72 28  = *pIdx;..  for(
adf0: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
ae00: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73  j++){.    if( !s
ae10: 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 49  qlite3Isalnum(zI
ae20: 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65  dent[j]) && zIde
ae30: 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65  nt[j]!='_' ) bre
ae40: 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75  ak;.  }.  needQu
ae50: 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73 64  ote = sqlite3Isd
ae60: 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 20  igit(zIdent[0]) 
ae70: 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72  || sqlite3Keywor
ae80: 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29  dCode(zIdent, j)
ae90: 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20 21  !=TK_ID;.  if( !
aea0: 6e 65 65 64 51 75 6f 74 65 20 29 7b 0a 20 20 20  needQuote ){.   
aeb0: 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 7a 49 64   needQuote = zId
aec0: 65 6e 74 5b 6a 5d 3b 0a 20 20 7d 0a 0a 20 20 69  ent[j];.  }..  i
aed0: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
aee0: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66  [i++] = '"';.  f
aef0: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
af00: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69  ]; j++){.    z[i
af10: 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b  ++] = zIdent[j];
af20: 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b  .    if( zIdent[
af30: 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d  j]=='"' ) z[i++]
af40: 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66   = '"';.  }.  if
af50: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
af60: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b  i++] = '"';.  z[
af70: 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20  i] = 0;.  *pIdx 
af80: 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = i;.}../*.** Ge
af90: 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20  nerate a CREATE 
afa0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
afb0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
afc0: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62  the given.** tab
afd0: 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68  le.  Memory to h
afe0: 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20  old the text of 
aff0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
b000: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f   obtained.** fro
b010: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
b020: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
b030: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
b040: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  g function..*/.s
b050: 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61  tatic char *crea
b060: 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c 69  teTableStmt(sqli
b070: 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  te3 *db, Table *
b080: 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20  p){.  int i, k, 
b090: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  n;.  char *zStmt
b0a0: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20  ;.  char *zSep, 
b0b0: 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20  *zSep2, *zEnd;. 
b0c0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
b0d0: 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   n = 0;.  for(pC
b0e0: 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d  ol = p->aCol, i=
b0f0: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
b100: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
b110: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
b120: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20  (pCol->zName) + 
b130: 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64  5;.  }.  n += id
b140: 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61  entLength(p->zNa
b150: 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20  me);.  if( n<50 
b160: 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  ){ .    zSep = "
b170: 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22  ";.    zSep2 = "
b180: 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22  ,";.    zEnd = "
b190: 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  )";.  }else{.   
b1a0: 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a   zSep = "\n  ";.
b1b0: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e      zSep2 = ",\n
b1c0: 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20    ";.    zEnd = 
b1d0: 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b  "\n)";.  }.  n +
b1e0: 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c  = 35 + 6*p->nCol
b1f0: 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69  ;.  zStmt = sqli
b200: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30  te3DbMallocRaw(0
b210: 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d  , n);.  if( zStm
b220: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  t==0 ){.    db->
b230: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
b240: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
b250: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e    }.  sqlite3_sn
b260: 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c  printf(n, zStmt,
b270: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22   "CREATE TABLE "
b280: 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65 33  );.  k = sqlite3
b290: 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b  Strlen30(zStmt);
b2a0: 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d  .  identPut(zStm
b2b0: 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29  t, &k, p->zName)
b2c0: 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d  ;.  zStmt[k++] =
b2d0: 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c   '(';.  for(pCol
b2e0: 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69  =p->aCol, i=0; i
b2f0: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
b300: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74  Col++){.    stat
b310: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  ic const char * 
b320: 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d  const azType[] =
b330: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51   {.        /* SQ
b340: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20  LITE_AFF_TEXT   
b350: 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20 20 20   */ " TEXT",.   
b360: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
b370: 46 46 5f 4e 4f 4e 45 20 20 20 20 2a 2f 20 22 22  FF_NONE    */ ""
b380: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
b390: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
b3a0: 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20  */ " NUM",.     
b3b0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
b3c0: 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20 49 4e  _INTEGER */ " IN
b3d0: 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  T",.        /* S
b3e0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20  QLITE_AFF_REAL  
b3f0: 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20 20    */ " REAL".   
b400: 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b   };.    int len;
b410: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
b420: 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c  *zType;..    sql
b430: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d  ite3_snprintf(n-
b440: 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53  k, &zStmt[k], zS
b450: 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71  ep);.    k += sq
b460: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a  lite3Strlen30(&z
b470: 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53  Stmt[k]);.    zS
b480: 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20  ep = zSep2;.    
b490: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
b4a0: 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  &k, pCol->zName)
b4b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
b4c0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c  ol->affinity-SQL
b4d0: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 3e 3d 20  ITE_AFF_TEXT >= 
b4e0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
b4f0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d   pCol->affinity-
b500: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
b510: 3c 20 41 72 72 61 79 53 69 7a 65 28 61 7a 54 79  < ArraySize(azTy
b520: 70 65 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63  pe) );.    testc
b530: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
b540: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
b550: 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65 73 74  TEXT );.    test
b560: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
b570: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
b580: 5f 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 74 65 73  _NONE );.    tes
b590: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
b5a0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
b5b0: 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20  F_NUMERIC );.   
b5c0: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
b5d0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
b5e0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
b5f0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
b600: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
b610: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29  QLITE_AFF_REAL )
b620: 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79 70 65  ;.    .    zType
b630: 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e   = azType[pCol->
b640: 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c 49 54  affinity - SQLIT
b650: 45 5f 41 46 46 5f 54 45 58 54 5d 3b 0a 20 20 20  E_AFF_TEXT];.   
b660: 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74   len = sqlite3St
b670: 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20  rlen30(zType);. 
b680: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
b690: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
b6a0: 45 5f 41 46 46 5f 4e 4f 4e 45 20 0a 20 20 20 20  E_AFF_NONE .    
b6b0: 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c 2d          || pCol-
b6c0: 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74  >affinity==sqlit
b6d0: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a  e3AffinityType(z
b6e0: 54 79 70 65 29 20 29 3b 0a 20 20 20 20 6d 65 6d  Type) );.    mem
b6f0: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
b700: 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  Type, len);.    
b710: 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73  k += len;.    as
b720: 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20  sert( k<=n );.  
b730: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  }.  sqlite3_snpr
b740: 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74  intf(n-k, &zStmt
b750: 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29  [k], "%s", zEnd)
b760: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74  ;.  return zStmt
b770: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
b780: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
b790: 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20  d to report the 
b7a0: 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74  final ")" that t
b7b0: 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43  erminates.** a C
b7c0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
b7d0: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
b7e0: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
b7f0: 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69   that other acti
b800: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65  on routines have
b810: 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a   been building.*
b820: 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  * is added to th
b830: 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  e internal hash 
b840: 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67  tables, assuming
b850: 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a   no errors have.
b860: 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a  ** occurred..**.
b870: 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20  ** An entry for 
b880: 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64  the table is mad
b890: 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20  e in the master 
b8a0: 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75  table on disk, u
b8b0: 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73  nless.** this is
b8c0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
b8d0: 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62  le or db->init.b
b8e0: 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62  usy==1.  When db
b8f0: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a  ->init.busy==1.*
b900: 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  * it means we ar
b910: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  e reading the sq
b920: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
b930: 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  e because we jus
b940: 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74  t.** connected t
b950: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  o the database o
b960: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71  r because the sq
b970: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
b980: 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c  e has.** recentl
b990: 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68  y changed, so th
b9a0: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73  e entry for this
b9b0: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
b9c0: 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20  xists in.** the 
b9d0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
b9e0: 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  ble.  We do not 
b9f0: 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69  want to create i
ba00: 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49  t again..**.** I
ba10: 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72  f the pSelect ar
ba20: 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
ba30: 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  LL, it means tha
ba40: 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
ba50: 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  * was called to 
ba60: 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67  create a table g
ba70: 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20  enerated from a 
ba80: 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c  .** "CREATE TABL
ba90: 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20  E ... AS SELECT 
baa0: 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20  ..." statement. 
bab0: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   The column name
bac0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  s of.** the new 
bad0: 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68  table will match
bae0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
baf0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  of the SELECT..*
bb00: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e  /.void sqlite3En
bb10: 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  dTable(.  Parse 
bb20: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
bb30: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
bb40: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
bb50: 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20  Cons,           
bb60: 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e  /* The ',' token
bb70: 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20   after the last 
bb80: 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a  column defn. */.
bb90: 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20    Token *pEnd,  
bba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
bbb0: 20 66 69 6e 61 6c 20 27 29 27 20 74 6f 6b 65 6e   final ')' token
bbc0: 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
bbd0: 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ABLE */.  Select
bbe0: 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20   *pSelect       
bbf0: 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d    /* Select from
bc00: 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41   a "CREATE ... A
bc10: 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a  S SELECT" */.){.
bc20: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71    Table *p;.  sq
bc30: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
bc40: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
bc50: 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d  b;..  if( (pEnd=
bc60: 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30  =0 && pSelect==0
bc70: 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ) || db->mallocF
bc80: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
bc90: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 70  urn;.  }.  p = p
bca0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
bcb0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
bcc0: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
bcd0: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
bce0: 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a   || !pSelect );.
bcf0: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
bd00: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
bd10: 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a  , p->pSchema);..
bd20: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
bd30: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52  MIT_CHECK.  /* R
bd40: 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20  esolve names in 
bd50: 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  all CHECK constr
bd60: 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73  aint expressions
bd70: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
bd80: 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 53 72  pCheck ){.    Sr
bd90: 63 4c 69 73 74 20 73 53 72 63 3b 20 20 20 20 20  cList sSrc;     
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bdb0: 20 46 61 6b 65 20 53 72 63 4c 69 73 74 20 66 6f   Fake SrcList fo
bdc0: 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  r pParse->pNewTa
bdd0: 62 6c 65 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43  ble */.    NameC
bde0: 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20  ontext sNC;     
bdf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
be00: 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
be10: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
be20: 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28   */..    memset(
be30: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
be40: 73 4e 43 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  sNC));.    memse
be50: 74 28 26 73 53 72 63 2c 20 30 2c 20 73 69 7a 65  t(&sSrc, 0, size
be60: 6f 66 28 73 53 72 63 29 29 3b 0a 20 20 20 20 73  of(sSrc));.    s
be70: 53 72 63 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20  Src.nSrc = 1;.  
be80: 20 20 73 53 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d    sSrc.a[0].zNam
be90: 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  e = p->zName;.  
bea0: 20 20 73 53 72 63 2e 61 5b 30 5d 2e 70 54 61 62    sSrc.a[0].pTab
beb0: 20 3d 20 70 3b 0a 20 20 20 20 73 53 72 63 2e 61   = p;.    sSrc.a
bec0: 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31  [0].iCursor = -1
bed0: 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65  ;.    sNC.pParse
bee0: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73   = pParse;.    s
bef0: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 26 73  NC.pSrcList = &s
bf00: 53 72 63 3b 0a 20 20 20 20 73 4e 43 2e 69 73 43  Src;.    sNC.isC
bf10: 68 65 63 6b 20 3d 20 31 3b 0a 20 20 20 20 69 66  heck = 1;.    if
bf20: 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  ( sqlite3Resolve
bf30: 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20  ExprNames(&sNC, 
bf40: 70 2d 3e 70 43 68 65 63 6b 29 20 29 7b 0a 20 20  p->pCheck) ){.  
bf50: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
bf60: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
bf70: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
bf80: 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a  OMIT_CHECK) */..
bf90: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
bfa0: 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69  init.busy is 1 i
bfb0: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
bfc0: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
bfd0: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
bfe0: 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22  ite_master" or "
bff0: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
c000: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
c010: 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64   disk..  ** So d
c020: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
c030: 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20  he disk again.  
c040: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
c050: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
c060: 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
c070: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69  from the db->ini
c080: 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  t.newTnum field.
c090: 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62    (The page numb
c0a0: 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  er.  ** should h
c0b0: 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65  ave been put the
c0c0: 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  re by the sqlite
c0d0: 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29  OpenCb routine.)
c0e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
c0f0: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
c100: 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69   p->tnum = db->i
c110: 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d  nit.newTnum;.  }
c120: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e  ..  /* If not in
c130: 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e  itializing, then
c140: 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64   create a record
c150: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
c160: 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53  le.  ** in the S
c170: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
c180: 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  le of the databa
c190: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  se..  **.  ** If
c1a0: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f   this is a TEMPO
c1b0: 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74  RARY table, writ
c1c0: 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f  e the entry into
c1d0: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20   the auxiliary. 
c1e0: 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64   ** file instead
c1f0: 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   of into the mai
c200: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
c210: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
c220: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
c230: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62    int n;.    Vdb
c240: 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a  e *v;.    char *
c250: 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69  zType;    /* "vi
c260: 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a  ew" or "table" *
c270: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  /.    char *zTyp
c280: 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20  e2;   /* "VIEW" 
c290: 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20  or "TABLE" */.  
c2a0: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20    char *zStmt;  
c2b0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
c2c0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72   CREATE TABLE or
c2d0: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
c2e0: 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76  tement */..    v
c2f0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
c300: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
c310: 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
c320: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71   return;..    sq
c330: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
c340: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b  v, OP_Close, 0);
c350: 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a  ..    /* .    **
c360: 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70   Initialize zTyp
c370: 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69  e for the new vi
c380: 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20  ew or table..   
c390: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
c3a0: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
c3b0: 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20     /* A regular 
c3c0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a  table */.      z
c3d0: 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a  Type = "table";.
c3e0: 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22        zType2 = "
c3f0: 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20  TABLE";.#ifndef 
c400: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
c410: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c420: 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20    /* A view */. 
c430: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69       zType = "vi
c440: 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  ew";.      zType
c450: 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64  2 = "VIEW";.#end
c460: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
c470: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52   If this is a CR
c480: 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53  EATE TABLE xx AS
c490: 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65   SELECT ..., exe
c4a0: 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a  cute the SELECT.
c4b0: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
c4c0: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65   to populate the
c4d0: 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20   new table. The 
c4e0: 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
c4f0: 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20   for the.    ** 
c500: 6e 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20  new table is in 
c510: 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d  register pParse-
c520: 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a  >regRoot..    **
c530: 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65  .    ** Once the
c540: 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e   SELECT has been
c550: 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65   coded by sqlite
c560: 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73  3Select(), it is
c570: 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69   in a.    ** sui
c580: 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71  table state to q
c590: 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  uery for the col
c5a0: 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79  umn names and ty
c5b0: 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20  pes to be used. 
c5c0: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77     ** by the new
c5d0: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20   table..    **. 
c5e0: 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63     ** A shared-c
c5f0: 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ache write-lock 
c600: 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
c610: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
c620: 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a  new table,.    *
c630: 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f  * as a schema-lo
c640: 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ck must have alr
c650: 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e  eady been obtain
c660: 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e  ed to create it.
c670: 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20   Since.    ** a 
c680: 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c  schema-lock excl
c690: 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64  udes all other d
c6a0: 61 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74  atabase users, t
c6b0: 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f  he write-lock wo
c6c0: 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65  uld.    ** be re
c6d0: 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a  dundant..    */.
c6e0: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
c6f0: 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  ){.      SelectD
c700: 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20  est dest;.      
c710: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a  Table *pSelTab;.
c720: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
c730: 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a  arse->nTab==1);.
c740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c750: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
c760: 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50 61 72  enWrite, 1, pPar
c770: 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62  se->regRoot, iDb
c780: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c790: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
c7a0: 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  1);.      pParse
c7b0: 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20  ->nTab = 2;.    
c7c0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
c7d0: 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
c7e0: 52 54 5f 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20  RT_Table, 1);.  
c7f0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
c800: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
c810: 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  t, &dest);.     
c820: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c830: 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
c840: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  1);.      if( pP
c850: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b  arse->nErr==0 ){
c860: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
c870: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
c880: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
c890: 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  se, pSelect);.  
c8a0: 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61        if( pSelTa
c8b0: 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  b==0 ) return;. 
c8c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
c8d0: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
c8e0: 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70       p->nCol = p
c8f0: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
c900: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20        p->aCol = 
c910: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
c920: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e         pSelTab->
c930: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
c940: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
c950: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
c960: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
c970: 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  db, pSelTab);.  
c980: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
c990: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
c9a0: 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
c9b0: 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74   the CREATE stat
c9c0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28  ement */.    if(
c9d0: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
c9e0: 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65    zStmt = create
c9f0: 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 29  TableStmt(db, p)
ca00: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ca10: 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e     n = (int)(pEn
ca20: 64 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73  d->z - pParse->s
ca30: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31  NameToken.z) + 1
ca40: 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  ;.      zStmt = 
ca50: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
ca60: 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 43  b, .          "C
ca70: 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20  REATE %s %.*s", 
ca80: 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73  zType2, n, pPars
ca90: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a  e->sNameToken.z.
caa0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
cab0: 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f      /* A slot fo
cac0: 72 20 74 68 65 20 72 65 63 6f 72 64 20 68 61 73  r the record has
cad0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
cae0: 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a  located in the .
caf0: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41      ** SQLITE_MA
cb00: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20  STER table.  We 
cb10: 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64  just need to upd
cb20: 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69  ate that slot wi
cb30: 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68  th all.    ** th
cb40: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65  e information we
cb50: 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 0a 20  've collected.. 
cb60: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
cb70: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
cb80: 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41  rse,.      "UPDA
cb90: 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20  TE %Q.%s ".     
cba0: 20 20 20 20 22 53 45 54 20 74 79 70 65 3d 27 25      "SET type='%
cbb0: 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c  s', name=%Q, tbl
cbc0: 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61  _name=%Q, rootpa
cbd0: 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20 22  ge=#%d, sql=%Q "
cbe0: 0a 20 20 20 20 20 20 20 22 57 48 45 52 45 20 72  .       "WHERE r
cbf0: 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20 20 20  owid=#%d",.     
cc00: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
cc10: 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
cc20: 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 7a 54  E(iDb),.      zT
cc30: 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e  ype,.      p->zN
cc40: 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e  ame,.      p->zN
cc50: 61 6d 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73  ame,.      pPars
cc60: 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20  e->regRoot,.    
cc70: 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70    zStmt,.      p
cc80: 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a  Parse->regRowid.
cc90: 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
cca0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74  e3DbFree(db, zSt
ccb0: 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mt);.    sqlite3
ccc0: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
ccd0: 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  rse, iDb);..#ifn
cce0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ccf0: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
cd00: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
cd10: 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
cd20: 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65  create an sqlite
cd30: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
cd40: 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69  for.    ** keepi
cd50: 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f  ng track of auto
cd60: 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a  increment keys..
cd70: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
cd80: 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
cd90: 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b  Autoincrement ){
cda0: 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d  .      Db *pDb =
cdb0: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
cdc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
cdd0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
cde0: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
cdf0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44   );.      if( pD
ce00: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71  b->pSchema->pSeq
ce10: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
ce20: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
ce30: 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
ce40: 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
ce50: 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73  ABLE %Q.sqlite_s
ce60: 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71  equence(name,seq
ce70: 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44  )",.          pD
ce80: 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20  b->zName.       
ce90: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
cea0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
ceb0: 20 52 65 70 61 72 73 65 20 65 76 65 72 79 74 68   Reparse everyth
cec0: 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75  ing to update ou
ced0: 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20  r internal data 
cee0: 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20  structures */.  
cef0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cf00: 4f 70 34 28 76 2c 20 4f 50 5f 50 61 72 73 65 53  Op4(v, OP_ParseS
cf10: 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30  chema, iDb, 0, 0
cf20: 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ,.        sqlite
cf30: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 74 62  3MPrintf(db, "tb
cf40: 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70 2d 3e  l_name='%q'",p->
cf50: 7a 4e 61 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d  zName), P4_DYNAM
cf60: 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  IC);.  }...  /* 
cf70: 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f  Add the table to
cf80: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
cf90: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
cfa0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
cfb0: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
cfc0: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 54  it.busy ){.    T
cfd0: 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20  able *pOld;.    
cfe0: 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20  Schema *pSchema 
cff0: 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  = p->pSchema;.  
d000: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d010: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
d020: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
d030: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
d040: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 53  e3HashInsert(&pS
d050: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
d060: 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  p->zName,.      
d070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d080: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
d090: 72 6c 65 6e 33 30 28 70 2d 3e 7a 4e 61 6d 65 29  rlen30(p->zName)
d0a0: 2c 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  ,p);.    if( pOl
d0b0: 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  d ){.      asser
d0c0: 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f  t( p==pOld );  /
d0d0: 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
d0e0: 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65  ve failed inside
d0f0: 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f   HashInsert() */
d100: 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  .      db->mallo
d110: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
d120: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
d130: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  .    pParse->pNe
d140: 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  wTable = 0;.    
d150: 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20  db->nTable++;.  
d160: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
d170: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
d180: 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ges;..#ifndef SQ
d190: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54  LITE_OMIT_ALTERT
d1a0: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d  ABLE.    if( !p-
d1b0: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
d1c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
d1d0: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
d1e0: 72 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d  r *)pParse->sNam
d1f0: 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20  eToken.z;.      
d200: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20  int nName;.     
d210: 20 61 73 73 65 72 74 28 20 21 70 53 65 6c 65 63   assert( !pSelec
d220: 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45  t && pCons && pE
d230: 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nd );.      if( 
d240: 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  pCons->z==0 ){. 
d250: 20 20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70         pCons = p
d260: 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  End;.      }.   
d270: 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29     nName = (int)
d280: 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70  ((const char *)p
d290: 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29  Cons->z - zName)
d2a0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f  ;.      p->addCo
d2b0: 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73  lOffset = 13 + s
d2c0: 71 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65  qlite3Utf8CharLe
d2d0: 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  n(zName, nName);
d2e0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
d2f0: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
d300: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
d310: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
d320: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
d330: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72  e in order to cr
d340: 65 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a  eate a new VIEW.
d350: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
d360: 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72  reateView(.  Par
d370: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d380: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
d390: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
d3a0: 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f  n *pBegin,     /
d3b0: 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
d3c0: 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74  en that begins t
d3d0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
d3e0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
d3f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
d400: 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
d410: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
d420: 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
d430: 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame2,     /* The
d440: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
d450: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
d460: 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65  e view */.  Sele
d470: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f  ct *pSelect,   /
d480: 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65  * A SELECT state
d490: 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62  ment that will b
d4a0: 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69  ecome the new vi
d4b0: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
d4c0: 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 52  mp,        /* TR
d4d0: 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41  UE for a TEMPORA
d4e0: 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  RY view */.  int
d4f0: 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20 20   noErr          
d500: 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72 72 6f  /* Suppress erro
d510: 72 20 6d 65 73 73 61 67 65 73 20 69 66 20 56 49  r messages if VI
d520: 45 57 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  EW already exist
d530: 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  s */.){.  Table 
d540: 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63  *p;.  int n;.  c
d550: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
d560: 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62  Token sEnd;.  Db
d570: 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f  Fixer sFix;.  To
d580: 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 6e  ken *pName;.  in
d590: 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33  t iDb;.  sqlite3
d5a0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d5b0: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
d5c0: 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20  ->nVar>0 ){.    
d5d0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
d5e0: 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74  pParse, "paramet
d5f0: 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f  ers are not allo
d600: 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a  wed in views");.
d610: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
d620: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
d630: 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
d640: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
d650: 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65  tartTable(pParse
d660: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
d670: 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20  , isTemp, 1, 0, 
d680: 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50  noErr);.  p = pP
d690: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
d6a0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
d6b0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
d6c0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
d6d0: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
d6e0: 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ct);.    return;
d6f0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 77  .  }.  sqlite3Tw
d700: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
d710: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
d720: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62  , &pName);.  iDb
d730: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
d740: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70  ToIndex(db, p->p
d750: 53 63 68 65 6d 61 29 3b 0a 20 20 69 66 28 20 73  Schema);.  if( s
d760: 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
d770: 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
d780: 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29  , "view", pName)
d790: 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 46  .    && sqlite3F
d7a0: 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20  ixSelect(&sFix, 
d7b0: 70 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20  pSelect).  ){.  
d7c0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
d7d0: 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63  elete(db, pSelec
d7e0: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
d7f0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61    }..  /* Make a
d800: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74   copy of the ent
d810: 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ire SELECT state
d820: 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
d830: 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a  s the view..  **
d840: 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65   This will force
d850: 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f   all the Expr.to
d860: 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20  ken.z values to 
d870: 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  be dynamically. 
d880: 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61   ** allocated ra
d890: 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20  ther than point 
d8a0: 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  to the input str
d8b0: 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e  ing - which mean
d8c0: 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79  s that.  ** they
d8d0: 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66   will persist af
d8e0: 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ter the current 
d8f0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63  sqlite3_exec() c
d900: 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a  all returns..  *
d910: 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d  /.  p->pSelect =
d920: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
d930: 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45  p(db, pSelect, E
d940: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
d950: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
d960: 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63  elete(db, pSelec
d970: 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  t);.  if( db->ma
d980: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
d990: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
d9a0: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
d9b0: 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  sy ){.    sqlite
d9c0: 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
d9d0: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  mes(pParse, p);.
d9e0: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
d9f0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
da00: 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
da10: 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e  ement.  Make sEn
da20: 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20  d point to.  ** 
da30: 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20  the end..  */.  
da40: 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73  sEnd = pParse->s
da50: 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28  LastToken;.  if(
da60: 20 41 4c 57 41 59 53 28 73 45 6e 64 2e 7a 5b 30   ALWAYS(sEnd.z[0
da70: 5d 21 3d 30 29 20 26 26 20 73 45 6e 64 2e 7a 5b  ]!=0) && sEnd.z[
da80: 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73  0]!=';' ){.    s
da90: 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b  End.z += sEnd.n;
daa0: 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  .  }.  sEnd.n = 
dab0: 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28 73  0;.  n = (int)(s
dac0: 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e  End.z - pBegin->
dad0: 7a 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e  z);.  z = pBegin
dae0: 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 41 4c  ->z;.  while( AL
daf0: 57 41 59 53 28 6e 3e 30 29 20 26 26 20 73 71 6c  WAYS(n>0) && sql
db00: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d  ite3Isspace(z[n-
db10: 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  1]) ){ n--; }.  
db20: 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d  sEnd.z = &z[n-1]
db30: 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a  ;.  sEnd.n = 1;.
db40: 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65  .  /* Use sqlite
db50: 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61  3EndTable() to a
db60: 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20 74  dd the view to t
db70: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
db80: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
db90: 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72  te3EndTable(pPar
dba0: 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 29  se, 0, &sEnd, 0)
dbb0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  ;.  return;.}.#e
dbc0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
dbd0: 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66  MIT_VIEW */..#if
dbe0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
dbf0: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
dc00: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
dc10: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
dc20: 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c  )./*.** The Tabl
dc30: 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62  e structure pTab
dc40: 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56  le is really a V
dc50: 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68  IEW.  Fill in th
dc60: 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68  e names of.** th
dc70: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
dc80: 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61   view in the pTa
dc90: 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  ble structure.  
dca0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
dcb0: 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20  r.** of errors. 
dcc0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
dcd0: 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72  seen leave an er
dce0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
dcf0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
dd00: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69  */.int sqlite3Vi
dd10: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
dd20: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
dd30: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
dd40: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
dd50: 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61  ;   /* A fake ta
dd60: 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77  ble from which w
dd70: 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c 74  e get the result
dd80: 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74   set */.  Select
dd90: 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43   *pSel;     /* C
dda0: 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
ddb0: 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  T that implement
ddc0: 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  s the view */.  
ddd0: 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20  int nErr = 0;   
dde0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
ddf0: 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
de00: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
de10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
de20: 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68  orarily holds th
de30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  e number of curs
de40: 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a  ors assigned */.
de50: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
de60: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
de70: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
de80: 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65  ion for malloc e
de90: 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 28  rrors */.  int (
dea0: 2a 78 41 75 74 68 29 28 76 6f 69 64 2a 2c 69 6e  *xAuth)(void*,in
deb0: 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  t,const char*,co
dec0: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
ded0: 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72  char*,const char
dee0: 2a 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *);..  assert( p
def0: 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65  Table );..#ifnde
df00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
df10: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
df20: 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c   sqlite3VtabCall
df30: 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20  Connect(pParse, 
df40: 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72  pTable) ){.    r
df50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
df60: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73  OR;.  }.  if( Is
df70: 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20  Virtual(pTable) 
df80: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
df90: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
dfa0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f  TE_OMIT_VIEW.  /
dfb0: 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f  * A positive nCo
dfc0: 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75  l means the colu
dfd0: 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68  mns names for th
dfe0: 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a  is view are.  **
dff0: 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a   already known..
e000: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
e010: 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75  e->nCol>0 ) retu
e020: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65  rn 0;..  /* A ne
e030: 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61  gative nCol is a
e040: 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20   special marker 
e050: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20  meaning that we 
e060: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  are currently.  
e070: 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d  ** trying to com
e080: 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pute the column 
e090: 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e  names.  If we en
e0a0: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
e0b0: 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67   with.  ** a neg
e0c0: 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d  ative nCol, it m
e0d0: 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65  eans two or more
e0e0: 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f   views form a lo
e0f0: 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  op, like this:. 
e100: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45   **.  **     CRE
e110: 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20  ATE VIEW one AS 
e120: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77  SELECT * FROM tw
e130: 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  o;.  **     CREA
e140: 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53  TE VIEW two AS S
e150: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65  ELECT * FROM one
e160: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75  ;.  **.  ** Actu
e170: 61 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f 72 20  ally, the error 
e180: 61 62 6f 76 65 20 69 73 20 6e 6f 77 20 63 61 75  above is now cau
e190: 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61  ght prior to rea
e1a0: 63 68 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74  ching this point
e1b0: 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 66  ..  ** But the f
e1c0: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20 69 73  ollowing test is
e1d0: 20 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74   still important
e1e0: 20 61 73 20 69 74 20 64 6f 65 73 20 63 6f 6d 65   as it does come
e1f0: 20 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20   up.  ** in the 
e200: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20  following:.  ** 
e210: 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
e220: 20 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28   TABLE main.ex1(
e230: 61 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  a);.  **     CRE
e240: 41 54 45 20 54 45 4d 50 20 56 49 45 57 20 65 78  ATE TEMP VIEW ex
e250: 31 20 41 53 20 53 45 4c 45 43 54 20 61 20 46 52  1 AS SELECT a FR
e260: 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20  OM ex1;.  **    
e270: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
e280: 65 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20  emp.ex1;.  */.  
e290: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
e2a0: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
e2b0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
e2c0: 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69  , "view %s is ci
e2d0: 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64  rcularly defined
e2e0: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
e2f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
e300: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
e310: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29  Table->nCol>=0 )
e320: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65  ;..  /* If we ge
e330: 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
e340: 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20  eans we need to 
e350: 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c  compute the tabl
e360: 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f  e names..  ** No
e370: 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  te that the call
e380: 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c   to sqlite3Resul
e390: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77  tSetOfSelect() w
e3a0: 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20  ill expand any. 
e3b0: 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73   ** "*" elements
e3c0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20   in the results 
e3d0: 73 65 74 20 6f 66 20 74 68 65 20 76 69 65 77 20  set of the view 
e3e0: 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20  and will assign 
e3f0: 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20  cursors.  ** to 
e400: 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  the elements of 
e410: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
e420: 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20    But we do not 
e430: 77 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67  want these chang
e440: 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65  es.  ** to be pe
e450: 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65  rmanent.  So the
e460: 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
e470: 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f  done on a copy o
e480: 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a  f the SELECT.  *
e490: 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  * statement that
e4a0: 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
e4b0: 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  w..  */.  assert
e4c0: 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  ( pTable->pSelec
e4d0: 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71  t );.  pSel = sq
e4e0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
e4f0: 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  b, pTable->pSele
e500: 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53  ct, 0);.  if( pS
e510: 65 6c 20 29 7b 0a 20 20 20 20 75 38 20 65 6e 61  el ){.    u8 ena
e520: 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 64  bleLookaside = d
e530: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
e540: 61 62 6c 65 64 3b 0a 20 20 20 20 6e 20 3d 20 70  abled;.    n = p
e550: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20  Parse->nTab;.   
e560: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
e570: 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
e580: 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29  rse, pSel->pSrc)
e590: 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43  ;.    pTable->nC
e5a0: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 64 62 2d  ol = -1;.    db-
e5b0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
e5c0: 6c 65 64 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  led = 0;.#ifndef
e5d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
e5e0: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 78  HORIZATION.    x
e5f0: 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75 74 68  Auth = db->xAuth
e600: 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20  ;.    db->xAuth 
e610: 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  = 0;.    pSelTab
e620: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
e630: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
e640: 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64  se, pSel);.    d
e650: 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68  b->xAuth = xAuth
e660: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 53 65 6c  ;.#else.    pSel
e670: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
e680: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
e690: 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23 65  Parse, pSel);.#e
e6a0: 6e 64 69 66 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  ndif.    db->loo
e6b0: 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20  kaside.bEnabled 
e6c0: 3d 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64  = enableLookasid
e6d0: 65 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  e;.    pParse->n
e6e0: 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28  Tab = n;.    if(
e6f0: 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20   pSelTab ){.    
e700: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
e710: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
e720: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
e730: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
e740: 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61  .      pTable->a
e750: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
e760: 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  Col;.      pSelT
e770: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
e780: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
e790: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  l = 0;.      sql
e7a0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
e7b0: 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  db, pSelTab);.  
e7c0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
e7d0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
e7e0: 6c 64 28 64 62 2c 20 30 2c 20 70 54 61 62 6c 65  ld(db, 0, pTable
e7f0: 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
e800: 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68      pTable->pSch
e810: 65 6d 61 2d 3e 66 6c 61 67 73 20 7c 3d 20 44 42  ema->flags |= DB
e820: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20  _UnresetViews;. 
e830: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e840: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
e850: 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  ;.      nErr++;.
e860: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
e870: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
e880: 2c 20 70 53 65 6c 29 3b 0a 20 20 7d 20 65 6c 73  , pSel);.  } els
e890: 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  e {.    nErr++;.
e8a0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
e8b0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
e8c0: 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  /.  return nErr;
e8d0: 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21    .}.#endif /* !
e8e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
e8f0: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
e900: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e910: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
e920: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
e930: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
e940: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c  ** Clear the col
e950: 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65  umn names from e
e960: 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61 74  very VIEW in dat
e970: 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74  abase idx..*/.st
e980: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
e990: 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c  ViewResetAll(sql
e9a0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64  ite3 *db, int id
e9b0: 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  x){.  HashElem *
e9c0: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  i;.  assert( sql
e9d0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
e9e0: 65 6c 64 28 64 62 2c 20 69 64 78 2c 20 30 29 20  eld(db, idx, 0) 
e9f0: 29 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73 50  );.  if( !DbHasP
ea00: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
ea10: 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
ea20: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  ) ) return;.  fo
ea30: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
ea40: 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78  rst(&db->aDb[idx
ea50: 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ].pSchema->tblHa
ea60: 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48  sh); i;i=sqliteH
ea70: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
ea80: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
ea90: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
eaa0: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
eab0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
eac0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 43 6f 6c   sqliteDeleteCol
ead0: 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61  umnNames(db, pTa
eae0: 62 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  b);.      pTab->
eaf0: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
eb00: 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  pTab->nCol = 0;.
eb10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c      }.  }.  DbCl
eb20: 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20  earProperty(db, 
eb30: 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56  idx, DB_UnresetV
eb40: 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  iews);.}.#else.#
eb50: 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69   define sqliteVi
eb60: 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a  ewResetAll(A,B).
eb70: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
eb80: 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f  _OMIT_VIEW */../
eb90: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
eba0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
ebb0: 74 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75  the VDBE to adju
ebc0: 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  st the internal 
ebd0: 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62  schema.** used b
ebe0: 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68  y SQLite when th
ebf0: 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f  e btree layer mo
ec00: 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74  ves a table root
ec10: 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f   page. The.** ro
ec20: 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62  ot-page of a tab
ec30: 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64  le or index in d
ec40: 61 74 61 62 61 73 65 20 69 44 62 20 68 61 73 20  atabase iDb has 
ec50: 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72  changed from iFr
ec60: 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a  om.** to iTo..**
ec70: 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31 37 32 38  .** Ticket #1728
ec80: 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c 20 74 61  :  The symbol ta
ec90: 62 6c 65 20 6d 69 67 68 74 20 73 74 69 6c 6c 20  ble might still 
eca0: 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74  contain informat
ecb0: 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73  ion.** on tables
ecc0: 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73 20   and/or indices 
ecd0: 74 68 61 74 20 61 72 65 20 74 68 65 20 70 72 6f  that are the pro
ece0: 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 64 65  cess of being de
ecf0: 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75  leted..** If you
ed00: 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e   are unlucky, on
ed10: 65 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74  e of those delet
ed20: 65 64 20 69 6e 64 69 63 65 73 20 6f 72 20 74 61  ed indices or ta
ed30: 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61  bles might.** ha
ed40: 76 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74  ve the same root
ed50: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 74  page number as t
ed60: 68 65 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72  he real table or
ed70: 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 2a   index that is.*
ed80: 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20  * being moved.  
ed90: 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f  So we cannot sto
eda0: 70 20 73 65 61 72 63 68 69 6e 67 20 61 66 74 65  p searching afte
edb0: 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  r the first matc
edc0: 68 20 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68  h .** because th
edd0: 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 6d 69  e first match mi
ede0: 67 68 74 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f  ght be for one o
edf0: 66 20 74 68 65 20 64 65 6c 65 74 65 64 20 69 6e  f the deleted in
ee00: 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c  dices.** or tabl
ee10: 65 73 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74  es and not the t
ee20: 61 62 6c 65 2f 69 6e 64 65 78 20 74 68 61 74 20  able/index that 
ee30: 69 73 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  is actually bein
ee40: 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d  g moved..** We m
ee50: 75 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f  ust continue loo
ee60: 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74  ping until all t
ee70: 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65  ables and indice
ee80: 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61  s with.** rootpa
ee90: 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20 62  ge==iFrom have b
eea0: 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f  een converted to
eeb0: 20 68 61 76 65 20 61 20 72 6f 6f 74 70 61 67 65   have a rootpage
eec0: 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72   of iTo.** in or
eed0: 64 65 72 20 74 6f 20 62 65 20 63 65 72 74 61 69  der to be certai
eee0: 6e 20 74 68 61 74 20 77 65 20 67 6f 74 20 74 68  n that we got th
eef0: 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a  e right one..*/.
ef00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ef10: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76  MIT_AUTOVACUUM.v
ef20: 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50  oid sqlite3RootP
ef30: 61 67 65 4d 6f 76 65 64 28 73 71 6c 69 74 65 33  ageMoved(sqlite3
ef40: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69   *db, int iDb, i
ef50: 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
ef60: 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  o){.  HashElem *
ef70: 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70  pElem;.  Hash *p
ef80: 48 61 73 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b  Hash;.  Db *pDb;
ef90: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
efa0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
efb0: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
efc0: 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
efd0: 44 62 5b 69 44 62 5d 3b 0a 20 20 70 48 61 73 68  Db[iDb];.  pHash
efe0: 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61   = &pDb->pSchema
eff0: 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72  ->tblHash;.  for
f000: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
f010: 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
f020: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
f030: 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
f040: 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
f050: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
f060: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
f070: 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d   if( pTab->tnum=
f080: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
f090: 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pTab->tnum = iTo
f0a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48  ;.    }.  }.  pH
f0b0: 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68  ash = &pDb->pSch
f0c0: 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20  ema->idxHash;.  
f0d0: 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65  for(pElem=sqlite
f0e0: 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29  HashFirst(pHash)
f0f0: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
f100: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
f110: 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78  lem)){.    Index
f120: 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48   *pIdx = sqliteH
f130: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
f140: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e      if( pIdx->tn
f150: 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  um==iFrom ){.   
f160: 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20     pIdx->tnum = 
f170: 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  iTo;.    }.  }.}
f180: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
f190: 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61  rite code to era
f1a0: 73 65 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  se the table wit
f1b0: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
f1c0: 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  le from database
f1d0: 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72   iDb..** Also wr
f1e0: 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69  ite code to modi
f1f0: 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  fy the sqlite_ma
f200: 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69  ster table and i
f210: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
f220: 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65  * if a root-page
f230: 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   of another tabl
f240: 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68  e is moved by th
f250: 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68  e btree-layer wh
f260: 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20  ilst.** erasing 
f270: 69 54 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e  iTable (this can
f280: 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20   happen with an 
f290: 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
f2a0: 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69  base)..*/ .stati
f2b0: 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f  c void destroyRo
f2c0: 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a 70 50  otPage(Parse *pP
f2d0: 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65  arse, int iTable
f2e0: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
f2f0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
f300: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
f310: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
f320: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
f330: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
f340: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
f350: 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c  Destroy, iTable,
f360: 20 72 31 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c   r1, iDb);.  sql
f370: 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
f380: 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  rse);.#ifndef SQ
f390: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
f3a0: 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73  CUUM.  /* OP_Des
f3b0: 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69  troy stores an i
f3c0: 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66  n integer r1. If
f3d0: 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20   this integer.  
f3e0: 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ** is non-zero, 
f3f0: 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
f400: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
f410: 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64  of a table moved
f420: 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f   to.  ** locatio
f430: 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f  n iTable. The fo
f440: 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64  llowing code mod
f450: 69 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65  ifies the sqlite
f460: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f  _master table to
f470: 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68  .  ** reflect th
f480: 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  is..  **.  ** Th
f490: 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20  e "#NNN" in the 
f4a0: 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c  SQL is a special
f4b0: 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d   constant that m
f4c0: 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61  eans whatever va
f4d0: 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72  lue.  ** is in r
f4e0: 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65  egister NNN.  Se
f4f0: 65 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 20  e grammar rules 
f500: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
f510: 74 68 65 20 54 4b 5f 52 45 47 49 53 54 45 52 0a  the TK_REGISTER.
f520: 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61    ** token for a
f530: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
f540: 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71  ation..  */.  sq
f550: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
f560: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22  (pParse, .     "
f570: 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54  UPDATE %Q.%s SET
f580: 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45   rootpage=%d WHE
f590: 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70  RE #%d AND rootp
f5a0: 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70  age=#%d",.     p
f5b0: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
f5c0: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
f5d0: 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69 54  A_TABLE(iDb), iT
f5e0: 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23  able, r1, r1);.#
f5f0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52  endif.  sqlite3R
f600: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
f610: 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a  arse, r1);.}../*
f620: 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63  .** Write VDBE c
f630: 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62  ode to erase tab
f640: 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20  le pTab and all 
f650: 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63  associated indic
f660: 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43  es on disk..** C
f670: 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  ode to update th
f680: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
f690: 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72  tables and inter
f6a0: 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e  nal schema defin
f6b0: 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73  itions.** in cas
f6c0: 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65  e a root-page be
f6d0: 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68  longing to anoth
f6e0: 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
f6f0: 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c  d by the btree l
f700: 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20  ayer.** is also 
f710: 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20  added (this can 
f720: 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61  happen with an a
f730: 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
f740: 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
f750: 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c  void destroyTabl
f760: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
f770: 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23   Table *pTab){.#
f780: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
f790: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49  T_AUTOVACUUM.  I
f7a0: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
f7b0: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
f7c0: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
f7d0: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
f7e0: 53 63 68 65 6d 61 29 3b 0a 20 20 64 65 73 74 72  Schema);.  destr
f7f0: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
f800: 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69  e, pTab->tnum, i
f810: 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  Db);.  for(pIdx=
f820: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
f830: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
f840: 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72  Next){.    destr
f850: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
f860: 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  e, pIdx->tnum, i
f870: 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  Db);.  }.#else. 
f880: 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
f890: 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d  ase may be auto-
f8a0: 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28  vacuum capable (
f8b0: 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  if SQLITE_OMIT_A
f8c0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69  UTOVACUUM.  ** i
f8d0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20  s not defined), 
f8e0: 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72  then it is impor
f8f0: 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f  tant to call OP_
f900: 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20  Destroy on the. 
f910: 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e   ** table and in
f920: 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69  dex root-pages i
f930: 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e  n order, startin
f940: 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72  g with the numer
f950: 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72  ically .  ** lar
f960: 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
f970: 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 72  umber. This guar
f980: 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65  antees that none
f990: 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   of the root-pag
f9a0: 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65  es.  ** to be de
f9b0: 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63  stroyed is reloc
f9c0: 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ated by an earli
f9d0: 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69  er OP_Destroy. i
f9e0: 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  .e. if the.  ** 
f9f0: 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63  following were c
fa00: 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oded:.  **.  ** 
fa10: 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20  OP_Destroy 4 0. 
fa20: 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f   ** ....  ** OP_
fa30: 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a  Destroy 5 0.  **
fa40: 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70  .  ** and root p
fa50: 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 74  age 5 happened t
fa60: 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 74  o be the largest
fa70: 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
fa80: 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  r in the.  ** da
fa90: 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f  tabase, then roo
faa0: 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62  t page 5 would b
fab0: 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20  e moved to page 
fac0: 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22  4 by the .  ** "
fad0: 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20  OP_Destroy 4 0" 
fae0: 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73  opcode. The subs
faf0: 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72  equent "OP_Destr
fb00: 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69  oy 5 0" would hi
fb10: 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69  t.  ** a free-li
fb20: 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  st page..  */.  
fb30: 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d  int iTab = pTab-
fb40: 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65  >tnum;.  int iDe
fb50: 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20  stroyed = 0;..  
fb60: 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
fb70: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
fb80: 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20   int iLargest = 
fb90: 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73  0;..    if( iDes
fba0: 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61  troyed==0 || iTa
fbb0: 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a  b<iDestroyed ){.
fbc0: 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d        iLargest =
fbd0: 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20   iTab;.    }.   
fbe0: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
fbf0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
fc00: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
fc10: 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20  .      int iIdx 
fc20: 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20  = pIdx->tnum;.  
fc30: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
fc40: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
fc50: 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
fc60: 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 65    if( (iDestroye
fc70: 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44  d==0 || (iIdx<iD
fc80: 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 49  estroyed)) && iI
fc90: 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20  dx>iLargest ){. 
fca0: 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20         iLargest 
fcb0: 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a  = iIdx;.      }.
fcc0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c      }.    if( iL
fcd0: 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20  argest==0 ){.   
fce0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
fcf0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
fd00: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
fd10: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
fd20: 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
fd30: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 64 65 73  hema);.      des
fd40: 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
fd50: 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69  rse, iLargest, i
fd60: 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74  Db);.      iDest
fd70: 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74  royed = iLargest
fd80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
fd90: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  if.}../*.** This
fda0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
fdb0: 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  ed to do the wor
fdc0: 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c  k of a DROP TABL
fdd0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  E statement..** 
fde0: 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  pName is the nam
fdf0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
fe00: 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f  o be dropped..*/
fe10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
fe20: 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
fe30: 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
fe40: 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77  Name, int isView
fe50: 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20  , int noErr){.  
fe60: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56  Table *pTab;.  V
fe70: 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
fe80: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
fe90: 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
fea0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
feb0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
fec0: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
fed0: 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  le;.  }.  assert
fee0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
fef0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
ff00: 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
ff10: 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64  .  if( noErr ) d
ff20: 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2b 2b  b->suppressErr++
ff30: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
ff40: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
ff50: 61 72 73 65 2c 20 69 73 56 69 65 77 2c 20 0a 20  arse, isView, . 
ff60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff70: 20 20 20 20 20 20 20 20 20 20 20 70 4e 61 6d 65             pName
ff80: 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e  ->a[0].zName, pN
ff90: 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
ffa0: 61 73 65 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72  ase);.  if( noEr
ffb0: 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73  r ) db->suppress
ffc0: 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54  Err--;..  if( pT
ffd0: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ab==0 ){.    if(
ffe0: 20 6e 6f 45 72 72 20 29 20 73 71 6c 69 74 65 33   noErr ) sqlite3
fff0: 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53  CodeVerifyNamedS
10000 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e  chema(pParse, pN
10010 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
10020 61 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ase);.    goto e
10030 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
10040 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
10050 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
10060 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
10070 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ma);.  assert( i
10080 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
10090 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  >nDb );..  /* If
100a0 20 70 54 61 62 20 69 73 20 61 20 76 69 72 74 75   pTab is a virtu
100b0 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56  al table, call V
100c0 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
100d0 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20 20  s() to ensure.  
100e0 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c  ** it is initial
100f0 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ized..  */.  if(
10100 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
10110 20 26 26 20 73 71 6c 69 74 65 33 56 69 65 77 47   && sqlite3ViewG
10120 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
10130 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20  arse, pTab) ){. 
10140 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
10150 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66  p_table;.  }.#if
10160 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10170 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
10180 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b   {.    int code;
10190 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
101a0 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
101b0 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 63  ABLE(iDb);.    c
101c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
101d0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
101e0 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
101f0 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a  har *zArg2 = 0;.
10200 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
10210 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
10220 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
10230 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a  zTab, 0, zDb)){.
10240 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
10250 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
10260 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  }.    if( isView
10270 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f   ){.      if( !O
10280 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
10290 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
102a0 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
102b0 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  OP_TEMP_VIEW;.  
102c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
102d0 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
102e0 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20  _DROP_VIEW;.    
102f0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
10300 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
10310 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69  ABLE.    }else i
10320 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
10330 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65  b) ){.      code
10340 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
10350 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72  TABLE;.      zAr
10360 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  g2 = sqlite3GetV
10370 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 2d  Table(db, pTab)-
10380 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65  >pMod->zName;.#e
10390 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
103a0 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
103b0 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
103c0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
103d0 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
103e0 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
103f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10400 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
10410 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  OP_TABLE;.      
10420 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
10430 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
10440 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
10450 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67  Tab->zName, zArg
10460 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  2, zDb) ){.     
10470 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
10480 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  table;.    }.   
10490 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
104a0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
104b0 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61  LITE_DELETE, pTa
104c0 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62  b->zName, 0, zDb
104d0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
104e0 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
104f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
10500 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  f.  if( sqlite3S
10510 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e  trNICmp(pTab->zN
10520 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
10530 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  7)==0 ){.    sql
10540 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
10550 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
10560 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  ay not be droppe
10570 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
10580 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
10590 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
105a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
105b0 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45  OMIT_VIEW.  /* E
105c0 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45  nsure DROP TABLE
105d0 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20   is not used on 
105e0 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50  a view, and DROP
105f0 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65   VIEW is not use
10600 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c  d.  ** on a tabl
10610 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  e..  */.  if( is
10620 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
10630 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
10640 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
10650 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
10660 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74  P TABLE to delet
10670 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61  e table %s", pTa
10680 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
10690 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
106a0 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ble;.  }.  if( !
106b0 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
106c0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
106d0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
106e0 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
106f0 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20   VIEW to delete 
10700 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e  view %s", pTab->
10710 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
10720 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
10730 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
10740 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
10750 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74   to remove the t
10760 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61  able from the ma
10770 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ster table.  ** 
10780 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
10790 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
107a0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
107b0 28 20 76 20 29 7b 0a 20 20 20 20 54 72 69 67 67  ( v ){.    Trigg
107c0 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20  er *pTrigger;.  
107d0 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
107e0 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 73  >aDb[iDb];.    s
107f0 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
10800 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
10810 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  , 1, iDb);..#ifn
10820 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10830 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
10840 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
10850 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71  Tab) ){.      sq
10860 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
10870 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20  v, OP_VBegin);. 
10880 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
10890 73 71 6c 69 74 65 33 46 6b 44 72 6f 70 54 61 62  sqlite3FkDropTab
108a0 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  le(pParse, pName
108b0 2c 20 70 54 61 62 29 3b 0a 0a 20 20 20 20 2f 2a  , pTab);..    /*
108c0 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65   Drop all trigge
108d0 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
108e0 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  th the table bei
108f0 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65  ng dropped. Code
10900 0a 20 20 20 20 2a 2a 20 69 73 20 67 65 6e 65 72  .    ** is gener
10910 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65  ated to remove e
10920 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69  ntries from sqli
10930 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72  te_master and/or
10940 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74  .    ** sqlite_t
10950 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65  emp_master if re
10960 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
10970 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71     pTrigger = sq
10980 6c 69 74 65 33 54 72 69 67 67 65 72 4c 69 73 74  lite3TriggerList
10990 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
109a0 20 20 20 20 77 68 69 6c 65 28 20 70 54 72 69 67      while( pTrig
109b0 67 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ger ){.      ass
109c0 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70  ert( pTrigger->p
109d0 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
109e0 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20  chema || .      
109f0 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53      pTrigger->pS
10a00 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31  chema==db->aDb[1
10a10 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ].pSchema );.   
10a20 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72     sqlite3DropTr
10a30 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c  iggerPtr(pParse,
10a40 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20   pTrigger);.    
10a50 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72    pTrigger = pTr
10a60 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  igger->pNext;.  
10a70 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
10a80 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
10a90 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 52 65  REMENT.    /* Re
10aa0 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73  move any entries
10ab0 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73   of the sqlite_s
10ac0 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73  equence table as
10ad0 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20  sociated with.  
10ae0 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62    ** the table b
10af0 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68  eing dropped. Th
10b00 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72  is is done befor
10b10 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64  e the table is d
10b20 72 6f 70 70 65 64 0a 20 20 20 20 2a 2a 20 61 74  ropped.    ** at
10b30 20 74 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c   the btree level
10b40 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 71  , in case the sq
10b50 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
10b60 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 20  ble needs to.   
10b70 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65   ** move as a re
10b80 73 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70  sult of the drop
10b90 20 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20   (can happen in 
10ba0 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
10bb0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
10bc0 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73  ( pTab->tabFlags
10bd0 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
10be0 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ent ){.      sql
10bf0 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
10c00 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
10c10 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e  "DELETE FROM %s.
10c20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
10c30 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a  WHERE name=%Q",.
10c40 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61          pDb->zNa
10c50 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a  me, pTab->zName.
10c60 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23        );.    }.#
10c70 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72  endif..    /* Dr
10c80 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41  op all SQLITE_MA
10c90 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69  STER table and i
10ca0 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61  ndex entries tha
10cb0 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20  t refer to the. 
10cc0 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65     ** table. The
10cd0 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f   program name lo
10ce0 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  ops through the 
10cf0 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
10d00 20 64 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20   deletes.    ** 
10d10 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72  every row that r
10d20 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
10d30 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
10d40 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69  e as the one bei
10d50 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70 65  ng.    ** droppe
10d60 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20  d. Triggers are 
10d70 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61 74 65  handled seperate
10d80 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69  ly because a tri
10d90 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 20 20  gger can be.    
10da0 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  ** created in th
10db0 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
10dc0 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
10dd0 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65   table in anothe
10de0 72 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  r.    ** databas
10df0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
10e00 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
10e10 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
10e20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
10e30 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e  Q.%s WHERE tbl_n
10e40 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21  ame=%Q and type!
10e50 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20  ='trigger'",.   
10e60 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c       pDb->zName,
10e70 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
10e80 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  b), pTab->zName)
10e90 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61  ;..    /* Drop a
10ea0 6e 79 20 73 74 61 74 69 73 74 69 63 73 20 66 72  ny statistics fr
10eb0 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  om the sqlite_st
10ec0 61 74 31 20 74 61 62 6c 65 2c 20 69 66 20 69 74  at1 table, if it
10ed0 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69   exists */.    i
10ee0 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  f( sqlite3FindTa
10ef0 62 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ble(db, "sqlite_
10f00 73 74 61 74 31 22 2c 20 64 62 2d 3e 61 44 62 5b  stat1", db->aDb[
10f10 69 44 62 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20  iDb].zName) ){. 
10f20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
10f30 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
10f40 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20          "DELETE 
10f50 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73  FROM %Q.sqlite_s
10f60 74 61 74 31 20 57 48 45 52 45 20 74 62 6c 3d 25  tat1 WHERE tbl=%
10f70 51 22 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20  Q", pDb->zName, 
10f80 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pTab->zName.    
10f90 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
10fa0 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20 21  if( !isView && !
10fb0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
10fc0 29 7b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79  ){.      destroy
10fd0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
10fe0 61 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ab);.    }..    
10ff0 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61  /* Remove the ta
11000 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53  ble entry from S
11010 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c  QLite's internal
11020 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69   schema and modi
11030 66 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63  fy.    ** the sc
11040 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 20  hema cookie..   
11050 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 73 56 69   */.    if( IsVi
11060 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
11070 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11080 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65  AddOp4(v, OP_VDe
11090 73 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30  stroy, iDb, 0, 0
110a0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
110b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
110c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
110d0 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20  , OP_DropTable, 
110e0 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d  iDb, 0, 0, pTab-
110f0 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
11100 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
11110 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
11120 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69  ;.  }.  sqliteVi
11130 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69  ewResetAll(db, i
11140 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  Db);..exit_drop_
11150 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33  table:.  sqlite3
11160 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
11170 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , pName);.}../*.
11180 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11190 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  is called to cre
111a0 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67  ate a new foreig
111b0 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62  n key on the tab
111c0 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  le.** currently 
111d0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
111e0 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65  on.  pFromCol de
111f0 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63  termines which c
11200 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
11210 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70   current table p
11220 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65  oint to the fore
11230 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72  ign key.  If pFr
11240 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a  omCol==0 then.**
11250 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79   connect the key
11260 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   to the last col
11270 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70  umn inserted.  p
11280 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  To is the name o
11290 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72  f.** the table r
112a0 65 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f  eferred to.  pTo
112b0 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66  Col is a list of
112c0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f   tables in the o
112d0 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c  ther.** pTo tabl
112e0 65 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69  e that the forei
112f0 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f  gn key points to
11300 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e  .  flags contain
11310 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  s all.** informa
11320 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
11330 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
11340 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70  on algorithms sp
11350 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68  ecified.** in th
11360 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20  e ON DELETE, ON 
11370 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e  UPDATE and ON IN
11380 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SERT clauses..**
11390 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75  .** An FKey stru
113a0 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64  cture is created
113b0 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68   and added to th
113c0 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
113d0 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74  y.** under const
113e0 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ruction in the p
113f0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
11400 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   field..**.** Th
11410 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73  e foreign key is
11420 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41   set for IMMEDIA
11430 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  TE processing.  
11440 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  A subsequent cal
11450 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44  l.** to sqlite3D
11460 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29  eferForeignKey()
11470 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
11480 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a  is to DEFERRED..
11490 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
114a0 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28  reateForeignKey(
114b0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
114c0 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
114d0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
114e0 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43  ExprList *pFromC
114f0 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ol,  /* Columns 
11500 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68  in this table th
11510 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65  at point to othe
11520 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b  r table */.  Tok
11530 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20  en *pTo,        
11540 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
11550 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
11560 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43    ExprList *pToC
11570 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol,    /* Column
11580 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74  s in the other t
11590 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  able */.  int fl
115a0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
115b0 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  * Conflict resol
115c0 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
115d0 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  . */.){.  sqlite
115e0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
115f0 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
11600 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
11610 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  KEY.  FKey *pFKe
11620 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70  y = 0;.  FKey *p
11630 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20  NextTo;.  Table 
11640 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  *p = pParse->pNe
11650 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42  wTable;.  int nB
11660 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  yte;.  int i;.  
11670 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72  int nCol;.  char
11680 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *z;..  assert( 
11690 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  pTo!=0 );.  if( 
116a0 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41  p==0 || IN_DECLA
116b0 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66  RE_VTAB ) goto f
116c0 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72  k_end;.  if( pFr
116d0 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
116e0 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43  int iCol = p->nC
116f0 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45  ol-1;.    if( NE
11700 56 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f  VER(iCol<0) ) go
11710 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69  to fk_end;.    i
11720 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
11730 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b  Col->nExpr!=1 ){
11740 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
11750 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
11760 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25  foreign key on %
11770 73 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68  s".         " sh
11780 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f  ould reference o
11790 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f  nly one column o
117a0 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20  f table %T",.   
117b0 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43        p->aCol[iC
117c0 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b  ol].zName, pTo);
117d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  .      goto fk_e
117e0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43  nd;.    }.    nC
117f0 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ol = 1;.  }else 
11800 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54  if( pToCol && pT
11810 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72  oCol->nExpr!=pFr
11820 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a  omCol->nExpr ){.
11830 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
11840 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
11850 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63      "number of c
11860 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67  olumns in foreig
11870 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d  n key does not m
11880 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20  atch the number 
11890 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f  of ".        "co
118a0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66  lumns in the ref
118b0 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b  erenced table");
118c0 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  .    goto fk_end
118d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
118e0 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e  Col = pFromCol->
118f0 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79  nExpr;.  }.  nBy
11900 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b  te = sizeof(*pFK
11910 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73  ey) + (nCol-1)*s
11920 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f  izeof(pFKey->aCo
11930 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b  l[0]) + pTo->n +
11940 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c   1;.  if( pToCol
11950 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
11960 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72   i<pToCol->nExpr
11970 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42  ; i++){.      nB
11980 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  yte += sqlite3St
11990 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61  rlen30(pToCol->a
119a0 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a  [i].zName) + 1;.
119b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65      }.  }.  pFKe
119c0 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  y = sqlite3DbMal
119d0 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
119e0 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79  e );.  if( pFKey
119f0 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ==0 ){.    goto 
11a00 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46  fk_end;.  }.  pF
11a10 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a  Key->pFrom = p;.
11a20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72    pFKey->pNextFr
11a30 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20  om = p->pFKey;. 
11a40 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b   z = (char*)&pFK
11a50 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a  ey->aCol[nCol];.
11a60 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a    pFKey->zTo = z
11a70 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54  ;.  memcpy(z, pT
11a80 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20  o->z, pTo->n);. 
11a90 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a   z[pTo->n] = 0;.
11aa0 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
11ab0 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d  (z);.  z += pTo-
11ac0 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e  >n+1;.  pFKey->n
11ad0 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66  Col = nCol;.  if
11ae0 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b  ( pFromCol==0 ){
11af0 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c  .    pFKey->aCol
11b00 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e  [0].iFrom = p->n
11b10 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Col-1;.  }else{.
11b20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
11b30 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
11b40 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
11b50 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c  r(j=0; j<p->nCol
11b60 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
11b70 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
11b80 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  mp(p->aCol[j].zN
11b90 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61  ame, pFromCol->a
11ba0 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
11bb0 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79  .          pFKey
11bc0 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20  ->aCol[i].iFrom 
11bd0 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = j;.          b
11be0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
11bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
11c00 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a  ( j>=p->nCol ){.
11c10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
11c20 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11c30 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e  .          "unkn
11c40 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c  own column \"%s\
11c50 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  " in foreign key
11c60 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20   definition", . 
11c70 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f           pFromCo
11c80 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  l->a[i].zName);.
11c90 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f          goto fk_
11ca0 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
11cb0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f   }.  }.  if( pTo
11cc0 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
11cd0 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
11ce0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
11cf0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
11d00 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
11d10 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79  me);.      pFKey
11d20 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d  ->aCol[i].zCol =
11d30 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   z;.      memcpy
11d40 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  (z, pToCol->a[i]
11d50 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20  .zName, n);.    
11d60 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20    z[n] = 0;.    
11d70 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20    z += n+1;.    
11d80 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69  }.  }.  pFKey->i
11d90 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20  sDeferred = 0;. 
11da0 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b   pFKey->aAction[
11db0 30 5d 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20  0] = (u8)(flags 
11dc0 26 20 30 78 66 66 29 3b 20 20 20 20 20 20 20 20  & 0xff);        
11dd0 20 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45      /* ON DELETE
11de0 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b   action */.  pFK
11df0 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d  ey->aAction[1] =
11e00 20 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20   (u8)((flags >> 
11e10 38 20 29 20 26 20 30 78 66 66 29 3b 20 20 20 20  8 ) & 0xff);    
11e20 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74  /* ON UPDATE act
11e30 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ion */..  assert
11e40 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
11e50 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20  utexHeld(db, 0, 
11e60 70 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  p->pSchema) );. 
11e70 20 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65 79   pNextTo = (FKey
11e80 20 2a 29 73 71 6c 69 74 65 33 48 61 73 68 49 6e   *)sqlite3HashIn
11e90 73 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61  sert(&p->pSchema
11ea0 2d 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20 20 20  ->fkeyHash, .   
11eb0 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73     pFKey->zTo, s
11ec0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
11ed0 46 4b 65 79 2d 3e 7a 54 6f 29 2c 20 28 76 6f 69  FKey->zTo), (voi
11ee0 64 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b 0a 20  d *)pFKey.  );. 
11ef0 20 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d 70 46   if( pNextTo==pF
11f00 4b 65 79 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  Key ){.    db->m
11f10 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
11f20 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  .    goto fk_end
11f30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 78  ;.  }.  if( pNex
11f40 74 54 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72  tTo ){.    asser
11f50 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65  t( pNextTo->pPre
11f60 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46  vTo==0 );.    pF
11f70 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70  Key->pNextTo = p
11f80 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e 65 78  NextTo;.    pNex
11f90 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d 20 70  tTo->pPrevTo = p
11fa0 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  FKey;.  }..  /* 
11fb0 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e  Link the foreign
11fc0 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c   key to the tabl
11fd0 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74  e as the last st
11fe0 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46  ep..  */.  p->pF
11ff0 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70  Key = pFKey;.  p
12000 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e  FKey = 0;..fk_en
12010 64 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  d:.  sqlite3DbFr
12020 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23  ee(db, pFKey);.#
12030 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
12040 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  d(SQLITE_OMIT_FO
12050 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20  REIGN_KEY) */.  
12060 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
12070 65 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d 43  elete(db, pFromC
12080 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ol);.  sqlite3Ex
12090 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
120a0 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a   pToCol);.}../*.
120b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
120c0 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
120d0 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45  n INITIALLY IMME
120e0 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c  DIATE or INITIAL
120f0 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63  LY DEFERRED.** c
12100 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73  lause is seen as
12110 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69   part of a forei
12120 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
12130 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72  n.  The isDeferr
12140 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  ed.** parameter 
12150 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c  is 1 for INITIAL
12160 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20  LY DEFERRED and 
12170 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  0 for INITIALLY 
12180 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68  IMMEDIATE..** Th
12190 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68  e behavior of th
121a0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
121b0 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20  created foreign 
121c0 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a  key is adjusted.
121d0 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  ** accordingly..
121e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
121f0 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50  eferForeignKey(P
12200 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
12210 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23  t isDeferred){.#
12220 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12230 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
12240 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
12250 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69  FKey *pFKey;.  i
12260 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73  f( (pTab = pPars
12270 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
12280 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61   || (pFKey = pTa
12290 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72  b->pFKey)==0 ) r
122a0 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
122b0 20 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20 7c   isDeferred==0 |
122c0 7c 20 69 73 44 65 66 65 72 72 65 64 3d 3d 31 20  | isDeferred==1 
122d0 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 33 32  ); /* EV: R-3032
122e0 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70 46 4b  3-21917 */.  pFK
122f0 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
12300 20 28 75 38 29 69 73 44 65 66 65 72 72 65 64 3b   (u8)isDeferred;
12310 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
12320 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
12330 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61  hat will erase a
12340 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20  nd refill index 
12350 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a  *pIdx.  This is.
12360 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69  ** used to initi
12370 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72  alize a newly cr
12380 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74  eated index or t
12390 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a  o recompute the.
123a0 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e  ** content of an
123b0 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e   index in respon
123c0 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20  se to a REINDEX 
123d0 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69  command..**.** i
123e0 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73  f memRootPage is
123f0 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69   not negative, i
12400 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
12410 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a   index is newly.
12420 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  ** created.  The
12430 20 72 65 67 69 73 74 65 72 20 73 70 65 63 69 66   register specif
12440 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61  ied by memRootPa
12450 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a  ge contains the.
12460 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  ** root page num
12470 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ber of the index
12480 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67  .  If memRootPag
12490 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  e is negative, t
124a0 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  hen.** the index
124b0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
124c0 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61  and must be clea
124d0 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67  red before being
124e0 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a   refilled and.**
124f0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
12500 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
12510 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  ex is taken from
12520 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a   pIndex->tnum..*
12530 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
12540 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
12550 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
12560 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69  Index *pIndex, i
12570 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b  nt memRootPage){
12580 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
12590 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b   pIndex->pTable;
125a0 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74    /* The table t
125b0 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a  hat is indexed *
125c0 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
125d0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
125e0 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73     /* Btree curs
125f0 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54 61 62  or used for pTab
12600 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d   */.  int iIdx =
12610 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
12620 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75       /* Btree cu
12630 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49  rsor used for pI
12640 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ndex */.  int ad
12650 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr1;            
12660 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
12670 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f  ess of top of lo
12680 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d  op */.  int tnum
12690 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
126a0 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
126b0 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a  age of index */.
126c0 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
126d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126e0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
126f0 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74  e into this virt
12700 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20  ual machine */. 
12710 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20   KeyInfo *pKey; 
12720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12730 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69  /* KeyInfo for i
12740 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ndex */.  int re
12750 67 49 64 78 4b 65 79 3b 20 20 20 20 20 20 20 20  gIdxKey;        
12760 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
12770 73 74 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e 67  sters containing
12780 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 20 2a   the index key *
12790 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  /.  int regRecor
127a0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
127b0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
127c0 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 69 65  olding assemblie
127d0 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  d index record *
127e0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
127f0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
12800 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
12810 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
12820 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
12830 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
12840 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53  x(db, pIndex->pS
12850 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66  chema);..#ifndef
12860 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
12870 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  HORIZATION.  if(
12880 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
12890 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
128a0 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78  _REINDEX, pIndex
128b0 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20  ->zName, 0,.    
128c0 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
128d0 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65  Name ) ){.    re
128e0 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
128f0 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20 61  ..  /* Require a
12900 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
12910 68 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72 66  he table to perf
12920 6f 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74 69  orm this operati
12930 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54  on */.  sqlite3T
12940 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
12950 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
12960 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 1, pTab->zName
12970 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  );..  v = sqlite
12980 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
12990 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
129a0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d  eturn;.  if( mem
129b0 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20  RootPage>=0 ){. 
129c0 20 20 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f     tnum = memRoo
129d0 74 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tPage;.  }else{.
129e0 20 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65      tnum = pInde
129f0 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 73 71 6c  x->tnum;.    sql
12a00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12a10 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d  , OP_Clear, tnum
12a20 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 4b  , iDb);.  }.  pK
12a30 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ey = sqlite3Inde
12a40 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
12a50 20 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69   pIndex);.  sqli
12a60 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
12a70 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69   OP_OpenWrite, i
12a80 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20  Idx, tnum, iDb, 
12a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12aa0 20 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65       (char *)pKe
12ab0 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  y, P4_KEYINFO_HA
12ac0 4e 44 4f 46 46 29 3b 0a 20 20 69 66 28 20 6d 65  NDOFF);.  if( me
12ad0 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a  mRootPage>=0 ){.
12ae0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
12af0 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20  hangeP5(v, 1);. 
12b00 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e   }.  sqlite3Open
12b10 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54  Table(pParse, iT
12b20 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  ab, iDb, pTab, O
12b30 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61  P_OpenRead);.  a
12b40 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
12b50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
12b60 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b  ewind, iTab, 0);
12b70 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73  .  regRecord = s
12b80 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
12b90 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67 49  (pParse);.  regI
12ba0 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 47  dxKey = sqlite3G
12bb0 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
12bc0 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
12bd0 69 54 61 62 2c 20 72 65 67 52 65 63 6f 72 64 2c  iTab, regRecord,
12be0 20 31 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65   1);.  if( pInde
12bf0 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
12c00 6f 6e 65 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  one ){.    const
12c10 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20   int regRowid = 
12c20 72 65 67 49 64 78 4b 65 79 20 2b 20 70 49 6e 64  regIdxKey + pInd
12c30 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ex->nColumn;.   
12c40 20 63 6f 6e 73 74 20 69 6e 74 20 6a 32 20 3d 20   const int j2 = 
12c50 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
12c60 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b 0a 20  ntAddr(v) + 2;. 
12c70 20 20 20 76 6f 69 64 20 2a 20 63 6f 6e 73 74 20     void * const 
12c80 70 52 65 67 4b 65 79 20 3d 20 53 51 4c 49 54 45  pRegKey = SQLITE
12c90 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 72 65 67 49  _INT_TO_PTR(regI
12ca0 64 78 4b 65 79 29 3b 0a 0a 20 20 20 20 2f 2a 20  dxKey);..    /* 
12cb0 54 68 65 20 72 65 67 69 73 74 65 72 73 20 61 63  The registers ac
12cc0 63 65 73 73 65 64 20 62 79 20 74 68 65 20 4f 50  cessed by the OP
12cd0 5f 49 73 55 6e 69 71 75 65 20 6f 70 63 6f 64 65  _IsUnique opcode
12ce0 20 77 65 72 65 20 61 6c 6c 6f 63 61 74 65 64 0a   were allocated.
12cf0 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 73 71 6c      ** using sql
12d00 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
12d10 28 29 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65  () inside of the
12d20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
12d30 49 6e 64 65 78 4b 65 79 28 29 0a 20 20 20 20 2a  IndexKey().    *
12d40 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 4a 75  * call above. Ju
12d50 73 74 20 62 65 66 6f 72 65 20 74 68 61 74 20 66  st before that f
12d60 75 6e 63 74 69 6f 6e 20 77 61 73 20 66 72 65 65  unction was free
12d70 64 20 74 68 65 79 20 77 65 72 65 20 72 65 6c 65  d they were rele
12d80 61 73 65 64 0a 20 20 20 20 2a 2a 20 28 6d 61 64  ased.    ** (mad
12d90 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  e available to t
12da0 68 65 20 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20  he compiler for 
12db0 72 65 75 73 65 29 20 75 73 69 6e 67 20 0a 20 20  reuse) using .  
12dc0 20 20 2a 2a 20 73 71 6c 69 74 65 33 52 65 6c 65    ** sqlite3Rele
12dd0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 29 2e 20  aseTempRange(). 
12de0 53 6f 20 69 6e 20 73 6f 6d 65 20 77 61 79 73 20  So in some ways 
12df0 68 61 76 69 6e 67 20 74 68 65 20 4f 50 5f 49 73  having the OP_Is
12e00 55 6e 69 71 75 65 0a 20 20 20 20 2a 2a 20 6f 70  Unique.    ** op
12e10 63 6f 64 65 20 75 73 65 20 74 68 65 20 76 61 6c  code use the val
12e20 75 65 73 20 73 74 6f 72 65 64 20 77 69 74 68 69  ues stored withi
12e30 6e 20 73 65 65 6d 73 20 64 61 6e 67 65 72 6f 75  n seems dangerou
12e40 73 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63  s. However, sinc
12e50 65 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 20  e.    ** we can 
12e60 62 65 20 73 75 72 65 20 74 68 61 74 20 6e 6f 20  be sure that no 
12e70 6f 74 68 65 72 20 74 65 6d 70 20 72 65 67 69 73  other temp regis
12e80 74 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  ters have been a
12e90 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20  llocated.    ** 
12ea0 73 69 6e 63 65 20 73 71 6c 69 74 65 33 52 65 6c  since sqlite3Rel
12eb0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 29 20  easeTempRange() 
12ec0 77 61 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69  was called, it i
12ed0 73 20 73 61 66 65 20 74 6f 20 64 6f 20 73 6f 2e  s safe to do so.
12ee0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
12ef0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
12f00 20 4f 50 5f 49 73 55 6e 69 71 75 65 2c 20 69 49   OP_IsUnique, iI
12f10 64 78 2c 20 6a 32 2c 20 72 65 67 52 6f 77 69 64  dx, j2, regRowid
12f20 2c 20 70 52 65 67 4b 65 79 2c 20 50 34 5f 49 4e  , pRegKey, P4_IN
12f30 54 33 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  T32);.    sqlite
12f40 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
12f50 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c  .        pParse,
12f60 20 4f 45 5f 41 62 6f 72 74 2c 20 22 69 6e 64 65   OE_Abort, "inde
12f70 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  xed columns are 
12f80 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 34 5f  not unique", P4_
12f90 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 20 20 73  STATIC);.  }.  s
12fa0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12fb0 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
12fc0 2c 20 69 49 64 78 2c 20 72 65 67 52 65 63 6f 72  , iIdx, regRecor
12fd0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
12fe0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
12ff0 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
13000 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  T);.  sqlite3Rel
13010 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
13020 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
13030 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13040 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
13050 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 0a  iTab, addr1+1);.
13060 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
13070 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
13080 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
13090 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
130a0 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69 74  , iTab);.  sqlit
130b0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
130c0 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29 3b  OP_Close, iIdx);
130d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
130e0 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72   a new index for
130f0 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20   an SQL table.  
13100 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73  pName1.pName2 is
13110 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
13120 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70   index .** and p
13130 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20 6e  TblList is the n
13140 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
13150 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69   that is to be i
13160 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69  ndexed.  Both wi
13170 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66  ll .** be NULL f
13180 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  or a primary key
13190 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61   or an index tha
131a0 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20  t is created to 
131b0 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49  satisfy a.** UNI
131c0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
131d0 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70   If pTable and p
131e0 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20  Index are NULL, 
131f0 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  use pParse->pNew
13200 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20  Table.** as the 
13210 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  table to be inde
13220 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e  xed.  pParse->pN
13230 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62  ewTable is a tab
13240 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75  le that is.** cu
13250 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
13260 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43  nstructed by a C
13270 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
13280 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69  ement..**.** pLi
13290 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
132a0 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
132b0 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69  dexed.  pList wi
132c0 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
132d0 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61  is.** is a prima
132e0 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65  ry key or unique
132f0 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74  -constraint on t
13300 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63  he most recent c
13310 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74  olumn added.** t
13320 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
13330 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
13340 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a  truction.  .**.*
13350 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 69  * If the index i
13360 73 20 63 72 65 61 74 65 64 20 73 75 63 63 65 73  s created succes
13370 73 66 75 6c 6c 79 2c 20 72 65 74 75 72 6e 20 61  sfully, return a
13380 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
13390 6e 65 77 20 49 6e 64 65 78 0a 2a 2a 20 73 74 72  new Index.** str
133a0 75 63 74 75 72 65 2e 20 54 68 69 73 20 69 73 20  ucture. This is 
133b0 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 41  used by sqlite3A
133c0 64 64 50 72 69 6d 61 72 79 4b 65 79 28 29 20 74  ddPrimaryKey() t
133d0 6f 20 6d 61 72 6b 20 74 68 65 20 69 6e 64 65 78  o mark the index
133e0 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65  .** as the table
133f0 73 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 49  s primary key (I
13400 6e 64 65 78 2e 61 75 74 6f 49 6e 64 65 78 3d 3d  ndex.autoIndex==
13410 32 29 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71  2)..*/.Index *sq
13420 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
13430 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
13440 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e  e,     /* All in
13450 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
13460 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20  this parse */.  
13470 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
13480 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
13490 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20   of index name. 
134a0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
134b0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
134c0 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61      /* Second pa
134d0 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
134e0 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
134f0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c  .  SrcList *pTbl
13500 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74  Name, /* Table t
13510 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61  o index. Use pPa
13520 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
13530 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  f 0 */.  ExprLis
13540 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41  t *pList,   /* A
13550 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
13560 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
13570 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
13580 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f         /* OE_Abo
13590 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f  rt, OE_Ignore, O
135a0 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45  E_Replace, or OE
135b0 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  _None */.  Token
135c0 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a   *pStart,     /*
135d0 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
135e0 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
135f0 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  is statement */.
13600 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20    Token *pEnd,  
13610 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20       /* The ")" 
13620 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20  that closes the 
13630 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
13640 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
13650 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20 20 2f  sortOrder,     /
13660 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f 66 20  * Sort order of 
13670 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68 65 6e  primary key when
13680 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a   pList==NULL */.
13690 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69 73 74    int ifNotExist
136a0 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72       /* Omit err
136b0 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c 72 65  or if index alre
136c0 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b  ady exists */.){
136d0 0a 20 20 49 6e 64 65 78 20 2a 70 52 65 74 20 3d  .  Index *pRet =
136e0 20 30 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74   0;     /* Point
136f0 65 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  er to return */.
13700 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
13710 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  0;     /* Table 
13720 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
13730 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
13740 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69   = 0;   /* The i
13750 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74  ndex to be creat
13760 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ed */.  char *zN
13770 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ame = 0;     /* 
13780 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  Name of the inde
13790 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  x */.  int nName
137a0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
137b0 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
137c0 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a  ers in zName */.
137d0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f    int i, j;.  To
137e0 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20  ken nullId;     
137f0 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e     /* Fake token
13800 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44   for an empty ID
13810 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46 69 78   list */.  DbFix
13820 65 72 20 73 46 69 78 3b 20 20 20 20 20 20 20 20  er sFix;        
13830 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67  /* For assigning
13840 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20   database names 
13850 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69  to pTable */.  i
13860 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b  nt sortOrderMask
13870 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f  ;   /* 1 to hono
13880 72 20 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e  r DESC in index.
13890 20 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a    0 to ignore. *
138a0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
138b0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
138c0 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
138d0 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63       /* The spec
138e0 69 66 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61  ific table conta
138f0 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65  ining the indexe
13900 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  d database */.  
13910 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
13920 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
13930 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
13940 61 74 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  at is being writ
13950 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ten */.  Token *
13960 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a  pName = 0;    /*
13970 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   Unqualified nam
13980 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74  e of the index t
13990 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74  o create */.  st
139a0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
139b0 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f  em *pListItem; /
139c0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
139d0 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  er pList */.  in
139e0 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 45  t nCol;.  int nE
139f0 78 74 72 61 20 3d 20 30 3b 0a 20 20 63 68 61 72  xtra = 0;.  char
13a00 20 2a 7a 45 78 74 72 61 3b 0a 0a 20 20 61 73 73   *zExtra;..  ass
13a10 65 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20 7c  ert( pStart==0 |
13a20 7c 20 70 45 6e 64 21 3d 30 20 29 3b 20 2f 2a 20  | pEnd!=0 ); /* 
13a30 70 45 6e 64 20 6d 75 73 74 20 62 65 20 6e 6f 6e  pEnd must be non
13a40 2d 4e 55 4c 4c 20 69 66 20 70 53 74 61 72 74 20  -NULL if pStart 
13a50 69 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  is */.  assert( 
13a60 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
13a70 29 3b 20 20 20 20 20 20 2f 2a 20 4e 65 76 65 72  );      /* Never
13a80 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 72 69   called with pri
13a90 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  or errors */.  i
13aa0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
13ab0 6c 65 64 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  led || IN_DECLAR
13ac0 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 67 6f  E_VTAB ){.    go
13ad0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
13ae0 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
13af0 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
13b00 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
13b10 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  rse) ){.    goto
13b20 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
13b30 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ex;.  }..  /*.  
13b40 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c  ** Find the tabl
13b50 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
13b60 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e  indexed.  Return
13b70 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f   early if not fo
13b80 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  und..  */.  if( 
13b90 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a  pTblName!=0 ){..
13ba0 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74      /* Use the t
13bb0 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61  wo-part index na
13bc0 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  me to determine 
13bd0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
13be0 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66    ** to search f
13bf0 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46  or the table. 'F
13c00 69 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ix' the table na
13c10 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20  me to this db.  
13c20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b    ** before look
13c30 69 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c 65  ing up the table
13c40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
13c50 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70  ert( pName1 && p
13c60 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62  Name2 );.    iDb
13c70 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
13c80 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
13c90 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
13ca0 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69  Name);.    if( i
13cb0 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74  Db<0 ) goto exit
13cc0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
13cd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13ce0 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f  MIT_TEMPDB.    /
13cf0 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e  * If the index n
13d00 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66  ame was unqualif
13d10 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68  ied, check if th
13d20 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  e the table.    
13d30 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61 62  ** is a temp tab
13d40 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74  le. If so, set t
13d50 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 31  he database to 1
13d60 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  . Do not do this
13d70 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69 74 69  .    ** if initi
13d80 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61 62 61  alising a databa
13d90 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a  se schema..    *
13da0 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  /.    if( !db->i
13db0 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
13dc0 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
13dd0 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50  SrcListLookup(pP
13de0 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b  arse, pTblName);
13df0 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65  .      if( pName
13e00 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20  2->n==0 && pTab 
13e10 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  && pTab->pSchema
13e20 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ==db->aDb[1].pSc
13e30 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20  hema ){.        
13e40 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  iDb = 1;.      }
13e50 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
13e60 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
13e70 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61  xInit(&sFix, pPa
13e80 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78  rse, iDb, "index
13e90 22 2c 20 70 4e 61 6d 65 29 20 26 26 0a 20 20 20  ", pName) &&.   
13ea0 20 20 20 20 20 73 71 6c 69 74 65 33 46 69 78 53       sqlite3FixS
13eb0 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54  rcList(&sFix, pT
13ec0 62 6c 4e 61 6d 65 29 0a 20 20 20 20 29 7b 0a 20  blName).    ){. 
13ed0 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
13ee0 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e 73 74  the parser const
13ef0 72 75 63 74 73 20 70 54 62 6c 4e 61 6d 65 20 66  ructs pTblName f
13f00 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65  rom a single ide
13f10 6e 74 69 66 69 65 72 2c 0a 20 20 20 20 20 20 2a  ntifier,.      *
13f20 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c  * sqlite3FixSrcL
13f30 69 73 74 20 63 61 6e 20 6e 65 76 65 72 20 66 61  ist can never fa
13f40 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  il. */.      ass
13f50 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ert(0);.    }.  
13f60 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
13f70 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
13f80 73 65 2c 20 30 2c 20 70 54 62 6c 4e 61 6d 65 2d  se, 0, pTblName-
13f90 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20  >a[0].zName, .  
13fa0 20 20 20 20 20 20 70 54 62 6c 4e 61 6d 65 2d 3e        pTblName->
13fb0 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
13fc0 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20 7c  .    if( !pTab |
13fd0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
13fe0 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  ed ) goto exit_c
13ff0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
14000 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
14010 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3d 3d 70  [iDb].pSchema==p
14020 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
14030 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
14040 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b  ert( pName==0 );
14050 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50 61 72  .    pTab = pPar
14060 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
14070 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67     if( !pTab ) g
14080 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
14090 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20 3d  index;.    iDb =
140a0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
140b0 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
140c0 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20  pSchema);.  }.  
140d0 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
140e0 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Db];..  assert( 
140f0 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  pTab!=0 );.  ass
14100 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
14110 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71  r==0 );.  if( sq
14120 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54  lite3StrNICmp(pT
14130 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ab->zName, "sqli
14140 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20  te_", 7)==0 .   
14150 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 26 70      && memcmp(&p
14160 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61  Tab->zName[7],"a
14170 6c 74 65 72 74 61 62 5f 22 2c 39 29 21 3d 30 20  ltertab_",9)!=0 
14180 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
14190 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
141a0 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
141b0 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54   be indexed", pT
141c0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
141d0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
141e0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e  _index;.  }.#ifn
141f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14200 56 49 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d  VIEW.  if( pTab-
14210 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
14220 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14230 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d  pParse, "views m
14240 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
14250 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
14260 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
14270 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e  .  }.#endif.#ifn
14280 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14290 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
142a0 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
142b0 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
142c0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
142d0 2c 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65  , "virtual table
142e0 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
142f0 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
14300 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
14310 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ex;.  }.#endif..
14320 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
14330 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
14340 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65  ndex.  Make sure
14350 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c   there is not al
14360 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20  ready another.  
14370 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
14380 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
14390 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  name.  .  **.  *
143a0 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66  * Exception:  If
143b0 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
143c0 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72  the names of per
143d0 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66  manent indices f
143e0 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  rom the.  ** sql
143f0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
14400 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f   (because some o
14410 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61  ther process cha
14420 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29  nged the schema)
14430 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66   and.  ** one of
14440 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73   the index names
14450 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74   collides with t
14460 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d  he name of a tem
14470 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a  porary table or.
14480 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e    ** index, then
14490 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
144a0 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69  e to process thi
144b0 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20  s index..  **.  
144c0 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69  ** If pName==0 i
144d0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
144e0 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67  are.  ** dealing
144f0 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20   with a primary 
14500 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  key or UNIQUE co
14510 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61  nstraint.  We ha
14520 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72  ve to invent our
14530 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a  .  ** own name..
14540 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65    */.  if( pName
14550 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
14560 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
14570 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
14580 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
14590 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
145a0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
145b0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
145c0 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
145d0 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e  tName(pParse, zN
145e0 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ame) ){.      go
145f0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
14600 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
14610 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
14620 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  sy ){.      if( 
14630 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
14640 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d  (db, zName, 0)!=
14650 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
14660 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14670 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
14680 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e  lready a table n
14690 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29  amed %s", zName)
146a0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
146b0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
146c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
146d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
146e0 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
146f0 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 21  me, pDb->zName)!
14700 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
14710 21 69 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20  !ifNotExist ){. 
14720 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
14730 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
14740 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64 79  index %s already
14750 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29   exists", zName)
14760 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14770 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
14780 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b  db->init.busy );
14790 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
147a0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
147b0 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
147c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
147d0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
147e0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  dex;.    }.  }el
147f0 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  se{.    int n;. 
14800 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b     Index *pLoop;
14810 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
14820 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31  Tab->pIndex, n=1
14830 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
14840 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b  Loop->pNext, n++
14850 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  ){}.    zName = 
14860 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
14870 62 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69  b, "sqlite_autoi
14880 6e 64 65 78 5f 25 73 5f 25 64 22 2c 20 70 54 61  ndex_%s_%d", pTa
14890 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20  b->zName, n);.  
148a0 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
148b0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
148c0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
148d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
148e0 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72  Check for author
148f0 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74  ization to creat
14900 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f  e an index..  */
14910 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14920 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
14930 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ON.  {.    const
14940 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62   char *zDb = pDb
14950 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ->zName;.    if(
14960 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
14970 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
14980 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f  _INSERT, SCHEMA_
14990 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a  TABLE(iDb), 0, z
149a0 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
149b0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
149c0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
149d0 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
149e0 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
149f0 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
14a00 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c  iDb==1 ) i = SQL
14a10 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
14a20 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
14a30 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
14a40 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65  pParse, i, zName
14a50 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
14a60 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
14a70 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
14a80 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  dex;.    }.  }.#
14a90 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70  endif..  /* If p
14aa0 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e  List==0, it mean
14ab0 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
14ac0 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b  as called to mak
14ad0 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a  e a primary.  **
14ae0 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20   key out of the 
14af0 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  last column adde
14b00 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75  d to the table u
14b10 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
14b20 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74  n..  ** So creat
14b30 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f  e a fake list to
14b40 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a   simulate this..
14b50 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74    */.  if( pList
14b60 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49  ==0 ){.    nullI
14b70 64 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  d.z = pTab->aCol
14b80 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a  [pTab->nCol-1].z
14b90 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64  Name;.    nullId
14ba0 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  .n = sqlite3Strl
14bb0 65 6e 33 30 28 28 63 68 61 72 2a 29 6e 75 6c 6c  en30((char*)null
14bc0 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74  Id.z);.    pList
14bd0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
14be0 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
14bf0 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
14c00 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) goto 
14c10 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
14c20 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  x;.    sqlite3Ex
14c30 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50  prListSetName(pP
14c40 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 26 6e 75  arse, pList, &nu
14c50 6c 6c 49 64 2c 20 30 29 3b 0a 20 20 20 20 70 4c  llId, 0);.    pL
14c60 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72  ist->a[0].sortOr
14c70 64 65 72 20 3d 20 28 75 38 29 73 6f 72 74 4f 72  der = (u8)sortOr
14c80 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  der;.  }..  /* F
14c90 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
14ca0 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ny bytes of spac
14cb0 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74  e are required t
14cc0 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63 69 74  o store explicit
14cd0 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65  ly.  ** specifie
14ce0 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
14cf0 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f  ence names..  */
14d00 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
14d10 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
14d20 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
14d30 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  r = pList->a[i].
14d40 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
14d50 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 43 6f  Expr ){.      Co
14d60 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70  llSeq *pColl = p
14d70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20  Expr->pColl;.   
14d80 20 20 20 2f 2a 20 45 69 74 68 65 72 20 70 43 6f     /* Either pCo
14d90 6c 6c 21 3d 30 20 6f 72 20 74 68 65 72 65 20 77  ll!=0 or there w
14da0 61 73 20 61 6e 20 4f 4f 4d 20 66 61 69 6c 75 72  as an OOM failur
14db0 65 2e 20 20 42 75 74 20 69 66 20 61 6e 20 4f 4f  e.  But if an OO
14dc0 4d 0a 20 20 20 20 20 20 2a 2a 20 66 61 69 6c 75  M.      ** failu
14dd0 72 65 20 77 65 20 68 61 76 65 20 71 75 69 74 20  re we have quit 
14de0 62 65 66 6f 72 65 20 72 65 61 63 68 69 6e 67 20  before reaching 
14df0 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20  this point. */. 
14e00 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
14e10 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  pColl) ){.      
14e20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b    nExtra += (1 +
14e30 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
14e40 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b  (pColl->zName));
14e50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14e60 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41   }..  /* .  ** A
14e70 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65  llocate the inde
14e80 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20  x structure. .  
14e90 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c  */.  nName = sql
14ea0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
14eb0 6d 65 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c  me);.  nCol = pL
14ec0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
14ed0 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62  ndex = sqlite3Db
14ee0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a  MallocZero(db, .
14ef0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 49 6e 64        sizeof(Ind
14f00 65 78 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  ex) +           
14f10 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75     /* Index stru
14f20 63 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20  cture  */.      
14f30 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c  sizeof(int)*nCol
14f40 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
14f50 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20  Index.aiColumn  
14f60 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
14f70 28 69 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b  (int)*(nCol+1) +
14f80 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
14f90 61 69 52 6f 77 45 73 74 20 20 20 2a 2f 0a 20 20  aiRowEst   */.  
14fa0 20 20 20 20 73 69 7a 65 6f 66 28 63 68 61 72 20      sizeof(char 
14fb0 2a 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20  *)*nCol +       
14fc0 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c   /* Index.azColl
14fd0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69       */.      si
14fe0 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 20 2b 20  zeof(u8)*nCol + 
14ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
15000 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a  dex.aSortOrder *
15010 2f 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20  /.      nName + 
15020 31 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  1 +             
15030 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 7a 4e       /* Index.zN
15040 61 6d 65 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ame      */.    
15050 20 20 6e 45 78 74 72 61 20 20 20 20 20 20 20 20    nExtra        
15060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15070 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  * Collation sequ
15080 65 6e 63 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  ence names */.  
15090 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
150a0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
150b0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
150c0 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70  e_index;.  }.  p
150d0 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20  Index->azColl = 
150e0 28 63 68 61 72 2a 2a 29 28 26 70 49 6e 64 65 78  (char**)(&pIndex
150f0 5b 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  [1]);.  pIndex->
15100 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 20  aiColumn = (int 
15110 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  *)(&pIndex->azCo
15120 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e  ll[nCol]);.  pIn
15130 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20  dex->aiRowEst = 
15140 28 75 6e 73 69 67 6e 65 64 20 2a 29 28 26 70 49  (unsigned *)(&pI
15150 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  ndex->aiColumn[n
15160 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d  Col]);.  pIndex-
15170 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
15180 38 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 69  8 *)(&pIndex->ai
15190 52 6f 77 45 73 74 5b 6e 43 6f 6c 2b 31 5d 29 3b  RowEst[nCol+1]);
151a0 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  .  pIndex->zName
151b0 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e   = (char *)(&pIn
151c0 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
151d0 6e 43 6f 6c 5d 29 3b 0a 20 20 7a 45 78 74 72 61  nCol]);.  zExtra
151e0 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e   = (char *)(&pIn
151f0 64 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65  dex->zName[nName
15200 2b 31 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  +1]);.  memcpy(p
15210 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  Index->zName, zN
15220 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20  ame, nName+1);. 
15230 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20   pIndex->pTable 
15240 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78  = pTab;.  pIndex
15250 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73  ->nColumn = pLis
15260 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64  t->nExpr;.  pInd
15270 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75  ex->onError = (u
15280 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e  8)onError;.  pIn
15290 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d  dex->autoIndex =
152a0 20 28 75 38 29 28 70 4e 61 6d 65 3d 3d 30 29 3b   (u8)(pName==0);
152b0 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  .  pIndex->pSche
152c0 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
152d0 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 61 73 73  ].pSchema;.  ass
152e0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
152f0 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
15300 69 44 62 2c 20 30 29 20 29 3b 0a 0a 20 20 2f 2a  iDb, 0) );..  /*
15310 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
15320 20 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72   we should honor
15330 20 44 45 53 43 20 72 65 71 75 65 73 74 73 20 6f   DESC requests o
15340 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a  n index columns.
15350 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e    */.  if( pDb->
15360 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f  pSchema->file_fo
15370 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73  rmat>=4 ){.    s
15380 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d  ortOrderMask = -
15390 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45  1;   /* Honor DE
153a0 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  SC */.  }else{. 
153b0 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b     sortOrderMask
153c0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f   = 0;    /* Igno
153d0 72 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a  re DESC */.  }..
153e0 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61    /* Scan the na
153f0 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  mes of the colum
15400 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ns of the table 
15410 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e  to be indexed an
15420 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20  d.  ** load the 
15430 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69  column indices i
15440 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74  nto the Index st
15450 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74  ructure.  Report
15460 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69   an error.  ** i
15470 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20  f any column is 
15480 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2a 0a  not found..  **.
15490 20 20 2a 2a 20 54 4f 44 4f 3a 20 20 41 64 64 20    ** TODO:  Add 
154a0 61 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 73  a test to make s
154b0 75 72 65 20 74 68 61 74 20 74 68 65 20 73 61 6d  ure that the sam
154c0 65 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20  e column is not 
154d0 6e 61 6d 65 64 0a 20 20 2a 2a 20 6d 6f 72 65 20  named.  ** more 
154e0 74 68 61 6e 20 6f 6e 63 65 20 77 69 74 68 69 6e  than once within
154f0 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 2e   the same index.
15500 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74    Only the first
15510 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a 20 20 2a   instance of.  *
15520 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 69 6c  * the column wil
15530 6c 20 65 76 65 72 20 62 65 20 75 73 65 64 20 62  l ever be used b
15540 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e  y the optimizer.
15550 20 20 4e 6f 74 65 20 74 68 61 74 20 75 73 69 6e    Note that usin
15560 67 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20  g the.  ** same 
15570 63 6f 6c 75 6d 6e 20 6d 6f 72 65 20 74 68 61 6e  column more than
15580 20 6f 6e 63 65 20 63 61 6e 6e 6f 74 20 62 65 20   once cannot be 
15590 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65  an error because
155a0 20 74 68 61 74 20 77 6f 75 6c 64 20 0a 20 20 2a   that would .  *
155b0 2a 20 62 72 65 61 6b 20 62 61 63 6b 77 61 72 64  * break backward
155c0 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
155d0 2d 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  - it needs to be
155e0 20 61 20 77 61 72 6e 69 6e 67 2e 0a 20 20 2a 2f   a warning..  */
155f0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73  .  for(i=0, pLis
15600 74 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  tItem=pList->a; 
15610 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
15620 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b  i++, pListItem++
15630 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
15640 72 20 2a 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c  r *zColName = pL
15650 69 73 74 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  istItem->zName;.
15660 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62      Column *pTab
15670 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 72 65 71  Col;.    int req
15680 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b  uestedSortOrder;
15690 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  .    char *zColl
156a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
156b0 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e      /* Collation
156c0 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a   sequence name *
156d0 2f 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  /..    for(j=0, 
156e0 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43  pTabCol=pTab->aC
156f0 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  ol; j<pTab->nCol
15700 3b 20 6a 2b 2b 2c 20 70 54 61 62 43 6f 6c 2b 2b  ; j++, pTabCol++
15710 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
15720 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6c  ite3StrICmp(zCol
15730 4e 61 6d 65 2c 20 70 54 61 62 43 6f 6c 2d 3e 7a  Name, pTabCol->z
15740 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
15750 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15760 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  j>=pTab->nCol ){
15770 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
15780 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
15790 74 61 62 6c 65 20 25 73 20 68 61 73 20 6e 6f 20  table %s has no 
157a0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22  column named %s"
157b0 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ,.        pTab->
157c0 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61 6d 65 29  zName, zColName)
157d0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
157e0 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
157f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
15800 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
15810 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
15820 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a  >aiColumn[i] = j
15830 3b 0a 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69  ;.    /* Justifi
15840 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 41 4c  cation of the AL
15850 57 41 59 53 28 70 4c 69 73 74 49 74 65 6d 2d 3e  WAYS(pListItem->
15860 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 29 3a 20 20  pExpr->pColl):  
15870 42 65 63 61 75 73 65 20 6f 66 0a 20 20 20 20 2a  Because of.    *
15880 2a 20 74 68 65 20 77 61 79 20 74 68 65 20 22 69  * the way the "i
15890 64 78 6c 69 73 74 22 20 6e 6f 6e 2d 74 65 72 6d  dxlist" non-term
158a0 69 6e 61 6c 20 69 73 20 63 6f 6e 73 74 72 75 63  inal is construc
158b0 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  ted by the parse
158c0 72 2c 0a 20 20 20 20 2a 2a 20 69 66 20 70 4c 69  r,.    ** if pLi
158d0 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 20 69 73  stItem->pExpr is
158e0 20 6e 6f 74 20 6e 75 6c 6c 20 74 68 65 6e 20 65   not null then e
158f0 69 74 68 65 72 20 70 4c 69 73 74 49 74 65 6d 2d  ither pListItem-
15900 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 0a 20 20  >pExpr->pColl.  
15910 20 20 2a 2a 20 6d 75 73 74 20 65 78 69 73 74 20    ** must exist 
15920 6f 72 20 65 6c 73 65 20 74 68 65 72 65 20 6d 75  or else there mu
15930 73 74 20 68 61 76 65 20 62 65 65 6e 20 61 6e 20  st have been an 
15940 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20  OOM error.  But 
15950 69 66 20 74 68 65 72 65 0a 20 20 20 20 2a 2a 20  if there.    ** 
15960 77 61 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72  was an OOM error
15970 2c 20 77 65 20 77 6f 75 6c 64 20 6e 65 76 65 72  , we would never
15980 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
15990 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c  t. */.    if( pL
159a0 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 20 26  istItem->pExpr &
159b0 26 20 41 4c 57 41 59 53 28 70 4c 69 73 74 49 74  & ALWAYS(pListIt
159c0 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  em->pExpr->pColl
159d0 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ) ){.      int n
159e0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a 43 6f 6c  Coll;.      zCol
159f0 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  l = pListItem->p
15a00 45 78 70 72 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61  Expr->pColl->zNa
15a10 6d 65 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20  me;.      nColl 
15a20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
15a30 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20  0(zColl) + 1;.  
15a40 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74      assert( nExt
15a50 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20  ra>=nColl );.   
15a60 20 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61     memcpy(zExtra
15a70 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b  , zColl, nColl);
15a80 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a  .      zColl = z
15a90 45 78 74 72 61 3b 0a 20 20 20 20 20 20 7a 45 78  Extra;.      zEx
15aa0 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20  tra += nColl;.  
15ab0 20 20 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43      nExtra -= nC
15ac0 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  oll;.    }else{.
15ad0 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54        zColl = pT
15ae0 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c  ab->aCol[j].zCol
15af0 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 43  l;.      if( !zC
15b00 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  oll ){.        z
15b10 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
15b20 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Coll->zName;.   
15b30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
15b40 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
15b50 79 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63  y && !sqlite3Loc
15b60 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
15b70 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
15b80 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
15b90 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
15ba0 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43  .    pIndex->azC
15bb0 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a  oll[i] = zColl;.
15bc0 20 20 20 20 72 65 71 75 65 73 74 65 64 53 6f 72      requestedSor
15bd0 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74  tOrder = pListIt
15be0 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20  em->sortOrder & 
15bf0 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20  sortOrderMask;. 
15c00 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74     pIndex->aSort
15c10 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75 38 29 72  Order[i] = (u8)r
15c20 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
15c30 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  r;.  }.  sqlite3
15c40 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49  DefaultRowEst(pI
15c50 6e 64 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54  ndex);..  if( pT
15c60 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77  ab==pParse->pNew
15c70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Table ){.    /* 
15c80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
15c90 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20   been called to 
15ca0 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61  create an automa
15cb0 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20  tic index as a. 
15cc0 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20     ** result of 
15cd0 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
15ce0 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f   UNIQUE clause o
15cf0 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  n a column defin
15d00 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a  ition, or.    **
15d10 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
15d20 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
15d30 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f  following the co
15d40 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73  lumn definitions
15d50 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e  ..    ** i.e. on
15d60 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  e of:.    **.   
15d70 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
15d80 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59   t(x PRIMARY KEY
15d90 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45  , y);.    ** CRE
15da0 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79  ATE TABLE t(x, y
15db0 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b  , UNIQUE(x, y));
15dc0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
15dd0 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b  ither way, check
15de0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74   to see if the t
15df0 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
15e00 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20   such an index. 
15e10 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f  If.    ** so, do
15e20 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74  n't bother creat
15e30 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68  ing this one. Th
15e40 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20  is only applies 
15e50 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61  to.    ** automa
15e60 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20  tically created 
15e70 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63  indices. Users c
15e80 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69  an do as they wi
15e90 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65  sh with.    ** e
15ea0 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e  xplicit indices.
15eb0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
15ec0 77 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49  wo UNIQUE or PRI
15ed0 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
15ee0 69 6e 74 73 20 61 72 65 20 63 6f 6e 73 69 64 65  ints are conside
15ef0 72 65 64 20 65 71 75 69 76 61 6c 65 6e 74 0a 20  red equivalent. 
15f00 20 20 20 2a 2a 20 28 61 6e 64 20 74 68 75 73 20     ** (and thus 
15f10 73 75 70 70 72 65 73 73 69 6e 67 20 74 68 65 20  suppressing the 
15f20 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e  second one) even
15f30 20 69 66 20 74 68 65 79 20 68 61 76 65 20 64 69   if they have di
15f40 66 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73  fferent.    ** s
15f50 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20 20 20 20  ort orders..    
15f60 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
15f70 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  re are different
15f80 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
15f90 6e 63 65 73 20 6f 72 20 69 66 20 74 68 65 20 63  nces or if the c
15fa0 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a  olumns of.    **
15fb0 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
15fc0 6f 63 63 75 72 20 69 6e 20 64 69 66 66 65 72 65  occur in differe
15fd0 6e 74 20 6f 72 64 65 72 73 2c 20 74 68 65 6e 20  nt orders, then 
15fe0 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  the constraints 
15ff0 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69  are.    ** consi
16000 64 65 72 65 64 20 64 69 73 74 69 6e 63 74 20 61  dered distinct a
16010 6e 64 20 62 6f 74 68 20 72 65 73 75 6c 74 20 69  nd both result i
16020 6e 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63  n separate indic
16030 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49  es..    */.    I
16040 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
16050 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
16060 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
16070 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
16080 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
16090 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
160a0 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
160b0 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
160c0 74 28 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64  t( pIdx->autoInd
160d0 65 78 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ex );.      asse
160e0 72 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  rt( pIndex->onEr
160f0 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a  ror!=OE_None );.
16100 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
16110 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78  >nColumn!=pIndex
16120 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  ->nColumn ) cont
16130 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
16140 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f  k=0; k<pIdx->nCo
16150 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  lumn; k++){.    
16160 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
16170 7a 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  z1;.        cons
16180 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20  t char *z2;.    
16190 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
161a0 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65  Column[k]!=pInde
161b0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29  x->aiColumn[k] )
161c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
161d0 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  z1 = pIdx->azCol
161e0 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32  l[k];.        z2
161f0 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c   = pIndex->azCol
16200 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[k];.        if
16210 28 20 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c 69  ( z1!=z2 && sqli
16220 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a  te3StrICmp(z1, z
16230 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  2) ) break;.    
16240 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d    }.      if( k=
16250 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  =pIdx->nColumn )
16260 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
16270 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e  dx->onError!=pIn
16280 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a  dex->onError ){.
16290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
162a0 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65  s constraint cre
162b0 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e  ates the same in
162c0 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75  dex as a previou
162d0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
162e0 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66  onstraint specif
162f0 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e  ied somewhere in
16300 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
16310 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  E statement..   
16320 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65         ** Howeve
16330 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43  r the ON CONFLIC
16340 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69  T clauses are di
16350 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68  fferent. If both
16360 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20   this .         
16370 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61   ** constraint a
16380 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  nd the previous 
16390 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74  equivalent const
163a0 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69  raint have expli
163b0 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  cit.          **
163c0 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
163d0 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20  uses this is an 
163e0 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65  error. Otherwise
163f0 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  , use the.      
16400 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c      ** explicitl
16410 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61  y specified beha
16420 76 69 6f 75 72 20 66 6f 72 20 74 68 65 20 69 6e  viour for the in
16430 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  dex..          *
16440 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
16450 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  !(pIdx->onError=
16460 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70  =OE_Default || p
16470 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
16480 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20  OE_Default) ){. 
16490 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
164a0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
164b0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
164c0 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67      "conflicting
164d0 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
164e0 75 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c  uses specified",
164f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   0);.          }
16500 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
16510 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
16520 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  _Default ){.    
16530 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e          pIdx->on
16540 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e  Error = pIndex->
16550 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  onError;.       
16560 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
16570 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
16580 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
16590 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
165a0 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
165b0 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74  new Index struct
165c0 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65  ure to its table
165d0 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65   and to the othe
165e0 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  r.  ** in-memory
165f0 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
16600 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  ures. .  */.  if
16610 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
16620 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  ){.    Index *p;
16630 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
16640 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
16650 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65  eld(db, 0, pInde
16660 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  x->pSchema) );. 
16670 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
16680 73 68 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78  shInsert(&pIndex
16690 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
166a0 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  sh, .           
166b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
166c0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 71  Index->zName, sq
166d0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 49  lite3Strlen30(pI
166e0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20  ndex->zName),.  
166f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16700 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 29 3b          pIndex);
16710 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
16720 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
16730 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c  Index );  /* Mal
16740 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
16750 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 64 62  iled */.      db
16760 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
16770 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   1;.      goto e
16780 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
16790 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  ;.    }.    db->
167a0 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
167b0 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
167c0 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21     if( pTblName!
167d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  =0 ){.      pInd
167e0 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69  ex->tnum = db->i
167f0 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20  nit.newTnum;.   
16800 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
16810 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  the db->init.bus
16820 79 20 69 73 20 30 20 74 68 65 6e 20 63 72 65 61  y is 0 then crea
16830 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20  te the index on 
16840 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a  disk.  This.  **
16850 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e   involves writin
16860 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f  g the index into
16870 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
16880 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e  e and filling in
16890 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20   the.  ** index 
168a0 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74  with the current
168b0 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e   table contents.
168c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64  .  **.  ** The d
168d0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
168e0 30 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  0 when the user 
168f0 66 69 72 73 74 20 65 6e 74 65 72 73 20 61 20 43  first enters a C
16900 52 45 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a  REATE INDEX .  *
16910 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e  * command.  db->
16920 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 77  init.busy is 1 w
16930 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 69  hen a database i
16940 73 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20  s opened and .  
16950 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  ** CREATE INDEX 
16960 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72  statements are r
16970 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  ead out of the m
16980 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e  aster table.  In
16990 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72  .  ** the latter
169a0 20 63 61 73 65 20 74 68 65 20 69 6e 64 65 78 20   case the index 
169b0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 6f  already exists o
169c0 6e 20 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73  n disk, which is
169d0 20 77 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e   why.  ** we don
169e0 27 74 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65  't want to recre
169f0 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a  ate it..  **.  *
16a00 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30  * If pTblName==0
16a10 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69   it means this i
16a20 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74 65  ndex is generate
16a30 64 20 61 73 20 61 20 70 72 69 6d 61 72 79 20 6b  d as a primary k
16a40 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55  ey.  ** or UNIQU
16a50 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20  E constraint of 
16a60 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
16a70 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65  tatement.  Since
16a80 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20   the table.  ** 
16a90 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72  has just been cr
16aa0 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69  eated, it contai
16ab0 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74  ns no data and t
16ac0 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c  he index initial
16ad0 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65  ization.  ** ste
16ae0 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64  p can be skipped
16af0 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 20 2f  ..  */.  else{ /
16b00 2a 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62  * if( db->init.b
16b10 75 73 79 3d 3d 30 20 29 20 2a 2f 0a 20 20 20 20  usy==0 ) */.    
16b20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61  Vdbe *v;.    cha
16b30 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e  r *zStmt;.    in
16b40 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  t iMem = ++pPars
16b50 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20  e->nMem;..    v 
16b60 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
16b70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
16b80 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ( v==0 ) goto ex
16b90 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
16ba0 0a 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ...    /* Create
16bb0 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f   the rootpage fo
16bc0 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20  r the index.    
16bd0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  */.    sqlite3Be
16be0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
16bf0 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
16c00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16c10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
16c20 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c  reateIndex, iDb,
16c30 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20   iMem);..    /* 
16c40 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c  Gather the compl
16c50 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
16c60 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
16c70 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20  tement into.    
16c80 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72  ** the zStmt var
16c90 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20  iable.    */.   
16ca0 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
16cb0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e       assert( pEn
16cc0 64 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a  d!=0 );.      /*
16cd0 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77   A named index w
16ce0 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20  ith an explicit 
16cf0 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
16d00 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  tement */.      
16d10 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
16d20 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41  Printf(db, "CREA
16d30 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22  TE%s INDEX %.*s"
16d40 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f  ,.        onErro
16d50 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20  r==OE_None ? "" 
16d60 3a 20 22 20 55 4e 49 51 55 45 22 2c 0a 20 20 20  : " UNIQUE",.   
16d70 20 20 20 20 20 70 45 6e 64 2d 3e 7a 20 2d 20 70       pEnd->z - p
16d80 4e 61 6d 65 2d 3e 7a 20 2b 20 31 2c 0a 20 20 20  Name->z + 1,.   
16d90 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a       pName->z);.
16da0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16db0 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63   /* An automatic
16dc0 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20 62   index created b
16dd0 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  y a PRIMARY KEY 
16de0 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
16df0 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  aint */.      /*
16e00 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
16e10 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a  MPrintf(""); */.
16e20 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b        zStmt = 0;
16e30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
16e40 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73  dd an entry in s
16e50 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72  qlite_master for
16e60 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20   this index.    
16e70 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  */.    sqlite3Ne
16e80 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
16e90 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45  , .        "INSE
16ea0 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41  RT INTO %Q.%s VA
16eb0 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c  LUES('index',%Q,
16ec0 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20  %Q,#%d,%Q);",.  
16ed0 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
16ee0 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
16ef0 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
16f00 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
16f10 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  me,.        pTab
16f20 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
16f30 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a   iMem,.        z
16f40 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Stmt.    );.    
16f50 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16f60 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f  , zStmt);..    /
16f70 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78  * Fill the index
16f80 20 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72   with data and r
16f90 65 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d  eparse the schem
16fa0 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78  a. Code an OP_Ex
16fb0 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69  pire.    ** to i
16fc0 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72  nvalidate all pr
16fd0 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  e-compiled state
16fe0 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ments..    */.  
16ff0 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29    if( pTblName )
17000 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
17010 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
17020 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29  e, pIndex, iMem)
17030 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
17040 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
17050 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
17060 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17070 34 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  4(v, OP_ParseSch
17080 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 0a  ema, iDb, 0, 0,.
17090 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
170a0 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d  MPrintf(db, "nam
170b0 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65 3d  e='%q' AND type=
170c0 27 69 6e 64 65 78 27 22 2c 20 70 49 6e 64 65 78  'index'", pIndex
170d0 2d 3e 7a 4e 61 6d 65 29 2c 20 0a 20 20 20 20 20  ->zName), .     
170e0 20 20 20 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b      P4_DYNAMIC);
170f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17100 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45  beAddOp1(v, OP_E
17110 78 70 69 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d  xpire, 0);.    }
17120 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
17130 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  adding an index 
17140 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69  to the list of i
17150 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62  ndices for a tab
17160 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75  le, make.  ** su
17170 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c  re all indices l
17180 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63  abeled OE_Replac
17190 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c  e come after all
171a0 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20   those labeled. 
171b0 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20   ** OE_Ignore.  
171c0 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
171d0 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63  y for the correc
171e0 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65  t constraint che
171f0 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69  ck.  ** processi
17200 6e 67 20 28 69 6e 20 73 71 6c 69 74 65 33 47 65  ng (in sqlite3Ge
17210 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  nerateConstraint
17220 43 68 65 63 6b 73 28 29 29 20 61 73 20 70 61 72  Checks()) as par
17230 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54 45  t of.  ** UPDATE
17240 20 61 6e 64 20 49 4e 53 45 52 54 20 73 74 61 74   and INSERT stat
17250 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20  ements.  .  */. 
17260 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
17270 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d  sy || pTblName==
17280 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45  0 ){.    if( onE
17290 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
172a0 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
172b0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==0.         || 
172c0 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e  pTab->pIndex->on
172d0 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
172e0 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  e){.      pIndex
172f0 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e  ->pNext = pTab->
17300 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54  pIndex;.      pT
17310 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  ab->pIndex = pIn
17320 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dex;.    }else{.
17330 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74        Index *pOt
17340 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  her = pTab->pInd
17350 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ex;.      while(
17360 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26   pOther->pNext &
17370 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d  & pOther->pNext-
17380 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70  >onError!=OE_Rep
17390 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lace ){.        
173a0 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d  pOther = pOther-
173b0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
173c0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e        pIndex->pN
173d0 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  ext = pOther->pN
173e0 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65  ext;.      pOthe
173f0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  r->pNext = pInde
17400 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65  x;.    }.    pRe
17410 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  t = pIndex;.    
17420 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a  pIndex = 0;.  }.
17430 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62  .  /* Clean up b
17440 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f  efore exiting */
17450 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64  .exit_create_ind
17460 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  ex:.  if( pIndex
17470 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
17480 62 46 72 65 65 28 64 62 2c 20 70 49 6e 64 65 78  bFree(db, pIndex
17490 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20  ->zColAff);.    
174a0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
174b0 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20  , pIndex);.  }. 
174c0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
174d0 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
174e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  );.  sqlite3SrcL
174f0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  istDelete(db, pT
17500 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  blName);.  sqlit
17510 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
17520 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  me);.  return pR
17530 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c  et;.}../*.** Fil
17540 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f  l the Index.aiRo
17550 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69 74  wEst[] array wit
17560 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d  h default inform
17570 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74  ation - informat
17580 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65  ion.** to be use
17590 64 20 77 68 65 6e 20 77 65 20 68 61 76 65 20 6e  d when we have n
175a0 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c 59  ot run the ANALY
175b0 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  ZE command..**.*
175c0 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69 73  * aiRowEst[0] is
175d0 20 73 75 70 70 6f 73 65 20 74 6f 20 63 6f 6e 74   suppose to cont
175e0 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ain the number o
175f0 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
17600 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63  e index..** Sinc
17610 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  e we do not know
17620 2c 20 67 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f  , guess 1 millio
17630 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b 31 5d 20  n.  aiRowEst[1] 
17640 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
17650 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  f the.** number 
17660 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
17670 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20  able that match 
17680 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 76  any particular v
17690 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66  alue of the.** f
176a0 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  irst column of t
176b0 68 65 20 69 6e 64 65 78 2e 20 20 61 69 52 6f 77  he index.  aiRow
176c0 45 73 74 5b 32 5d 20 69 73 20 61 6e 20 65 73 74  Est[2] is an est
176d0 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
176e0 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74  ber.** of rows t
176f0 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61  hat match any pa
17700 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 69  rticular combini
17710 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72  ation of the fir
17720 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  st 2 columns.** 
17730 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 41  of the index.  A
17740 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 74  nd so forth.  It
17750 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20   must always be 
17760 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 0a  the case that.*.
17770 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52  **           aiR
17780 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45  owEst[N]<=aiRowE
17790 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20  st[N-1].**      
177a0 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d       aiRowEst[N]
177b0 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20  >=1.**.** Apart 
177c0 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68 61  from that, we ha
177d0 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20  ve little to go 
177e0 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75 69  on besides intui
177f0 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f  tion as to.** ho
17800 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f  w aiRowEst[] sho
17810 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  uld be initializ
17820 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 73  ed.  The numbers
17830 20 67 65 6e 65 72 61 74 65 64 20 68 65 72 65 0a   generated here.
17840 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20  ** are based on 
17850 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20 66  typical values f
17860 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20 69  ound in actual i
17870 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ndices..*/.void 
17880 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f  sqlite3DefaultRo
17890 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64 78  wEst(Index *pIdx
178a0 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 2a 61  ){.  unsigned *a
178b0 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73   = pIdx->aiRowEs
178c0 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e  t;.  int i;.  un
178d0 73 69 67 6e 65 64 20 6e 3b 0a 20 20 61 73 73 65  signed n;.  asse
178e0 72 74 28 20 61 21 3d 30 20 29 3b 0a 20 20 61 5b  rt( a!=0 );.  a[
178f0 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  0] = pIdx->pTabl
17900 65 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 69 66  e->nRowEst;.  if
17910 28 20 61 5b 30 5d 3c 31 30 20 29 20 61 5b 30 5d  ( a[0]<10 ) a[0]
17920 20 3d 20 31 30 3b 0a 20 20 6e 20 3d 20 31 30 3b   = 10;.  n = 10;
17930 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70  .  for(i=1; i<=p
17940 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Idx->nColumn; i+
17950 2b 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 6e  +){.    a[i] = n
17960 3b 0a 20 20 20 20 69 66 28 20 6e 3e 35 20 29 20  ;.    if( n>5 ) 
17970 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n--;.  }.  if( p
17980 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  Idx->onError!=OE
17990 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 61 5b 70  _None ){.    a[p
179a0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20  Idx->nColumn] = 
179b0 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
179c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
179d0 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69  l drop an existi
179e0 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20  ng named index. 
179f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
17a00 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
17a10 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65  DROP INDEX state
17a20 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
17a30 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50  lite3DropIndex(P
17a40 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
17a50 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e  cList *pName, in
17a60 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49  t ifExists){.  I
17a70 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
17a80 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
17a90 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
17aa0 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
17ab0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
17ac0 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20  e->nErr==0 );   
17ad0 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20  /* Never called 
17ae0 77 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72  with prior error
17af0 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d  s */.  if( db->m
17b00 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
17b10 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
17b20 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61  p_index;.  }.  a
17b30 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
17b40 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53  rc==1 );.  if( S
17b50 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
17b60 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
17b70 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  se) ){.    goto 
17b80 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
17b90 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20  .  }.  pIndex = 
17ba0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
17bb0 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  (db, pName->a[0]
17bc0 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61  .zName, pName->a
17bd0 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
17be0 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20    if( pIndex==0 
17bf0 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45 78  ){.    if( !ifEx
17c00 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71  ists ){.      sq
17c10 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
17c20 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
17c30 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65  ndex: %S", pName
17c40 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
17c50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
17c60 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68  deVerifyNamedSch
17c70 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ema(pParse, pNam
17c80 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
17c90 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  e);.    }.    pP
17ca0 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
17cb0 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  a = 1;.    goto 
17cc0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
17cd0 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65  .  }.  if( pInde
17ce0 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a  x->autoIndex ){.
17cf0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
17d00 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
17d10 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
17d20 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20  th UNIQUE ".    
17d30 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45    "or PRIMARY KE
17d40 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Y constraint can
17d50 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
17d60 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78   0);.    goto ex
17d70 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
17d80 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
17d90 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
17da0 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  db, pIndex->pSch
17db0 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ema);.#ifndef SQ
17dc0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
17dd0 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
17de0 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  int code = SQLIT
17df0 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20  E_DROP_INDEX;.  
17e00 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
17e10 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a  pIndex->pTable;.
17e20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
17e30 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
17e40 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  b].zName;.    co
17e50 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
17e60 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
17e70 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  b);.    if( sqli
17e80 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
17e90 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
17ea0 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
17eb0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
17ec0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
17ed0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
17ee0 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
17ef0 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49  Db ) code = SQLI
17f00 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44  TE_DROP_TEMP_IND
17f10 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
17f20 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
17f30 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65  rse, code, pInde
17f40 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  x->zName, pTab->
17f50 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
17f60 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
17f70 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
17f80 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
17f90 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
17fa0 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  to remove the in
17fb0 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65  dex and from the
17fc0 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f   master table */
17fd0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
17fe0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
17ff0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
18000 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
18010 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
18020 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   1, iDb);.    sq
18030 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
18040 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
18050 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
18060 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  %s WHERE name=%Q
18070 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78   AND type='index
18080 27 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61  '",.       db->a
18090 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
180a0 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
180b0 2c 0a 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ,.       pIndex-
180c0 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20  >zName.    );.  
180d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
180e0 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69  dTable(db, "sqli
180f0 74 65 5f 73 74 61 74 31 22 2c 20 64 62 2d 3e 61  te_stat1", db->a
18100 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 20 29  Db[iDb].zName) )
18110 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e  {.      sqlite3N
18120 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
18130 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  e,.        "DELE
18140 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  TE FROM %Q.sqlit
18150 65 5f 73 74 61 74 31 20 57 48 45 52 45 20 69 64  e_stat1 WHERE id
18160 78 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 64  x=%Q",.        d
18170 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
18180 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  e, pIndex->zName
18190 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
181a0 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
181b0 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
181c0 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f  iDb);.    destro
181d0 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
181e0 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20  , pIndex->tnum, 
181f0 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
18200 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
18210 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62  P_DropIndex, iDb
18220 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  , 0, 0, pIndex->
18230 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a  zName, 0);.  }..
18240 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a  exit_drop_index:
18250 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
18260 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d  tDelete(db, pNam
18270 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72  e);.}../*.** pAr
18280 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ray is a pointer
18290 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20   to an array of 
182a0 6f 62 6a 65 63 74 73 2e 20 20 45 61 63 68 20 6f  objects.  Each o
182b0 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20  bject in the.** 
182c0 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79  array is szEntry
182d0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
182e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
182f0 6c 6f 63 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a  locates a new.**
18300 20 6f 62 6a 65 63 74 20 6f 6e 20 74 68 65 20 65   object on the e
18310 6e 64 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e  nd of the array.
18320 0a 2a 2a 0a 2a 2a 20 2a 70 6e 45 6e 74 72 79 20  .**.** *pnEntry 
18330 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
18340 20 65 6e 74 72 69 65 73 20 61 6c 72 65 61 64 79   entries already
18350 20 69 6e 20 75 73 65 2e 20 20 2a 70 6e 41 6c 6c   in use.  *pnAll
18360 6f 63 20 69 73 0a 2a 2a 20 74 68 65 20 70 72 65  oc is.** the pre
18370 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65  viously allocate
18380 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72  d size of the ar
18390 72 61 79 2e 20 20 69 6e 69 74 53 69 7a 65 20 69  ray.  initSize i
183a0 73 20 74 68 65 0a 2a 2a 20 73 75 67 67 65 73 74  s the.** suggest
183b0 65 64 20 69 6e 69 74 69 61 6c 20 61 72 72 61 79  ed initial array
183c0 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 69 6f 6e   size allocation
183d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65  ..**.** The inde
183e0 78 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74  x of the new ent
183f0 72 79 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ry is returned i
18400 6e 20 2a 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54  n *pIdx..**.** T
18410 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
18420 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
18430 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 62   the array of ob
18440 6a 65 63 74 73 2e 20 20 54 68 69 73 0a 2a 2a 20  jects.  This.** 
18450 6d 69 67 68 74 20 62 65 20 74 68 65 20 73 61 6d  might be the sam
18460 65 20 61 73 20 74 68 65 20 70 41 72 72 61 79 20  e as the pArray 
18470 70 61 72 61 6d 65 74 65 72 20 6f 72 20 69 74 20  parameter or it 
18480 6d 69 67 68 74 20 62 65 20 61 20 64 69 66 66 65  might be a diffe
18490 72 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  rent.** pointer 
184a0 69 66 20 74 68 65 20 61 72 72 61 79 20 77 61 73  if the array was
184b0 20 72 65 73 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69   resized..*/.voi
184c0 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41  d *sqlite3ArrayA
184d0 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74  llocate(.  sqlit
184e0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20  e3 *db,      /* 
184f0 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f  Connection to no
18500 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66  tify of malloc f
18510 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69  ailures */.  voi
18520 64 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f  d *pArray,     /
18530 2a 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63  * Array of objec
18540 74 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65  ts.  Might be re
18550 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69  allocated */.  i
18560 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20  nt szEntry,     
18570 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68   /* Size of each
18580 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61   object in the a
18590 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  rray */.  int in
185a0 69 74 53 69 7a 65 2c 20 20 20 20 20 2f 2a 20 53  itSize,     /* S
185b0 75 67 67 65 73 74 65 64 20 69 6e 69 74 69 61 6c  uggested initial
185c0 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20   allocation, in 
185d0 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  elements */.  in
185e0 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20  t *pnEntry,     
185f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a  /* Number of obj
18600 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ects currently i
18610 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  n use */.  int *
18620 70 6e 41 6c 6c 6f 63 2c 20 20 20 20 20 2f 2a 20  pnAlloc,     /* 
18630 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  Current size of 
18640 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20  the allocation, 
18650 69 6e 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  in elements */. 
18660 20 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20   int *pIdx      
18670 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
18680 69 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73  index of a new s
18690 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lot here */.){. 
186a0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
186b0 2a 70 6e 45 6e 74 72 79 20 3e 3d 20 2a 70 6e 41  *pnEntry >= *pnA
186c0 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 76 6f 69 64  lloc ){.    void
186d0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20   *pNew;.    int 
186e0 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 6e 65 77  newSize;.    new
186f0 53 69 7a 65 20 3d 20 28 2a 70 6e 41 6c 6c 6f 63  Size = (*pnAlloc
18700 29 2a 32 20 2b 20 69 6e 69 74 53 69 7a 65 3b 0a  )*2 + initSize;.
18710 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
18720 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
18730 70 41 72 72 61 79 2c 20 6e 65 77 53 69 7a 65 2a  pArray, newSize*
18740 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66  szEntry);.    if
18750 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
18760 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20     *pIdx = -1;. 
18770 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 72 72       return pArr
18780 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  ay;.    }.    *p
18790 6e 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33  nAlloc = sqlite3
187a0 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c  DbMallocSize(db,
187b0 20 70 4e 65 77 29 2f 73 7a 45 6e 74 72 79 3b 0a   pNew)/szEntry;.
187c0 20 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65      pArray = pNe
187d0 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68  w;.  }.  z = (ch
187e0 61 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65  ar*)pArray;.  me
187f0 6d 73 65 74 28 26 7a 5b 2a 70 6e 45 6e 74 72 79  mset(&z[*pnEntry
18800 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20   * szEntry], 0, 
18810 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64  szEntry);.  *pId
18820 78 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20  x = *pnEntry;.  
18830 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65  ++*pnEntry;.  re
18840 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a  turn pArray;.}..
18850 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
18860 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
18870 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20  e given IdList. 
18880 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64   Create a new Id
18890 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
188a0 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  be..**.** A new 
188b0 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  IdList is return
188c0 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
188d0 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
188e0 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  /.IdList *sqlite
188f0 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 73 71  3IdListAppend(sq
18900 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
18910 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
18920 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20  *pToken){.  int 
18930 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
18940 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
18950 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
18960 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
18970 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  IdList) );.    i
18980 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
18990 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73  turn 0;.    pLis
189a0 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20  t->nAlloc = 0;. 
189b0 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20   }.  pList->a = 
189c0 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
189d0 63 61 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a  cate(.      db,.
189e0 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a        pList->a,.
189f0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69        sizeof(pLi
18a00 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20  st->a[0]),.     
18a10 20 35 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74   5,.      &pList
18a20 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 70 4c  ->nId,.      &pL
18a30 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2c 0a 20 20 20  ist->nAlloc,.   
18a40 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28     &i.  );.  if(
18a50 20 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69   i<0 ){.    sqli
18a60 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
18a70 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  db, pList);.    
18a80 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
18a90 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
18aa0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
18ab0 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f  romToken(db, pTo
18ac0 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ken);.  return p
18ad0 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  List;.}../*.** D
18ae0 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e  elete an IdList.
18af0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18b00 49 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c  IdListDelete(sql
18b10 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74  ite3 *db, IdList
18b20 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
18b30 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
18b40 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
18b50 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
18b60 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
18b70 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
18b80 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
18b90 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  me);.  }.  sqlit
18ba0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69  e3DbFree(db, pLi
18bb0 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
18bc0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
18bd0 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
18be0 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e  urn the index in
18bf0 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64   pList of the id
18c00 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a  entifier named z
18c10 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a  Id.  Return -1.*
18c20 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  * if not found..
18c30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64  */.int sqlite3Id
18c40 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74  ListIndex(IdList
18c50 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63   *pList, const c
18c60 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
18c70 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
18c80 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31  t==0 ) return -1
18c90 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
18ca0 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
18cb0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
18cc0 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61  StrICmp(pList->a
18cd0 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  [i].zName, zName
18ce0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  )==0 ) return i;
18cf0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
18d00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e  ;.}../*.** Expan
18d10 64 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f  d the space allo
18d20 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 67 69  cated for the gi
18d30 76 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a 65  ven SrcList obje
18d40 63 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e  ct by.** creatin
18d50 67 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c 6f  g nExtra new slo
18d60 74 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  ts beginning at 
18d70 69 53 74 61 72 74 2e 20 20 69 53 74 61 72 74 20  iStart.  iStart 
18d80 69 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a  is zero based..*
18d90 2a 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65 20  * New slots are 
18da0 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  zeroed..**.** Fo
18db0 72 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f  r example, suppo
18dc0 73 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e 69  se a SrcList ini
18dd0 74 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20  tially contains 
18de0 74 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c 42  two entries: A,B
18df0 2e 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20 33  ..** To append 3
18e00 20 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e 74   new entries ont
18e10 6f 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74 68  o the end, do th
18e20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c  is:.**.**    sql
18e30 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
18e40 67 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74 2c  ge(db, pSrclist,
18e50 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66   3, 2);.**.** Af
18e60 74 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62 6f  ter the call abo
18e70 76 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74  ve it would cont
18e80 61 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c  ain:  A, B, nil,
18e90 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66   nil, nil..** If
18ea0 20 74 68 65 20 69 53 74 61 72 74 20 61 72 67 75   the iStart argu
18eb0 6d 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31 20  ment had been 1 
18ec0 69 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74 68  instead of 2, th
18ed0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  en the result.**
18ee0 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   would have been
18ef0 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20  :  A, nil, nil, 
18f00 6e 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65 70  nil, B.  To prep
18f10 65 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f 74  end the new slot
18f20 73 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72 74  s,.** the iStart
18f30 20 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20   value would be 
18f40 30 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 74  0.  The result t
18f50 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a  hen would.** be:
18f60 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20   nil, nil, nil, 
18f70 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  A, B..**.** If a
18f80 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
18f90 6f 6e 20 66 61 69 6c 73 20 74 68 65 20 53 72 63  on fails the Src
18fa0 4c 69 73 74 20 69 73 20 75 6e 63 68 61 6e 67 65  List is unchange
18fb0 64 2e 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d  d.  The.** db->m
18fc0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
18fd0 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
18fe0 74 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74  true..*/.SrcList
18ff0 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
19000 45 6e 6c 61 72 67 65 28 0a 20 20 73 71 6c 69 74  Enlarge(.  sqlit
19010 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a  e3 *db,       /*
19020 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
19030 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f  tion to notify o
19040 66 20 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f 0a  f OOM errors */.
19050 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
19060 20 20 20 20 20 2f 2a 20 54 68 65 20 53 72 63 4c       /* The SrcL
19070 69 73 74 20 74 6f 20 62 65 20 65 6e 6c 61 72 67  ist to be enlarg
19080 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  ed */.  int nExt
19090 72 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ra,        /* Nu
190a0 6d 62 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74  mber of new slot
190b0 73 20 74 6f 20 61 64 64 20 74 6f 20 70 53 72 63  s to add to pSrc
190c0 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  ->a[] */.  int i
190d0 53 74 61 72 74 20 20 20 20 20 20 20 20 20 2f 2a  Start         /*
190e0 20 49 6e 64 65 78 20 69 6e 20 70 53 72 63 2d 3e   Index in pSrc->
190f0 61 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e 65 77  a[] of first new
19100 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e   slot */.){.  in
19110 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74  t i;..  /* Sanit
19120 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61  y checking on ca
19130 6c 6c 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  lling parameters
19140 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53   */.  assert( iS
19150 74 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73  tart>=0 );.  ass
19160 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 31 20 29  ert( nExtra>=1 )
19170 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
19180 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
19190 20 69 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e 6e   iStart<=pSrc->n
191a0 53 72 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  Src );..  /* All
191b0 6f 63 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c  ocate additional
191c0 20 73 70 61 63 65 20 69 66 20 6e 65 65 64 65 64   space if needed
191d0 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   */.  if( pSrc->
191e0 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63  nSrc+nExtra>pSrc
191f0 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
19200 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
19210 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20     int nAlloc = 
19220 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72  pSrc->nSrc+nExtr
19230 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b  a;.    int nGot;
19240 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
19250 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
19260 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20   pSrc,.         
19270 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53        sizeof(*pS
19280 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29  rc) + (nAlloc-1)
19290 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b  *sizeof(pSrc->a[
192a0 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  0]) );.    if( p
192b0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
192c0 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
192d0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
192e0 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20    return pSrc;. 
192f0 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20     }.    pSrc = 
19300 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d  pNew;.    nGot =
19310 20 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f   (sqlite3DbMallo
19320 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20  cSize(db, pNew) 
19330 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29  - sizeof(*pSrc))
19340 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b  /sizeof(pSrc->a[
19350 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d  0])+1;.    pSrc-
19360 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 31 36 29 6e  >nAlloc = (u16)n
19370 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  Got;.  }..  /* M
19380 6f 76 65 20 65 78 69 73 74 69 6e 67 20 73 6c 6f  ove existing slo
19390 74 73 20 74 68 61 74 20 63 6f 6d 65 20 61 66 74  ts that come aft
193a0 65 72 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73  er the newly ins
193b0 65 72 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a  erted slots.  **
193c0 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79 20   out of the way 
193d0 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72 63 2d  */.  for(i=pSrc-
193e0 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61  >nSrc-1; i>=iSta
193f0 72 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53  rt; i--){.    pS
19400 72 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20  rc->a[i+nExtra] 
19410 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  = pSrc->a[i];.  
19420 7d 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b  }.  pSrc->nSrc +
19430 3d 20 28 69 31 36 29 6e 45 78 74 72 61 3b 0a 0a  = (i16)nExtra;..
19440 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65    /* Zero the ne
19450 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c  wly allocated sl
19460 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ots */.  memset(
19470 26 70 53 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d  &pSrc->a[iStart]
19480 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 72 63  , 0, sizeof(pSrc
19490 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b  ->a[0])*nExtra);
194a0 0a 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 3b  .  for(i=iStart;
194b0 20 69 3c 69 53 74 61 72 74 2b 6e 45 78 74 72 61   i<iStart+nExtra
194c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63  ; i++){.    pSrc
194d0 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d  ->a[i].iCursor =
194e0 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52   -1;.  }..  /* R
194f0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
19500 74 6f 20 74 68 65 20 65 6e 6c 61 72 67 65 64 20  to the enlarged 
19510 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74  SrcList */.  ret
19520 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a  urn pSrc;.}.../*
19530 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
19540 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
19550 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74  he given SrcList
19560 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
19570 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65  SrcList if.** ne
19580 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e  ed be.  A new en
19590 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69  try is created i
195a0 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76  n the SrcList ev
195b0 65 6e 20 69 66 20 70 54 61 62 6c 65 20 69 73 20  en if pTable is 
195c0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72  NULL..**.** A Sr
195d0 63 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  cList is returne
195e0 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68  d, or NULL if th
195f0 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72  ere is an OOM er
19600 72 6f 72 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ror.  The return
19610 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69  ed.** SrcList mi
19620 67 68 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ght be the same 
19630 61 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  as the SrcList t
19640 68 61 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72  hat was input or
19650 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20   it might be.** 
19660 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61  a new one.  If a
19670 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73  n OOM error does
19680 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68   occurs, then th
19690 65 20 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66  e prior value of
196a0 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69   pList.** that i
196b0 73 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20  s input to this 
196c0 72 6f 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d  routine is autom
196d0 61 74 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a  atically freed..
196e0 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61  **.** If pDataba
196f0 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20  se is not null, 
19700 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
19710 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f  e table has an o
19720 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62  ptional.** datab
19730 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e  ase name prefix.
19740 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64    Like this:  "d
19750 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20  atabase.table". 
19760 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a   The pDatabase.*
19770 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
19780 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74  table name and t
19790 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73  he pTable points
197a0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
197b0 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72   name..** The Sr
197c0 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20  cList.a[].zName 
197d0 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20  field is filled 
197e0 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e  with the table n
197f0 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a  ame which might.
19800 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61  ** come from pTa
19810 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73  ble (if pDatabas
19820 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72  e is NULL) or fr
19830 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a  om pDatabase.  .
19840 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  ** SrcList.a[].z
19850 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c  Database is fill
19860 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
19870 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70  base name from p
19880 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74  Table,.** or wit
19890 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74  h NULL if no dat
198a0 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69  abase is specifi
198b0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68  ed..**.** In oth
198c0 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c  er words, if cal
198d0 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  l like this:.**.
198e0 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
198f0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
19900 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,B,0);.**.** 
19910 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c  Then B is a tabl
19920 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64  e name and the d
19930 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
19940 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66  unspecified.  If
19950 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20   called.** like 
19960 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
19970 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
19980 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43  stAppend(D,A,B,C
19990 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20  );.**.** Then C 
199a0 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  is the table nam
199b0 65 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64  e and B is the d
199c0 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 20 20 49  atabase name.  I
199d0 66 20 43 20 69 73 20 64 65 66 69 6e 65 64 0a 2a  f C is defined.*
199e0 2a 20 74 68 65 6e 20 73 6f 20 69 73 20 42 2e 20  * then so is B. 
199f0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
19a00 20 77 65 20 6e 65 76 65 72 20 68 61 76 65 20 61   we never have a
19a10 20 63 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a   case where:.**.
19a20 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
19a30 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
19a40 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,0,C);.**.** 
19a50 42 6f 74 68 20 70 54 61 62 6c 65 20 61 6e 64 20  Both pTable and 
19a60 70 44 61 74 61 62 61 73 65 20 61 72 65 20 61 73  pDatabase are as
19a70 73 75 6d 65 64 20 74 6f 20 62 65 20 71 75 6f 74  sumed to be quot
19a80 65 64 2e 20 20 54 68 65 79 20 61 72 65 20 64 65  ed.  They are de
19a90 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65  quoted.** before
19aa0 20 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20   being added to 
19ab0 74 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a  the SrcList..*/.
19ac0 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
19ad0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20  SrcListAppend(. 
19ae0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
19af0 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
19b00 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20  on to notify of 
19b10 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20  malloc failures 
19b20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4c  */.  SrcList *pL
19b30 69 73 74 2c 20 20 20 20 20 2f 2a 20 41 70 70 65  ist,     /* Appe
19b40 6e 64 20 74 6f 20 74 68 69 73 20 53 72 63 4c 69  nd to this SrcLi
19b50 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65 73  st. NULL creates
19b60 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 2a   a new SrcList *
19b70 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  /.  Token *pTabl
19b80 65 2c 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  e,      /* Table
19b90 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20   to append */.  
19ba0 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65  Token *pDatabase
19bb0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
19bc0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  of the table */.
19bd0 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  ){.  struct SrcL
19be0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
19bf0 0a 20 20 61 73 73 65 72 74 28 20 70 44 61 74 61  .  assert( pData
19c00 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c  base==0 || pTabl
19c10 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e  e!=0 );  /* Cann
19c20 6f 74 20 68 61 76 65 20 43 20 77 69 74 68 6f 75  ot have C withou
19c30 74 20 42 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69  t B */.  if( pLi
19c40 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
19c50 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
19c60 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
19c70 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a  eof(SrcList) );.
19c80 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
19c90 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
19ca0 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
19cb0 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20   1;.  }.  pList 
19cc0 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
19cd0 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 4c 69 73  Enlarge(db, pLis
19ce0 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72  t, 1, pList->nSr
19cf0 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  c);.  if( db->ma
19d00 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
19d10 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
19d20 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
19d30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
19d40 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
19d50 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
19d60 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70  nSrc-1];.  if( p
19d70 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74  Database && pDat
19d80 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  abase->z==0 ){. 
19d90 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30     pDatabase = 0
19da0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74  ;.  }.  if( pDat
19db0 61 62 61 73 65 20 29 7b 0a 20 20 20 20 54 6f 6b  abase ){.    Tok
19dc0 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74  en *pTemp = pDat
19dd0 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61  abase;.    pData
19de0 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20  base = pTable;. 
19df0 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d     pTable = pTem
19e00 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e  p;.  }.  pItem->
19e10 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
19e20 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
19e30 20 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74 65   pTable);.  pIte
19e40 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
19e50 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
19e60 6b 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61 73  ken(db, pDatabas
19e70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  e);.  return pLi
19e80 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  st;.}../*.** Ass
19e90 69 67 6e 20 56 64 62 65 43 75 72 73 6f 72 20 69  ign VdbeCursor i
19ea0 6e 64 65 78 20 6e 75 6d 62 65 72 73 20 74 6f 20  ndex numbers to 
19eb0 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20  all tables in a 
19ec0 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20  SrcList.*/.void 
19ed0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
19ee0 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73  signCursors(Pars
19ef0 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
19f00 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
19f10 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72  t i;.  struct Sr
19f20 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
19f30 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 73  m;.  assert(pLis
19f40 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  t || pParse->db-
19f50 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
19f60 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
19f70 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
19f80 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  em=pList->a; i<p
19f90 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
19fa0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
19fb0 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72   if( pItem->iCur
19fc0 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a  sor>=0 ) break;.
19fd0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75        pItem->iCu
19fe0 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
19ff0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  Tab++;.      if(
1a000 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
1a010 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1a020 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
1a030 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
1a040 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  Item->pSelect->p
1a050 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Src);.      }.  
1a060 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1a070 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
1a080 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64  e SrcList includ
1a090 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73  ing all its subs
1a0a0 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
1a0b0 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
1a0c0 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
1a0d0 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  db, SrcList *pLi
1a0e0 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
1a0f0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1a100 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66  tem *pItem;.  if
1a110 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1a120 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  urn;.  for(pItem
1a130 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
1a140 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  i<pList->nSrc; i
1a150 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1a160 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1a170 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  db, pItem->zData
1a180 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  base);.    sqlit
1a190 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
1a1a0 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
1a1b0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1a1c0 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  , pItem->zAlias)
1a1d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
1a1e0 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
1a1f0 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  Index);.    sqli
1a200 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
1a210 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b  b, pItem->pTab);
1a220 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
1a230 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  ctDelete(db, pIt
1a240 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  em->pSelect);.  
1a250 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1a260 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
1a270 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  On);.    sqlite3
1a280 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
1a290 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b   pItem->pUsing);
1a2a0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
1a2b0 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  Free(db, pList);
1a2c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1a2d0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1a2e0 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74   by the parser t
1a2f0 6f 20 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d  o add a new term
1a300 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
1a310 66 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d  f a growing FROM
1a320 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70   clause.  The "p
1a330 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  " parameter is t
1a340 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68  he part of.** th
1a350 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68  e FROM clause th
1a360 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
1a370 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e  een constructed.
1a380 20 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a    "p" is NULL.**
1a390 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
1a3a0 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68  first term of th
1a3b0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
1a3c0 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61  pTable and pData
1a3d0 62 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  base.** are the 
1a3e0 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
1a3f0 65 20 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e  e and database n
1a400 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d  amed in the FROM
1a410 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a   clause term..**
1a420 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55   pDatabase is NU
1a430 4c 4c 20 69 66 20 74 68 65 20 64 61 74 61 62 61  LL if the databa
1a440 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65  se name qualifie
1a450 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74  r is missing - t
1a460 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65  he.** usual case
1a470 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 68  .  If the term h
1a480 61 73 20 61 20 61 6c 69 61 73 2c 20 74 68 65 6e  as a alias, then
1a490 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74   pAlias points t
1a4a0 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74  o the.** alias t
1a4b0 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65  oken.  If the te
1a4c0 72 6d 20 69 73 20 61 20 73 75 62 71 75 65 72 79  rm is a subquery
1a4d0 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65 72 79  , then pSubquery
1a4e0 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43   is the.** SELEC
1a4f0 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
1a500 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65 6e   the subquery en
1a510 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61 62  codes.  The pTab
1a520 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62  le and.** pDatab
1a530 61 73 65 20 70 61 72 61 6d 65 74 65 72 73 20 61  ase parameters a
1a540 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71  re NULL for subq
1a550 75 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e  ueries.  The pOn
1a560 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70   and pUsing.** p
1a570 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 74 68  arameters are th
1a580 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
1a590 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
1a5a0 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  auses..**.** Ret
1a5b0 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73  urn a new SrcLis
1a5c0 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20  t which encodes 
1a5d0 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68  is the FROM with
1a5e0 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d   the new.** term
1a5f0 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69   added..*/.SrcLi
1a600 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
1a610 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
1a620 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1a630 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
1a640 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1a650 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  /.  SrcList *p, 
1a660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1a670 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20  he left part of 
1a680 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1a690 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a  already seen */.
1a6a0 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c    Token *pTable,
1a6b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1a6c0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
1a6d0 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f  o add to the FRO
1a6e0 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f  M clause */.  To
1a6f0 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20  ken *pDatabase, 
1a700 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1a710 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
1a720 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20  ntaining pTable 
1a730 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69  */.  Token *pAli
1a740 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  as,          /* 
1a750 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
1a760 69 64 65 20 6f 66 20 74 68 65 20 41 53 20 73 75  ide of the AS su
1a770 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  bexpression */. 
1a780 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65   Select *pSubque
1a790 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75  ry,      /* A su
1a7a0 62 71 75 65 72 79 20 75 73 65 64 20 69 6e 20 70  bquery used in p
1a7b0 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20  lace of a table 
1a7c0 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  name */.  Expr *
1a7d0 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pOn,            
1a7e0 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75    /* The ON clau
1a7f0 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a  se of a join */.
1a800 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67    IdList *pUsing
1a810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1a820 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
1a830 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20   a join */.){.  
1a840 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1a850 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71  tem *pItem;.  sq
1a860 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1a870 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21 70  se->db;.  if( !p
1a880 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69   && (pOn || pUsi
1a890 6e 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ng) ){.    sqlit
1a8a0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1a8b0 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73  e, "a JOIN claus
1a8c0 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  e is required be
1a8d0 66 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20  fore %s", .     
1a8e0 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22   (pOn ? "ON" : "
1a8f0 55 53 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20  USING").    );. 
1a900 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66     goto append_f
1a910 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  rom_error;.  }. 
1a920 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c   p = sqlite3SrcL
1a930 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70 2c  istAppend(db, p,
1a940 20 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61   pTable, pDataba
1a950 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  se);.  if( p==0 
1a960 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 53 72 63  || NEVER(p->nSrc
1a970 3d 3d 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ==0) ){.    goto
1a980 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72   append_from_err
1a990 6f 72 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20  or;.  }.  pItem 
1a9a0 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d  = &p->a[p->nSrc-
1a9b0 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 41  1];.  assert( pA
1a9c0 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20 69 66 28  lias!=0 );.  if(
1a9d0 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20   pAlias->n ){.  
1a9e0 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20    pItem->zAlias 
1a9f0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1aa00 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61  mToken(db, pAlia
1aa10 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d  s);.  }.  pItem-
1aa20 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62 71  >pSelect = pSubq
1aa30 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70  uery;.  pItem->p
1aa40 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65  On = pOn;.  pIte
1aa50 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73 69  m->pUsing = pUsi
1aa60 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  ng;.  return p;.
1aa70 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72  . append_from_er
1aa80 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20 70  ror:.  assert( p
1aa90 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
1aaa0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1aab0 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64  On);.  sqlite3Id
1aac0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1aad0 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  Using);.  sqlite
1aae0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
1aaf0 2c 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20  , pSubquery);.  
1ab00 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1ab10 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58 45  ** Add an INDEXE
1ab20 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45  D BY or NOT INDE
1ab30 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74 68  XED clause to th
1ab40 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
1ab50 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e  added .** elemen
1ab60 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 2d  t of the source-
1ab70 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
1ab80 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1ab90 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
1aba0 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65  te3SrcListIndexe
1abb0 64 42 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  dBy(Parse *pPars
1abc0 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 54  e, SrcList *p, T
1abd0 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42 79  oken *pIndexedBy
1abe0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  ){.  assert( pIn
1abf0 64 65 78 65 64 42 79 21 3d 30 20 29 3b 0a 20 20  dexedBy!=0 );.  
1ac00 69 66 28 20 70 20 26 26 20 41 4c 57 41 59 53 28  if( p && ALWAYS(
1ac10 70 2d 3e 6e 53 72 63 3e 30 29 20 29 7b 0a 20 20  p->nSrc>0) ){.  
1ac20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1ac30 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
1ac40 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
1ac50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
1ac60 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  em->notIndexed==
1ac70 30 20 26 26 20 70 49 74 65 6d 2d 3e 7a 49 6e 64  0 && pItem->zInd
1ac80 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ex==0 );.    if(
1ac90 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d   pIndexedBy->n==
1aca0 31 20 26 26 20 21 70 49 6e 64 65 78 65 64 42 79  1 && !pIndexedBy
1acb0 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ->z ){.      /* 
1acc0 41 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 20  A "NOT INDEXED" 
1acd0 63 6c 61 75 73 65 20 77 61 73 20 73 75 70 70 6c  clause was suppl
1ace0 69 65 64 2e 20 53 65 65 20 70 61 72 73 65 2e 79  ied. See parse.y
1acf0 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74   .      ** const
1ad00 72 75 63 74 20 22 69 6e 64 65 78 65 64 5f 6f 70  ruct "indexed_op
1ad10 74 22 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20  t" for details. 
1ad20 2a 2f 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  */.      pItem->
1ad30 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a  notIndexed = 1;.
1ad40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ad50 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d   pItem->zIndex =
1ad60 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1ad70 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
1ad80 2c 20 70 49 6e 64 65 78 65 64 42 79 29 3b 0a 20  , pIndexedBy);. 
1ad90 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1ada0 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  * When building 
1adb0 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  up a FROM clause
1adc0 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20   in the parser, 
1add0 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
1ade0 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c  r.** is initiall
1adf0 79 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  y attached to th
1ae00 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e 20  e left operand. 
1ae10 20 42 75 74 20 74 68 65 20 63 6f 64 65 20 67 65   But the code ge
1ae20 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63  nerator.** expec
1ae30 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ts the join oper
1ae40 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74 68  ator to be on th
1ae50 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e  e right operand.
1ae60 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
1ae70 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69  * Shifts all joi
1ae80 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72 6f 6d  n operators from
1ae90 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 66   left to right f
1aea0 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46 52 4f  or an entire FRO
1aeb0 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  M.** clause..**.
1aec0 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75 70 70  ** Example: Supp
1aed0 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20  ose the join is 
1aee0 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1aef0 20 20 20 20 20 20 20 20 20 20 20 41 20 6e 61 74             A nat
1af00 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20  ural cross join 
1af10 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72  B.**.** The oper
1af20 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72 61 6c  ator is "natural
1af30 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54   cross join".  T
1af40 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65 72 61  he A and B opera
1af50 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a  nds are stored.*
1af60 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64  * in p->a[0] and
1af70 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63   p->a[1], respec
1af80 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70 61 72  tively.  The par
1af90 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 74  ser initially st
1afa0 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72  ores the.** oper
1afb0 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20 54 68  ator with A.  Th
1afc0 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69 66 74  is routine shift
1afd0 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f 72 20  s that operator 
1afe0 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f  over to B..*/.vo
1aff0 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
1b000 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 53  tShiftJoinType(S
1b010 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 66  rcList *p){.  if
1b020 28 20 70 20 26 26 20 70 2d 3e 61 20 29 7b 0a 20  ( p && p->a ){. 
1b030 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
1b040 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69  r(i=p->nSrc-1; i
1b050 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  >0; i--){.      
1b060 70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65  p->a[i].jointype
1b070 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69   = p->a[i-1].joi
1b080 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20  ntype;.    }.   
1b090 20 70 2d 3e 61 5b 30 5d 2e 6a 6f 69 6e 74 79 70   p->a[0].jointyp
1b0a0 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
1b0b0 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e  .** Begin a tran
1b0c0 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
1b0d0 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e  sqlite3BeginTran
1b0e0 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
1b0f0 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29  Parse, int type)
1b100 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1b110 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
1b120 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t i;..  assert( 
1b130 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 64  pParse!=0 );.  d
1b140 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1b150 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
1b160 29 3b 0a 2f 2a 20 20 69 66 28 20 64 62 2d 3e 61  );./*  if( db->a
1b170 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
1b180 65 74 75 72 6e 3b 20 2a 2f 0a 20 20 69 66 28 20  eturn; */.  if( 
1b190 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1b1a0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1b1b0 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45  TRANSACTION, "BE
1b1c0 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20  GIN", 0, 0) ){. 
1b1d0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1b1e0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1b1f0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
1b200 66 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a  f( !v ) return;.
1b210 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44    if( type!=TK_D
1b220 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66  EFERRED ){.    f
1b230 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
1b240 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  b; i++){.      s
1b250 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b260 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  (v, OP_Transacti
1b270 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b  on, i, (type==TK
1b280 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a  _EXCLUSIVE)+1);.
1b290 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b2a0 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 29  eUsesBtree(v, i)
1b2b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1b2c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b2d0 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
1b2e0 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 0, 0);.}../*.*
1b2f0 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73  * Commit a trans
1b300 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
1b310 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e  qlite3CommitTran
1b320 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
1b330 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
1b340 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
1b350 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1b360 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d  rse!=0 );.  db =
1b370 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
1b380 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
1b390 2f 2a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  /*  if( db->aDb[
1b3a0 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
1b3b0 72 6e 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  rn; */.  if( sql
1b3c0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1b3d0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
1b3e0 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49  NSACTION, "COMMI
1b3f0 54 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  T", 0, 0) ){.   
1b400 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76   return;.  }.  v
1b410 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1b420 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1b430 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
1b440 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b450 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c  P_AutoCommit, 1,
1b460 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
1b470 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61  * Rollback a tra
1b480 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
1b490 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
1b4a0 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
1b4b0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
1b4c0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
1b4d0 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28  e *v;..  assert(
1b4e0 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20   pParse!=0 );.  
1b4f0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1b500 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
1b510 20 29 3b 0a 2f 2a 20 20 69 66 28 20 64 62 2d 3e   );./*  if( db->
1b520 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
1b530 72 65 74 75 72 6e 3b 20 2a 2f 0a 20 20 69 66 28  return; */.  if(
1b540 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1b550 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1b560 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52  _TRANSACTION, "R
1b570 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20  OLLBACK", 0, 0) 
1b580 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
1b590 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
1b5a0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1b5b0 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
1b5c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b5d0 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
1b5e0 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d  it, 1, 1);.  }.}
1b5f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1b600 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1b610 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
1b620 65 6e 20 69 74 20 70 61 72 73 65 73 20 61 20 63  en it parses a c
1b630 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65 61 74 65  ommand to create
1b640 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72 20  ,.** release or 
1b650 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c 20  rollback an SQL 
1b660 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76  savepoint. .*/.v
1b670 6f 69 64 20 73 71 6c 69 74 65 33 53 61 76 65 70  oid sqlite3Savep
1b680 6f 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61 72  oint(Parse *pPar
1b690 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b 65  se, int op, Toke
1b6a0 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61  n *pName){.  cha
1b6b0 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
1b6c0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1b6d0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
1b6e0 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  e);.  if( zName 
1b6f0 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
1b700 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1b710 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66  pParse);.#ifndef
1b720 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1b730 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 73  HORIZATION.    s
1b740 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1b750 20 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20   * const az[] = 
1b760 7b 20 22 42 45 47 49 4e 22 2c 20 22 52 45 4c 45  { "BEGIN", "RELE
1b770 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43 4b 22  ASE", "ROLLBACK"
1b780 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   };.    assert( 
1b790 21 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e  !SAVEPOINT_BEGIN
1b7a0 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   && SAVEPOINT_RE
1b7b0 4c 45 41 53 45 3d 3d 31 20 26 26 20 53 41 56 45  LEASE==1 && SAVE
1b7c0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d  POINT_ROLLBACK==
1b7d0 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  2 );.#endif.    
1b7e0 69 66 28 20 21 76 20 7c 7c 20 73 71 6c 69 74 65  if( !v || sqlite
1b7f0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1b800 65 2c 20 53 51 4c 49 54 45 5f 53 41 56 45 50 4f  e, SQLITE_SAVEPO
1b810 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61  INT, az[op], zNa
1b820 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  me, 0) ){.      
1b830 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
1b840 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29  arse->db, zName)
1b850 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
1b860 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1b870 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1b880 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f 70 2c  P_Savepoint, op,
1b890 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 50 34   0, 0, zName, P4
1b8a0 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d  _DYNAMIC);.  }.}
1b8b0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
1b8c0 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62  e the TEMP datab
1b8d0 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  ase is open and 
1b8e0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
1b8f0 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68  e.  Return.** th
1b900 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
1b910 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20 65  rs.  Leave any e
1b920 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e  rror messages in
1b930 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
1b940 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cture..*/.int sq
1b950 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74  lite3OpenTempDat
1b960 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50 61  abase(Parse *pPa
1b970 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  rse){.  sqlite3 
1b980 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1b990 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  ;.  if( db->aDb[
1b9a0 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50  1].pBt==0 && !pP
1b9b0 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
1b9c0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1b9d0 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 20   Btree *pBt;.   
1b9e0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e   static const in
1b9f0 74 20 66 6c 61 67 73 20 3d 20 0a 20 20 20 20 20  t flags = .     
1ba00 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1ba10 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20 20  _READWRITE |.   
1ba20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1ba30 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
1ba40 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1ba50 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20  N_EXCLUSIVE |.  
1ba60 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1ba70 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
1ba80 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
1ba90 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
1baa0 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  B;..    rc = sql
1bab0 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62  ite3BtreeOpen(db
1bac0 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c 20 26  ->pVfs, 0, db, &
1bad0 70 42 74 2c 20 30 2c 20 66 6c 61 67 73 29 3b 0a  pBt, 0, flags);.
1bae0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1baf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
1bb00 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1bb10 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
1bb20 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
1bb30 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20  ry database ".  
1bb40 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20        "file for 
1bb50 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72  storing temporar
1bb60 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20  y tables");.    
1bb70 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72    pParse->rc = r
1bb80 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  c;.      return 
1bb90 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  1;.    }.    db-
1bba0 3e 61 44 62 5b 31 5d 2e 70 42 74 20 3d 20 70 42  >aDb[1].pBt = pB
1bbb0 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  t;.    assert( d
1bbc0 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
1bbd0 61 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  a );.    if( SQL
1bbe0 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74  ITE_NOMEM==sqlit
1bbf0 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
1bc00 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78 74  ze(pBt, db->next
1bc10 50 61 67 65 73 69 7a 65 2c 20 2d 31 2c 20 30 29  Pagesize, -1, 0)
1bc20 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61   ){.      db->ma
1bc30 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
1bc40 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1bc50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1bc60 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
1bc70 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
1bc80 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69  e that will veri
1bc90 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  fy the schema co
1bca0 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a 2a  okie and start.*
1bcb0 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  * a read-transac
1bcc0 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d  tion for all nam
1bcd0 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
1bce0 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  s..**.** It is i
1bcf0 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c  mportant that al
1bd00 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73  l schema cookies
1bd10 20 62 65 20 76 65 72 69 66 69 65 64 20 61 6e 64   be verified and
1bd20 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61   all.** read tra
1bd30 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74 61  nsactions be sta
1bd40 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79 74  rted before anyt
1bd50 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65 6e  hing else happen
1bd60 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45  s in.** the VDBE
1bd70 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20 74   program.  But t
1bd80 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
1bd90 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
1bda0 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f  much other.** co
1bdb0 64 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e 65  de has been gene
1bdc0 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65 20  rated.  So here 
1bdd0 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a  is what we do:.*
1bde0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
1bdf0 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
1be00 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 63   is called, we c
1be10 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 74  ode an OP_Goto t
1be20 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70  hat.** will jump
1be30 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65   to a subroutine
1be40 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
1be50 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68 65  he program.  The
1be60 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65  n we.** record e
1be70 76 65 72 79 20 64 61 74 61 62 61 73 65 20 74 68  very database th
1be80 61 74 20 6e 65 65 64 73 20 69 74 73 20 73 63 68  at needs its sch
1be90 65 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e 20  ema verified in 
1bea0 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63  the.** pParse->c
1beb0 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e  ookieMask field.
1bec0 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20 61    Later, after a
1bed0 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61  ll other code ha
1bee0 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61  s been.** genera
1bef0 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ted, the subrout
1bf00 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74 68  ine that does th
1bf10 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63  e cookie verific
1bf20 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74  ations and.** st
1bf30 61 72 74 73 20 74 68 65 20 74 72 61 6e 73 61 63  arts the transac
1bf40 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f  tions will be co
1bf50 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f 47  ded and the OP_G
1bf60 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20  oto P2 value.** 
1bf70 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20  will be made to 
1bf80 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73 75  point to that su
1bf90 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 67  broutine.  The g
1bfa0 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  eneration of the
1bfb0 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  .** cookie verif
1bfc0 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74 69  ication subrouti
1bfd0 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73 20  ne code happens 
1bfe0 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  in sqlite3Finish
1bff0 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20  Coding()..**.** 
1c000 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63 6f  If iDb<0 then co
1c010 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 6f  de the OP_Goto o
1c020 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74 20  nly - don't set 
1c030 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20 74  flag to verify t
1c040 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e 20  he.** schema on 
1c050 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20 20  any databases.  
1c060 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
1c070 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68 65   to position the
1c080 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c   OP_Goto.** earl
1c090 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20 62  y in the code, b
1c0a0 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69 66  efore we know if
1c0b0 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 74 61   any database ta
1c0c0 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65  bles will be use
1c0d0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1c0e0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
1c0f0 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
1c100 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61  , int iDb){.  Pa
1c110 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
1c120 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
1c130 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a  level(pParse);..
1c140 20 20 69 66 28 20 70 54 6f 70 6c 65 76 65 6c 2d    if( pToplevel-
1c150 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20 29  >cookieGoto==0 )
1c160 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
1c170 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1c180 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 69  Toplevel);.    i
1c190 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
1c1a0 3b 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20  ;  /* This only 
1c1b0 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 72 65  happens if there
1c1c0 20 77 61 73 20 61 20 70 72 69 6f 72 20 65 72 72   was a prior err
1c1d0 6f 72 20 2a 2f 0a 20 20 20 20 70 54 6f 70 6c 65  or */.    pTople
1c1e0 76 65 6c 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20  vel->cookieGoto 
1c1f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1c200 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1c210 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a 20 20 69  0, 0)+1;.  }.  i
1c220 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20  f( iDb>=0 ){.   
1c230 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1c240 54 6f 70 6c 65 76 65 6c 2d 3e 64 62 3b 0a 20 20  Toplevel->db;.  
1c250 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a    yDbMask mask;.
1c260 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62  .    assert( iDb
1c270 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  <db->nDb );.    
1c280 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
1c290 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69  iDb].pBt!=0 || i
1c2a0 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  Db==1 );.    ass
1c2b0 65 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f  ert( iDb<SQLITE_
1c2c0 4d 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29  MAX_ATTACHED+2 )
1c2d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
1c2e0 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
1c2f0 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
1c300 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28   );.    mask = (
1c310 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 44 62  (yDbMask)1)<<iDb
1c320 3b 0a 20 20 20 20 69 66 28 20 28 70 54 6f 70 6c  ;.    if( (pTopl
1c330 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  evel->cookieMask
1c340 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20   & mask)==0 ){. 
1c350 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e       pToplevel->
1c360 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d 61  cookieMask |= ma
1c370 73 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65  sk;.      pTople
1c380 76 65 6c 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65  vel->cookieValue
1c390 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b  [iDb] = db->aDb[
1c3a0 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63  iDb].pSchema->sc
1c3b0 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20  hema_cookie;.   
1c3c0 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
1c3d0 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
1c3e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c3f0 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
1c400 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20  (pToplevel);.   
1c410 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
1c420 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ../*.** If argum
1c430 65 6e 74 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c  ent zDb is NULL,
1c440 20 74 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74   then call sqlit
1c450 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
1c460 6d 61 28 29 20 66 6f 72 20 65 61 63 68 20 0a 2a  ma() for each .*
1c470 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  * attached datab
1c480 61 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ase. Otherwise, 
1c490 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72 20 74 68  invoke it for th
1c4a0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64  e database named
1c4b0 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f   zDb only..*/.vo
1c4c0 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  id sqlite3CodeVe
1c4d0 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28  rifyNamedSchema(
1c4e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
1c4f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b  onst char *zDb){
1c500 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1c510 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1c520 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
1c530 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
1c540 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20  {.    Db *pDb = 
1c550 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
1c560 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 26 26   if( pDb->pBt &&
1c570 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d 73 71 6c   (!zDb || 0==sql
1c580 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
1c590 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 29 20 29 7b   pDb->zName)) ){
1c5a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
1c5b0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
1c5c0 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d  Parse, i);.    }
1c5d0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1c5e0 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
1c5f0 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20 66   that prepares f
1c600 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72  or doing an oper
1c610 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69  ation that.** mi
1c620 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64  ght change the d
1c630 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
1c640 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72  his routine star
1c650 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  ts a new transac
1c660 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e  tion if we are n
1c670 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  ot already withi
1c680 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  n.** a transacti
1c690 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20 61  on.  If we are a
1c6a0 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 61 20  lready within a 
1c6b0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
1c6c0 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a  n a checkpoint.*
1c6d0 2a 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20  * is set if the 
1c6e0 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72  setStatement par
1c6f0 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e 20  ameter is true. 
1c700 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68   A checkpoint sh
1c710 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66  ould.** be set f
1c720 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68  or operations th
1c730 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64  at might fail (d
1c740 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69  ue to a constrai
1c750 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74  nt) part of.** t
1c760 68 65 20 77 61 79 20 74 68 72 6f 75 67 68 20 61  he way through a
1c770 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65  nd which will ne
1c780 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20  ed to undo some 
1c790 77 72 69 74 65 73 20 77 69 74 68 6f 75 74 20 68  writes without h
1c7a0 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c  aving to.** roll
1c7b0 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74  back the whole t
1c7c0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72  ransaction.  For
1c7d0 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72   operations wher
1c7e0 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  e all constraint
1c7f0 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63  s.** can be chec
1c800 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63  ked before any c
1c810 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
1c820 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  to the database,
1c830 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20   it is never.** 
1c840 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64  necessary to und
1c850 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20 74 68  o a write and th
1c860 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f  e checkpoint sho
1c870 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a  uld not be set..
1c880 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
1c890 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
1c8a0 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
1c8b0 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65  , int setStateme
1c8c0 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  nt, int iDb){.  
1c8d0 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
1c8e0 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
1c8f0 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
1c900 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  .  sqlite3CodeVe
1c910 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
1c920 65 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c  e, iDb);.  pTopl
1c930 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 20  evel->writeMask 
1c940 7c 3d 20 28 28 79 44 62 4d 61 73 6b 29 31 29 3c  |= ((yDbMask)1)<
1c950 3c 69 44 62 3b 0a 20 20 70 54 6f 70 6c 65 76 65  <iDb;.  pTopleve
1c960 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  l->isMultiWrite 
1c970 7c 3d 20 73 65 74 53 74 61 74 65 6d 65 6e 74 3b  |= setStatement;
1c980 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
1c990 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74  te that the stat
1c9a0 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20  ement currently 
1c9b0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1c9c0 6f 6e 20 6d 69 67 68 74 20 77 72 69 74 65 0a 2a  on might write.*
1c9d0 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  * more than one 
1c9e0 65 6e 74 72 79 20 28 65 78 61 6d 70 6c 65 3a 20  entry (example: 
1c9f0 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f 77  deleting one row
1ca00 20 74 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20   then inserting 
1ca10 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73 65  another,.** inse
1ca20 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 72  rting multiple r
1ca30 6f 77 73 20 69 6e 20 61 20 74 61 62 6c 65 2c 20  ows in a table, 
1ca40 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 61 20 72  or inserting a r
1ca50 6f 77 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74  ow and index ent
1ca60 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e 20  ries.).** If an 
1ca70 61 62 6f 72 74 20 6f 63 63 75 72 73 20 61 66 74  abort occurs aft
1ca80 65 72 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65  er some of these
1ca90 20 77 72 69 74 65 73 20 68 61 76 65 20 63 6f 6d   writes have com
1caa0 70 6c 65 74 65 64 2c 20 74 68 65 6e 20 69 74 20  pleted, then it 
1cab0 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65 73  will.** be neces
1cac0 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 74 68 65  sary to undo the
1cad0 20 63 6f 6d 70 6c 65 74 65 64 20 77 72 69 74 65   completed write
1cae0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1caf0 65 33 4d 75 6c 74 69 57 72 69 74 65 28 50 61 72  e3MultiWrite(Par
1cb00 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50  se *pParse){.  P
1cb10 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
1cb20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
1cb30 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
1cb40 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d    pToplevel->isM
1cb50 75 6c 74 69 57 72 69 74 65 20 3d 20 31 3b 0a 7d  ultiWrite = 1;.}
1cb60 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 64  ../* .** The cod
1cb70 65 20 67 65 6e 65 72 61 74 6f 72 20 63 61 6c 6c  e generator call
1cb80 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  s this routine i
1cb90 66 20 69 73 20 64 69 73 63 6f 76 65 72 73 20 74  f is discovers t
1cba0 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73  hat it is.** pos
1cbb0 73 69 62 6c 65 20 74 6f 20 61 62 6f 72 74 20 61  sible to abort a
1cbc0 20 73 74 61 74 65 6d 65 6e 74 20 70 72 69 6f 72   statement prior
1cbd0 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20   to completion. 
1cbe0 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a   In order to .**
1cbf0 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 61 62   perform this ab
1cc00 6f 72 74 20 77 69 74 68 6f 75 74 20 63 6f 72 72  ort without corr
1cc10 75 70 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  upting the datab
1cc20 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ase, we need to 
1cc30 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68 61  make.** sure tha
1cc40 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
1cc50 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20  is protected by 
1cc60 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
1cc70 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  saction..**.** T
1cc80 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6f  echnically, we o
1cc90 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 65 74 20  nly need to set 
1cca0 74 68 65 20 6d 61 79 41 62 6f 72 74 20 66 6c 61  the mayAbort fla
1ccb0 67 20 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d 75  g if the.** isMu
1ccc0 6c 74 69 57 72 69 74 65 20 66 6c 61 67 20 77 61  ltiWrite flag wa
1ccd0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74  s previously set
1cce0 2e 20 20 54 68 65 72 65 20 69 73 20 61 20 74 69  .  There is a ti
1ccf0 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a  me dependency.**
1cd00 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 61   such that the a
1cd10 62 6f 72 74 20 6d 75 73 74 20 6f 63 63 75 72 20  bort must occur 
1cd20 61 66 74 65 72 20 74 68 65 20 6d 75 6c 74 69 77  after the multiw
1cd30 72 69 74 65 2e 20 20 54 68 69 73 20 6d 61 6b 65  rite.  This make
1cd40 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65 6d  s.** some statem
1cd50 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 74  ents involving t
1cd60 68 65 20 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c  he REPLACE confl
1cd70 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
1cd80 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20 61  lgorithm.** go a
1cd90 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72 2e 20   little faster. 
1cda0 20 42 75 74 20 74 61 6b 69 6e 67 20 61 64 76 61   But taking adva
1cdb0 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20 74 69  ntage of this ti
1cdc0 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a  me dependency.**
1cdd0 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65 20 64   makes it more d
1cde0 69 66 66 69 63 75 6c 74 20 74 6f 20 70 72 6f 76  ifficult to prov
1cdf0 65 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  e that the code 
1ce00 69 73 20 63 6f 72 72 65 63 74 20 28 69 6e 20 0a  is correct (in .
1ce10 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 2c 20 69  ** particular, i
1ce20 74 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72  t prevents us fr
1ce30 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e 20 65 66  om writing an ef
1ce40 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c 65  fective.** imple
1ce50 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c  mentation of sql
1ce60 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
1ce70 72 74 28 29 29 20 61 6e 64 20 73 6f 20 77 65 20  rt()) and so we 
1ce80 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20 74  have chosen.** t
1ce90 6f 20 74 61 6b 65 20 74 68 65 20 73 61 66 65 20  o take the safe 
1cea0 72 6f 75 74 65 20 61 6e 64 20 73 6b 69 70 20 74  route and skip t
1ceb0 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  he optimization.
1cec0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ced0 4d 61 79 41 62 6f 72 74 28 50 61 72 73 65 20 2a  MayAbort(Parse *
1cee0 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65  pParse){.  Parse
1cef0 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
1cf00 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
1cf10 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54  el(pParse);.  pT
1cf20 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72  oplevel->mayAbor
1cf30 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 1;.}../*.** 
1cf40 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20  Code an OP_Halt 
1cf50 74 68 61 74 20 63 61 75 73 65 73 20 74 68 65 20  that causes the 
1cf60 76 64 62 65 20 74 6f 20 72 65 74 75 72 6e 20 61  vdbe to return a
1cf70 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
1cf80 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68  INT.** error. Th
1cf90 65 20 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65  e onError parame
1cfa0 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ter determines w
1cfb0 68 69 63 68 20 28 69 66 20 61 6e 79 29 20 6f 66  hich (if any) of
1cfc0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
1cfd0 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74  * and/or current
1cfe0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1cff0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
1d000 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61 6c 74  void sqlite3Halt
1d010 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 72 73 65  Constraint(Parse
1d020 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e   *pParse, int on
1d030 45 72 72 6f 72 2c 20 63 68 61 72 20 2a 70 34 2c  Error, char *p4,
1d040 20 69 6e 74 20 70 34 74 79 70 65 29 7b 0a 20 20   int p4type){.  
1d050 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
1d060 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1d070 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d  ;.  if( onError=
1d080 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
1d090 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
1d0a0 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20  (pParse);.  }.  
1d0b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d0c0 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51  4(v, OP_Halt, SQ
1d0d0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c  LITE_CONSTRAINT,
1d0e0 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c   onError, 0, p4,
1d0f0 20 70 34 74 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a   p4type);.}../*.
1d100 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
1d110 69 66 20 70 49 6e 64 65 78 20 75 73 65 73 20 74  if pIndex uses t
1d120 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
1d130 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65  uence pColl.  Re
1d140 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
1d150 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73  it does and fals
1d160 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  e if it does not
1d170 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
1d180 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
1d190 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c  .static int coll
1d1a0 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74  ationMatch(const
1d1b0 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e   char *zColl, In
1d1c0 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20  dex *pIndex){.  
1d1d0 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
1d1e0 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 66   zColl!=0 );.  f
1d1f0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78  or(i=0; i<pIndex
1d200 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
1d210 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1d220 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43  *z = pIndex->azC
1d230 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  oll[i];.    asse
1d240 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20  rt( z!=0 );.    
1d250 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
1d260 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20  rICmp(z, zColl) 
1d270 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1d280 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
1d290 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1d2a0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75  f../*.** Recompu
1d2b0 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
1d2c0 66 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20  f pTab that use 
1d2d0 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
1d2e0 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a  quence pColl..**
1d2f0 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65   If pColl==0 the
1d300 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  n recompute all 
1d310 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e  indices of pTab.
1d320 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1d330 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
1d340 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
1d350 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a  dexTable(Parse *
1d360 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
1d370 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20  Tab, char const 
1d380 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78  *zColl){.  Index
1d390 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
1d3a0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
1d3b0 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
1d3c0 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f  th pTab */..  fo
1d3d0 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70  r(pIndex=pTab->p
1d3e0 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
1d3f0 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e  Index=pIndex->pN
1d400 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 7a 43  ext){.    if( zC
1d410 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74  oll==0 || collat
1d420 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20  ionMatch(zColl, 
1d430 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20  pIndex) ){.     
1d440 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
1d450 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
1d460 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
1d470 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
1d480 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
1d490 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
1d4a0 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
1d4b0 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
1d4c0 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
1d4d0 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20  Index, -1);.    
1d4e0 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
1d4f0 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20  /*.** Recompute 
1d500 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61  all indices of a
1d510 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c  ll tables in all
1d520 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72 65   databases where
1d530 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20   the.** indices 
1d540 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
1d550 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
1d560 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74  .  If pColl==0 t
1d570 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a  hen recompute.**
1d580 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65   all indices eve
1d590 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e  rywhere..*/.#ifn
1d5a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d5b0 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
1d5c0 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61 62  oid reindexDatab
1d5d0 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ases(Parse *pPar
1d5e0 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  se, char const *
1d5f0 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44  zColl){.  Db *pD
1d600 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1d610 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
1d620 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
1d630 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
1d640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d650 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
1d660 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71  x number */.  sq
1d670 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1d680 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65  se->db;   /* The
1d690 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1d6a0 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c  tion */.  HashEl
1d6b0 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20  em *k;          
1d6c0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
1d6d0 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73  ping over tables
1d6e0 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62   in pDb */.  Tab
1d6f0 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
1d700 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
1d710 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
1d720 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ase */..  assert
1d730 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
1d740 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62  ldsAllMutexes(db
1d750 29 20 29 3b 20 20 2f 2a 20 4e 65 65 64 65 64 20  ) );  /* Needed 
1d760 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65 73  for schema acces
1d770 73 20 2a 2f 0a 20 20 66 6f 72 28 69 44 62 3d 30  s */.  for(iDb=0
1d780 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69  , pDb=db->aDb; i
1d790 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1d7a0 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61  +, pDb++){.    a
1d7b0 73 73 65 72 74 28 20 70 44 62 21 3d 30 20 29 3b  ssert( pDb!=0 );
1d7c0 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74  .    for(k=sqlit
1d7d0 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d  eHashFirst(&pDb-
1d7e0 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
1d7f0 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65  h);  k; k=sqlite
1d800 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20  HashNext(k)){.  
1d810 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c      pTab = (Tabl
1d820 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  e*)sqliteHashDat
1d830 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e  a(k);.      rein
1d840 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c  dexTable(pParse,
1d850 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20   pTab, zColl);. 
1d860 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
1d870 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
1d880 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52  e code for the R
1d890 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
1d8a0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49  **.**        REI
1d8b0 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20 20  NDEX            
1d8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8d0 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 1.**        R
1d8e0 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69  EINDEX  <collati
1d8f0 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20 20  on>             
1d900 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20    -- 2.**       
1d910 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61   REINDEX  ?<data
1d920 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d  base>.?<tablenam
1d930 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20  e>  -- 3.**     
1d940 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61     REINDEX  ?<da
1d950 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e  tabase>.?<indexn
1d960 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a  ame>  -- 4.**.**
1d970 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61   Form 1 causes a
1d980 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c  ll indices in al
1d990 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
1d9a0 61 73 65 73 20 74 6f 20 62 65 20 72 65 62 75 69  ases to be rebui
1d9b0 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65  lt..** Form 2 re
1d9c0 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63  builds all indic
1d9d0 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61  es in all databa
1d9e0 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65  ses that use the
1d9f0 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74   named.** collat
1da00 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46  ing function.  F
1da10 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62  orms 3 and 4 reb
1da20 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69  uild the named i
1da30 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69  ndex or all.** i
1da40 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
1da50 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64  d with the named
1da60 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64   table..*/.#ifnd
1da70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
1da80 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69  EINDEX.void sqli
1da90 74 65 33 52 65 69 6e 64 65 78 28 50 61 72 73 65  te3Reindex(Parse
1daa0 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
1dab0 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a  *pName1, Token *
1dac0 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53  pName2){.  CollS
1dad0 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
1dae0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
1daf0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ing sequence to 
1db00 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72  be reindexed, or
1db10 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20   NULL */.  char 
1db20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *z;             
1db30 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1db40 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  f a table or ind
1db50 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ex */.  const ch
1db60 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20  ar *zDb;        
1db70 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1db80 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
1db90 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
1dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dbb0 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  A table in the d
1dbc0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64  atabase */.  Ind
1dbd0 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
1dbe0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
1dbf0 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
1dc00 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69  with pTab */.  i
1dc10 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
1dc20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1dc30 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  e database index
1dc40 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c   number */.  sql
1dc50 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1dc60 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20  e->db;   /* The 
1dc70 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1dc80 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ion */.  Token *
1dc90 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20  pObjName;       
1dca0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1dcb0 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  the table or ind
1dcc0 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ex to be reindex
1dcd0 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64  ed */..  /* Read
1dce0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
1dcf0 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f  hema. If an erro
1dd00 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
1dd10 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
1dd20 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69  .  ** and code i
1dd30 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
1dd40 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69  urn NULL. */.  i
1dd50 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
1dd60 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
1dd70 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72  pParse) ){.    r
1dd80 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66  eturn;.  }..  if
1dd90 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20  ( pName1==0 ){. 
1dda0 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61     reindexDataba
1ddb0 73 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a  ses(pParse, 0);.
1ddc0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65      return;.  }e
1ddd0 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28 70 4e  lse if( NEVER(pN
1dde0 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d  ame2==0) || pNam
1ddf0 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  e2->z==0 ){.    
1de00 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20  char *zColl;.   
1de10 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d   assert( pName1-
1de20 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20  >z );.    zColl 
1de30 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1de40 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
1de50 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  b, pName1);.    
1de60 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74  if( !zColl ) ret
1de70 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  urn;.    pColl =
1de80 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
1de90 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
1dea0 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20   zColl, 0);.    
1deb0 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
1dec0 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61     reindexDataba
1ded0 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  ses(pParse, zCol
1dee0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1def0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c  3DbFree(db, zCol
1df00 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  l);.      return
1df10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1df20 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
1df30 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20  oll);.  }.  iDb 
1df40 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
1df50 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
1df60 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f  me1, pName2, &pO
1df70 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69  bjName);.  if( i
1df80 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db<0 ) return;. 
1df90 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65   z = sqlite3Name
1dfa0 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f  FromToken(db, pO
1dfb0 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  bjName);.  if( z
1dfc0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1dfd0 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
1dfe0 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62  b].zName;.  pTab
1dff0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
1e000 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b  ble(db, z, zDb);
1e010 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20  .  if( pTab ){. 
1e020 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
1e030 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29  pParse, pTab, 0)
1e040 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
1e050 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
1e060 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49  return;.  }.  pI
1e070 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69  ndex = sqlite3Fi
1e080 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a  ndIndex(db, z, z
1e090 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  Db);.  sqlite3Db
1e0a0 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69  Free(db, z);.  i
1e0b0 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
1e0c0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1e0d0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
1e0e0 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
1e0f0 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
1e100 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
1e110 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  ex, -1);.    ret
1e120 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
1e130 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1e140 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64  e, "unable to id
1e150 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63  entify the objec
1e160 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  t to be reindexe
1e170 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  d");.}.#endif../
1e180 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 64 79  *.** Return a dy
1e190 6e 61 6d 69 63 6c 79 20 61 6c 6c 6f 63 61 74 65  namicly allocate
1e1a0 64 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  d KeyInfo struct
1e1b0 75 72 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ure that can be 
1e1c0 75 73 65 64 0a 2a 2a 20 77 69 74 68 20 4f 50 5f  used.** with OP_
1e1d0 4f 70 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f  OpenRead or OP_O
1e1e0 70 65 6e 57 72 69 74 65 20 74 6f 20 61 63 63 65  penWrite to acce
1e1f0 73 73 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  ss database inde
1e200 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66  x pIdx..**.** If
1e210 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 70   successful, a p
1e220 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65  ointer to the ne
1e230 77 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72  w structure is r
1e240 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73  eturned. In this
1e250 20 63 61 73 65 0a 2a 2a 20 74 68 65 20 63 61 6c   case.** the cal
1e260 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
1e270 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 20 73  le for calling s
1e280 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1e290 20 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e   ) on the return
1e2a0 65 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 20  ed .** pointer. 
1e2b0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1e2c0 72 73 20 28 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  rs (out of memor
1e2d0 79 20 6f 72 20 6d 69 73 73 69 6e 67 20 63 6f 6c  y or missing col
1e2e0 6c 61 74 69 6f 6e 20 0a 2a 2a 20 73 65 71 75 65  lation .** seque
1e2f0 6e 63 65 29 2c 20 4e 55 4c 4c 20 69 73 20 72 65  nce), NULL is re
1e300 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73  turned and the s
1e310 74 61 74 65 20 6f 66 20 70 50 61 72 73 65 20 75  tate of pParse u
1e320 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65 63  pdated to reflec
1e330 74 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 0a  t.** the error..
1e340 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
1e350 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
1e360 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
1e370 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69  ndex *pIdx){.  i
1e380 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  nt i;.  int nCol
1e390 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   = pIdx->nColumn
1e3a0 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 20 3d  ;.  int nBytes =
1e3b0 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29   sizeof(KeyInfo)
1e3c0 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65   + (nCol-1)*size
1e3d0 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 6e  of(CollSeq*) + n
1e3e0 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Col;.  sqlite3 *
1e3f0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1e400 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
1e410 20 3d 20 28 4b 65 79 49 6e 66 6f 20 2a 29 73 71   = (KeyInfo *)sq
1e420 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
1e430 6f 28 64 62 2c 20 6e 42 79 74 65 73 29 3b 0a 0a  o(db, nBytes);..
1e440 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
1e450 20 20 70 4b 65 79 2d 3e 64 62 20 3d 20 70 50 61    pKey->db = pPa
1e460 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 4b 65  rse->db;.    pKe
1e470 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  y->aSortOrder = 
1e480 28 75 38 20 2a 29 26 28 70 4b 65 79 2d 3e 61 43  (u8 *)&(pKey->aC
1e490 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 20 20  oll[nCol]);.    
1e4a0 61 73 73 65 72 74 28 20 26 70 4b 65 79 2d 3e 61  assert( &pKey->a
1e4b0 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 3d  SortOrder[nCol]=
1e4c0 3d 26 28 28 28 75 38 20 2a 29 70 4b 65 79 29 5b  =&(((u8 *)pKey)[
1e4d0 6e 42 79 74 65 73 5d 29 20 29 3b 0a 20 20 20 20  nBytes]) );.    
1e4e0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
1e4f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61   i++){.      cha
1e500 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d  r *zColl = pIdx-
1e510 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >azColl[i];.    
1e520 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 20    assert( zColl 
1e530 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61  );.      pKey->a
1e540 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65  Coll[i] = sqlite
1e550 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
1e560 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  Parse, zColl);. 
1e570 20 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74       pKey->aSort
1e580 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d  Order[i] = pIdx-
1e590 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a  >aSortOrder[i];.
1e5a0 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 2d 3e      }.    pKey->
1e5b0 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 43  nField = (u16)nC
1e5c0 6f 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  ol;.  }..  if( p
1e5d0 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
1e5e0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1e5f0 28 64 62 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  (db, pKey);.    
1e600 70 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pKey = 0;.  }.  
1e610 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a     return pKey;.}.