/ Hex Artifact Content
Login

Artifact 2dc09385981bf7f41eae7d3aeb47cb2453813456:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t.h"../*.** This
02f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
0300: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 53 51  ed when a new SQ
0310: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 62  L statement is b
0320: 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62  eginning to.** b
0330: 65 20 70 61 72 73 65 64 2e 20 20 49 6e 69 74 69  e parsed.  Initi
0340: 61 6c 69 7a 65 20 74 68 65 20 70 50 61 72 73 65  alize the pParse
0350: 20 73 74 72 75 63 74 75 72 65 20 61 73 20 6e 65   structure as ne
0360: 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eded..*/.void sq
0370: 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28  lite3BeginParse(
0380: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
0390: 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29 7b  nt explainFlag){
03a0: 0a 20 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  .  pParse->expla
03b0: 69 6e 20 3d 20 28 75 38 29 65 78 70 6c 61 69 6e  in = (u8)explain
03c0: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
03d0: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  nVar = 0;.}..#if
03e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
03f0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0400: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f 63  .** The TableLoc
0410: 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  k structure is o
0420: 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
0430: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0440: 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54 61  () and.** codeTa
0450: 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63 74  bleLocks() funct
0460: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ions..*/.struct 
0470: 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  TableLock {.  in
0480: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
0490: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
04a0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
04b0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f  e table to be lo
04c0: 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  cked */.  int iT
04d0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab;            /
04e0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
04f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0500: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
0510: 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20  8 isWriteLock;  
0520: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
0530: 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c  write lock.  Fal
0540: 73 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f  se for a read lo
0550: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
0560: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
0570: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
0580: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  e */.};../*.** R
0590: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
05a0: 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6c  hat we want to l
05b0: 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20 72  ock a table at r
05c0: 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a 2a  un-time.  .**.**
05d0: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   The table to be
05e0: 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f 74   locked has root
05f0: 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20 69   page iTab and i
0600: 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61 62  s found in datab
0610: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72 65  ase iDb..** A re
0620: 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c 6f  ad or a write lo
0630: 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e 20  ck can be taken 
0640: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73 57  depending on isW
0650: 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ritelock..**.** 
0660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
0670: 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66 61  t records the fa
0680: 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ct that the lock
0690: 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54 68   is desired.  Th
06a0: 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61 6b  e.** code to mak
06b0: 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72  e the lock occur
06c0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
06d0: 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74 6f   a later call to
06e0: 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  .** codeTableLoc
06f0: 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75 72  ks() which occur
0700: 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  s during sqlite3
0710: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
0720: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
0730: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72 73  ableLock(.  Pars
0740: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
0750: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0760: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
0770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0780: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
0790: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
07a0: 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 20  e table to lock 
07b0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
07c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
07d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
07e0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
07f0: 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 73  ocked */.  u8 is
0800: 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f 2a  WriteLock,    /*
0810: 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69 74   True for a writ
0820: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  e lock */.  cons
0830: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 2f  t char *zName  /
0840: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
0850: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
0860: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
0870: 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
0880: 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
0890: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
08a0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 3b  i;.  int nBytes;
08b0: 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b  .  TableLock *p;
08c0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
08d0: 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  0 );..  for(i=0;
08e0: 20 69 3c 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54   i<pToplevel->nT
08f0: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0900: 20 20 20 20 70 20 3d 20 26 70 54 6f 70 6c 65 76      p = &pToplev
0910: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69  el->aTableLock[i
0920: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44  ];.    if( p->iD
0930: 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e 69 54 61  b==iDb && p->iTa
0940: 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20 20 20 20  b==iTab ){.     
0950: 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20   p->isWriteLock 
0960: 3d 20 28 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63  = (p->isWriteLoc
0970: 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b  k || isWriteLock
0980: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
0990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42  .    }.  }..  nB
09a0: 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 54 61  ytes = sizeof(Ta
09b0: 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70 54 6f 70  bleLock) * (pTop
09c0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
09d0: 6b 2b 31 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  k+1);.  pTopleve
09e0: 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 0a  l->aTableLock =.
09f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
0a00: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 54 6f  eallocOrFree(pTo
0a10: 70 6c 65 76 65 6c 2d 3e 64 62 2c 20 70 54 6f 70  plevel->db, pTop
0a20: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
0a30: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a40: 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61  ( pToplevel->aTa
0a50: 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  bleLock ){.    p
0a60: 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61   = &pToplevel->a
0a70: 54 61 62 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c 65  TableLock[pTople
0a80: 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b  vel->nTableLock+
0a90: 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d  +];.    p->iDb =
0aa0: 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61   iDb;.    p->iTa
0ab0: 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d  b = iTab;.    p-
0ac0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69  >isWriteLock = i
0ad0: 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20  sWriteLock;.    
0ae0: 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  p->zName = zName
0af0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
0b00: 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65  Toplevel->nTable
0b10: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70 54  Lock = 0;.    pT
0b20: 6f 70 6c 65 76 65 6c 2d 3e 64 62 2d 3e 6d 61 6c  oplevel->db->mal
0b30: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
0b40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
0b50: 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b   an OP_TableLock
0b60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
0b70: 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b   each table lock
0b80: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61  ed by the.** sta
0b90: 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72  tement (configur
0ba0: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
0bb0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
0bc0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ))..*/.static vo
0bd0: 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  id codeTableLock
0be0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  s(Parse *pParse)
0bf0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0c00: 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56  e *pVdbe; ..  pV
0c10: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dbe = sqlite3Get
0c20: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0c30: 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30  assert( pVdbe!=0
0c40: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65   ); /* sqlite3Ge
0c50: 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69  tVdbe cannot fai
0c60: 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  l: VDBE already 
0c70: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
0c80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
0c90: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69  e->nTableLock; i
0ca0: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f  ++){.    TableLo
0cb0: 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  ck *p = &pParse-
0cc0: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
0cd0: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e      int p1 = p->
0ce0: 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
0cf0: 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65  VdbeAddOp4(pVdbe
0d00: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0d10: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0d20: 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20  isWriteLock,.   
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f     p->zName, P4_
0d50: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
0d60: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63  else.  #define c
0d70: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29  odeTableLocks(x)
0d80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0d90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0da0: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0db0: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0dc0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0dd0: 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45  arsed and a VDBE
0de0: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0df0: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
0e00: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0e10: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
0e20: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
0e30: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
0e40: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
0e50: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0e60: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0e70: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0e80: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0e90: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0ea0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0eb0: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0ec0: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0ed0: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0ee0: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0ef0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
0f00: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
0f10: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
0f20: 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
0f30: 20 2a 76 3b 0a 0a 20 20 64 62 20 3d 20 70 50 61   *v;..  db = pPa
0f40: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64  rse->db;.  if( d
0f50: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0f60: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
0f70: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29  pParse->nested )
0f80: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
0f90: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
0fa0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65 67 69  turn;..  /* Begi
0fb0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
0fc0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
0fd0: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
0fe0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
0ff0: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1000: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1010: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1020: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1030: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1040: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1050: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1060: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
1070: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
1080: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1090: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
10a0: 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  Halt);..    /* T
10b0: 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63  he cookie mask c
10c0: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69 74 20  ontains one bit 
10d0: 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73  for each databas
10e0: 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20  e file open..   
10f0: 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20 66 6f   ** (Bit 0 is fo
1100: 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20 69 73  r main, bit 1 is
1110: 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64 20 73   for temp, and s
1120: 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74 73 20  o forth.)  Bits 
1130: 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 66  are.    ** set f
1140: 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65  or each database
1150: 20 74 68 61 74 20 69 73 20 75 73 65 64 2e 20 20   that is used.  
1160: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1170: 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a 2a 20   start a.    ** 
1180: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65  transaction on e
1190: 61 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73  ach used databas
11a0: 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66 79 20  e and to verify 
11b0: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
11c0: 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68  e.    ** on each
11d0: 20 75 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a   used database..
11e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
11f0: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
1200: 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 79 44 62  o>0 ){.      yDb
1210: 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 20 20 20  Mask mask;.     
1220: 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20   int iDb;.      
1230: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1240: 65 72 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 63  ere(v, pParse->c
1250: 6f 6f 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a 20 20  ookieGoto-1);.  
1260: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 6d      for(iDb=0, m
1270: 61 73 6b 3d 31 3b 20 69 44 62 3c 64 62 2d 3e 6e  ask=1; iDb<db->n
1280: 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44  Db; mask<<=1, iD
1290: 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  b++){.        if
12a0: 28 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65  ( (mask & pParse
12b0: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30  ->cookieMask)==0
12c0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
12d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12e0: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
12f0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1300: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 4f  e3VdbeAddOp2(v,O
1310: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  P_Transaction, i
1320: 44 62 2c 20 28 6d 61 73 6b 20 26 20 70 50 61 72  Db, (mask & pPar
1330: 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d  se->writeMask)!=
1340: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
1350: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
1360: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
1370: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
1380: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
1390: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
13a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13b0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 56 65  eAddOp3(v, OP_Ve
13c0: 72 69 66 79 43 6f 6f 6b 69 65 2c 0a 20 20 20 20  rifyCookie,.    
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 20 20 69 44 62 2c 20 70 50 61          iDb, pPa
13f0: 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65  rse->cookieValue
1400: 5b 69 44 62 5d 2c 0a 20 20 20 20 20 20 20 20 20  [iDb],.         
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
1430: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
1440: 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  tion);.        }
1450: 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
1460: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1470: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
1480: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
1490: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
14a0: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61  ; i<pParse->nVta
14b0: 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  bLock; i++){.   
14c0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 76 74 61         char *vta
14d0: 62 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  b = (char *)sqli
14e0: 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c  te3GetVTable(db,
14f0: 20 70 50 61 72 73 65 2d 3e 61 70 56 74 61 62 4c   pParse->apVtabL
1500: 6f 63 6b 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ock[i]);.       
1510: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1520: 64 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp4(v, OP_VBegi
1530: 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74 61 62  n, 0, 0, 0, vtab
1540: 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
1550: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
1560: 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 20  arse->nVtabLock 
1570: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  = 0;.      }.#en
1580: 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  dif..      /* On
1590: 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69  ce all the cooki
15a0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72  es have been ver
15b0: 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61  ified and transa
15c0: 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a  ctions opened, .
15d0: 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20        ** obtain 
15e0: 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62  the required tab
15f0: 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69  le-locks. This i
1600: 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
1610: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73   the .      ** s
1620: 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74  hared-cache feat
1630: 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  ure is enabled..
1640: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
1650: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50  odeTableLocks(pP
1660: 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  arse);..      /*
1670: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20   Initialize any 
1680: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61  AUTOINCREMENT da
1690: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65  ta structures re
16a0: 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  quired..      */
16b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75  .      sqlite3Au
16c0: 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e  toincrementBegin
16d0: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20  (pParse);..     
16e0: 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a 75 6d   /* Finally, jum
16f0: 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65  p back to the be
1700: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 65  ginning of the e
1710: 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65 2e 20  xecutable code. 
1720: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1730: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1740: 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65  _Goto, 0, pParse
1750: 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29 3b 0a 20  ->cookieGoto);. 
1760: 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20     }.  }...  /* 
1770: 47 65 74 20 74 68 65 20 56 44 42 45 20 70 72 6f  Get the VDBE pro
1780: 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65  gram ready for e
1790: 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20  xecution.  */.  
17a0: 69 66 28 20 76 20 26 26 20 41 4c 57 41 59 53 28  if( v && ALWAYS(
17b0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 29  pParse->nErr==0)
17c0: 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
17d0: 61 69 6c 65 64 20 29 7b 0a 23 69 66 64 65 66 20  ailed ){.#ifdef 
17e0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
17f0: 20 46 49 4c 45 20 2a 74 72 61 63 65 20 3d 20 28   FILE *trace = (
1800: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1810: 54 45 5f 56 64 62 65 54 72 61 63 65 29 21 3d 30  TE_VdbeTrace)!=0
1820: 20 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20   ? stdout : 0;. 
1830: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72     sqlite3VdbeTr
1840: 61 63 65 28 76 2c 20 74 72 61 63 65 29 3b 0a 23  ace(v, trace);.#
1850: 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
1860: 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  ( pParse->iCache
1870: 4c 65 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20  Level==0 );  /* 
1880: 44 69 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d  Disables and re-
1890: 65 6e 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f  enables match */
18a0: 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75  .    /* A minimu
18b0: 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72 20  m of one cursor 
18c0: 69 73 20 72 65 71 75 69 72 65 64 20 69 66 20 61  is required if a
18d0: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73 20  utoincrement is 
18e0: 75 73 65 64 0a 20 20 20 20 2a 20 20 53 65 65 20  used.    *  See 
18f0: 74 69 63 6b 65 74 20 5b 61 36 39 36 33 37 39 63  ticket [a696379c
1900: 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20  1f08866] */.    
1910: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 41 69 6e  if( pParse->pAin
1920: 63 21 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e  c!=0 && pParse->
1930: 6e 54 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65  nTab==0 ) pParse
1940: 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20 20  ->nTab = 1;.    
1950: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
1960: 65 61 64 79 28 76 2c 20 70 50 61 72 73 65 29 3b  eady(v, pParse);
1970: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
1980: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1990: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61     pParse->colNa
19a0: 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65  mesSet = 0;.  }e
19b0: 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  lse{.    pParse-
19c0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  >rc = SQLITE_ERR
19d0: 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65  OR;.  }.  pParse
19e0: 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70 50  ->nTab = 0;.  pP
19f0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a  arse->nMem = 0;.
1a00: 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d    pParse->nSet =
1a10: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56   0;.  pParse->nV
1a20: 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ar = 0;.  pParse
1a30: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30  ->cookieMask = 0
1a40: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  ;.  pParse->cook
1a50: 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f  ieGoto = 0;.}../
1a60: 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70 61 72  *.** Run the par
1a70: 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ser and code gen
1a80: 65 72 61 74 6f 72 20 72 65 63 75 72 73 69 76 65  erator recursive
1a90: 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ly in order to g
1aa0: 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20  enerate.** code 
1ab0: 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74 61 74  for the SQL stat
1ac0: 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f  ement given onto
1ad0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1ae0: 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a  pParse context.*
1af0: 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  * currently unde
1b00: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
1b10: 20 57 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   When the parser
1b20: 20 69 73 20 72 75 6e 20 72 65 63 75 72 73 69 76   is run recursiv
1b30: 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c  ely.** this way,
1b40: 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61   the final OP_Ha
1b50: 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65 6e 64  lt is not append
1b60: 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69 6e 69  ed and other ini
1b70: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61  tialization.** a
1b80: 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  nd finalization 
1b90: 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74 74 65  steps are omitte
1ba0: 64 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20  d because those 
1bb0: 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62 79 20  are handling by 
1bc0: 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74  the.** outermost
1bd0: 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e   parser..**.** N
1be0: 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  ot everything is
1bf0: 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68 69 73   nestable.  This
1c00: 20 66 61 63 69 6c 69 74 79 20 69 73 20 64 65 73   facility is des
1c10: 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69 74 0a  igned to permit.
1c20: 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  ** INSERT, UPDAT
1c30: 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 6f 70  E, and DELETE op
1c40: 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e 73 74  erations against
1c50: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20   SQLITE_MASTER. 
1c60: 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69 66 20   Use.** care if 
1c70: 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20 74 72  you decide to tr
1c80: 79 20 74 6f 20 75 73 65 20 74 68 69 73 20 72 6f  y to use this ro
1c90: 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f  utine for some o
1ca0: 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a  ther purposes..*
1cb0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4e 65  /.void sqlite3Ne
1cc0: 73 74 65 64 50 61 72 73 65 28 50 61 72 73 65 20  stedParse(Parse 
1cd0: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
1ce0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
1cf0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
1d00: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
1d10: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
1d20: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
1d30: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1d40: 0a 23 20 64 65 66 69 6e 65 20 53 41 56 45 5f 53  .# define SAVE_S
1d50: 5a 20 20 28 73 69 7a 65 6f 66 28 50 61 72 73 65  Z  (sizeof(Parse
1d60: 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 50 61 72  ) - offsetof(Par
1d70: 73 65 2c 6e 56 61 72 29 29 0a 20 20 63 68 61 72  se,nVar)).  char
1d80: 20 73 61 76 65 42 75 66 5b 53 41 56 45 5f 53 5a   saveBuf[SAVE_SZ
1d90: 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  ];..  if( pParse
1da0: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
1db0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1dc0: 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20  e->nested<10 ); 
1dd0: 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75   /* Nesting shou
1de0: 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69  ld only be of li
1df0: 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20  mited depth */. 
1e00: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
1e10: 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d  ormat);.  zSql =
1e20: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
1e30: 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  (db, zFormat, ap
1e40: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
1e50: 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
1e60: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20  {.    return;   
1e70: 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74  /* A malloc must
1e80: 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
1e90: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65    }.  pParse->ne
1ea0: 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79  sted++;.  memcpy
1eb0: 28 73 61 76 65 42 75 66 2c 20 26 70 50 61 72 73  (saveBuf, &pPars
1ec0: 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f 53 5a  e->nVar, SAVE_SZ
1ed0: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61  );.  memset(&pPa
1ee0: 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20 53 41  rse->nVar, 0, SA
1ef0: 56 45 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65  VE_SZ);.  sqlite
1f00: 33 52 75 6e 50 61 72 73 65 72 28 70 50 61 72 73  3RunParser(pPars
1f10: 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72 4d 73  e, zSql, &zErrMs
1f20: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
1f30: 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
1f40: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1f50: 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d  e(db, zSql);.  m
1f60: 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d 3e 6e  emcpy(&pParse->n
1f70: 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20 53 41  Var, saveBuf, SA
1f80: 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65  VE_SZ);.  pParse
1f90: 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f  ->nested--;.}../
1fa0: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
1fb0: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
1fc0: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
1fd0: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
1fe0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
1ff0: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
2000: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
2010: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
2020: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
2030: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ** database cont
2040: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
2050: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
2060: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
2070: 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20  ** If zDatabase 
2080: 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61  is 0, all databa
2090: 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64  ses are searched
20a0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61   for the table a
20b0: 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  nd the.** first 
20c0: 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69  matching table i
20d0: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f  s returned.  (No
20e0: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75   checking for du
20f0: 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a  plicate table.**
2100: 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29   names is done.)
2110: 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64    The search ord
2120: 65 72 20 69 73 20 54 45 4d 50 20 66 69 72 73 74  er is TEMP first
2130: 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65  , then MAIN, the
2140: 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61  n any.** auxilia
2150: 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64  ry databases add
2160: 65 64 20 75 73 69 6e 67 20 74 68 65 20 41 54 54  ed using the ATT
2170: 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  ACH command..**.
2180: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
2190: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29  te3LocateTable()
21a0: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
21b0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c  te3FindTable(sql
21c0: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
21d0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
21e0: 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61  st char *zDataba
21f0: 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20  se){.  Table *p 
2200: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
2210: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 61 73 73  int nName;.  ass
2220: 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20 29 3b  ert( zName!=0 );
2230: 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  nName = sqlit
2240: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
2250: 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65  );.  /* All mute
2260: 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  xes are required
2270: 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
2280: 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77  ss.  Make sure w
2290: 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a  e hold them. */.
22a0: 20 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62    assert( zDatab
22b0: 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase!=0 || sqlite
22c0: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
22d0: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20 66  texes(db) );.  f
22e0: 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42  or(i=OMIT_TEMPDB
22f0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
2300: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28  ){.    int j = (
2310: 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20  i<2) ? i^1 : i; 
2320: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
2330: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
2340: 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73      if( zDatabas
2350: 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  e!=0 && sqlite3S
2360: 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65  trICmp(zDatabase
2370: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61  , db->aDb[j].zNa
2380: 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  me) ) continue;.
2390: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
23a0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
23b0: 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a  ld(db, j, 0) );.
23c0: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
23d0: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62  ashFind(&db->aDb
23e0: 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  [j].pSchema->tbl
23f0: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Hash, zName, nNa
2400: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  me);.    if( p )
2410: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
2420: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
2430: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
2440: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
2450: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
2460: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
2470: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
2480: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
2490: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
24a0: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
24b0: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
24c0: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
24d0: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
24e0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
24f0: 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c  t found.  Also l
2500: 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eave an.** error
2510: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
2520: 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
2530: 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
2540: 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
2550: 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74  outine and sqlit
2560: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73  e3FindTable() is
2570: 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f   that this.** ro
2580: 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20  utine leaves an 
2590: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
25a0: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
25b0: 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65   where.** sqlite
25c0: 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65  3FindTable() doe
25d0: 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20  s not..*/.Table 
25e0: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61  *sqlite3LocateTa
25f0: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
2600: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
2610: 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63   context in whic
2620: 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f  h to report erro
2630: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  rs */.  int isVi
2640: 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew,            /
2650: 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69 6e  * True if lookin
2660: 67 20 66 6f 72 20 61 20 56 49 45 57 20 72 61 74  g for a VIEW rat
2670: 68 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c 45  her than a TABLE
2680: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2690: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20   *zName,     /* 
26a0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
26b0: 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  e we are looking
26c0: 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   for */.  const 
26d0: 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20 20  char *zDbase    
26e0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
26f0: 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68 74  database.  Might
2700: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
2710: 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a   Table *p;..  /*
2720: 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
2730: 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
2740: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
2750: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
2760: 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
2770: 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
2780: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
2790: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
27a0: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
27b0: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
27c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
27d0: 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  }..  p = sqlite3
27e0: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
27f0: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  ->db, zName, zDb
2800: 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ase);.  if( p==0
2810: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2820: 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69 65  ar *zMsg = isVie
2830: 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65  w ? "no such vie
2840: 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61  w" : "no such ta
2850: 62 6c 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44  ble";.    if( zD
2860: 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71  base ){.      sq
2870: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2880: 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73  arse, "%s: %s.%s
2890: 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c  ", zMsg, zDbase,
28a0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
28b0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
28c0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
28d0: 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67  , "%s: %s", zMsg
28e0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , zName);.    }.
28f0: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
2900: 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d  kSchema = 1;.  }
2910: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
2920: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
2930: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
2940: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
2950: 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63  bes .** a partic
2960: 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e  ular index given
2970: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
2980: 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  t index.** and t
2990: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
29a0: 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e  atabase that con
29b0: 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e  tains the index.
29c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
29d0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
29e0: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
29f0: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
2a00: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
2a10: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62  d for the.** tab
2a20: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  le and the first
2a30: 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20   matching index 
2a40: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
2a50: 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f  o checking.** fo
2a60: 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65  r duplicate inde
2a70: 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  x names is done.
2a80: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
2a90: 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66  der is.** TEMP f
2aa0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2ab0: 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69   then any auxili
2ac0: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
2ad0: 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ded.** using the
2ae0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
2af0: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
2b00: 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69  e3FindIndex(sqli
2b10: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
2b20: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
2b30: 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
2b40: 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20  Index *p = 0;.  
2b50: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61  int i;.  int nNa
2b60: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2b70: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 2f  en30(zName);.  /
2b80: 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72  * All mutexes ar
2b90: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  e required for s
2ba0: 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d  chema access.  M
2bb0: 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64  ake sure we hold
2bc0: 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65   them. */.  asse
2bd0: 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71  rt( zDb!=0 || sq
2be0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
2bf0: 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
2c00: 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45  .  for(i=OMIT_TE
2c10: 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  MPDB; i<db->nDb;
2c20: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
2c30: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
2c40: 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54   i;  /* Search T
2c50: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
2c60: 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  */.    Schema *p
2c70: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
2c80: 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [j].pSchema;.   
2c90: 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61   assert( pSchema
2ca0: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20   );.    if( zDb 
2cb0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2cc0: 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a  p(zDb, db->aDb[j
2cd0: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
2ce0: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
2cf0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
2d00: 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30  texHeld(db, j, 0
2d10: 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  ) );.    p = sql
2d20: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 53  ite3HashFind(&pS
2d30: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
2d40: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
2d50: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
2d60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
2d70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61  ;.}../*.** Recla
2d80: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73  im the memory us
2d90: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a  ed by an index.*
2da0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
2db0: 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  eeIndex(sqlite3 
2dc0: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a  *db, Index *p){.
2dd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2de0: 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71  MIT_ANALYZE.  sq
2df0: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
2e00: 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a  Samples(db, p);.
2e10: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
2e20: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 43  DbFree(db, p->zC
2e30: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
2e40: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
2e50: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  }../*.** For the
2e60: 20 69 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49   index called zI
2e70: 64 78 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20  dxName which is 
2e80: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74  found in the dat
2e90: 61 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e  abase iDb,.** un
2ea0: 6c 69 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20  like that index 
2eb0: 66 72 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74  from its Table t
2ec0: 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69  hen remove the i
2ed0: 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  ndex from.** the
2ee0: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
2ef0: 65 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d  e and free all m
2f00: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
2f10: 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
2f20: 69 74 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ith the index..*
2f30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
2f40: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
2f50: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
2f60: 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63  int iDb, const c
2f70: 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a  har *zIdxName){.
2f80: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
2f90: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 48 61  .  int len;.  Ha
2fa0: 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73  sh *pHash;..  as
2fb0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
2fc0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
2fd0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48   iDb, 0) );.  pH
2fe0: 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  ash = &db->aDb[i
2ff0: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db].pSchema->idx
3000: 48 61 73 68 3b 0a 20 20 6c 65 6e 20 3d 20 73 71  Hash;.  len = sq
3010: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49  lite3Strlen30(zI
3020: 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65  dxName);.  pInde
3030: 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  x = sqlite3HashI
3040: 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64  nsert(pHash, zId
3050: 78 4e 61 6d 65 2c 20 6c 65 6e 2c 20 30 29 3b 0a  xName, len, 0);.
3060: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e    if( ALWAYS(pIn
3070: 64 65 78 29 20 29 7b 0a 20 20 20 20 69 66 28 20  dex) ){.    if( 
3080: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
3090: 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29  pIndex==pIndex )
30a0: 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
30b0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
30c0: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
30d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30e0: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20   Index *p;.     
30f0: 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f   /* Justificatio
3100: 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3b 20 20  n of ALWAYS();  
3110: 54 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62  The index must b
3120: 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  e on the list of
3130: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 65  .      ** indice
3140: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 20 3d 20  s. */.      p = 
3150: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
3160: 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68  pIndex;.      wh
3170: 69 6c 65 28 20 41 4c 57 41 59 53 28 70 29 20 26  ile( ALWAYS(p) &
3180: 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64  & p->pNext!=pInd
3190: 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  ex ){ p = p->pNe
31a0: 78 74 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  xt; }.      if( 
31b0: 41 4c 57 41 59 53 28 70 20 26 26 20 70 2d 3e 70  ALWAYS(p && p->p
31c0: 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29 20 29 7b  Next==pIndex) ){
31d0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  .        p->pNex
31e0: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
31f0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
3200: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64  .    freeIndex(d
3210: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
3220: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
3230: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
3240: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  ges;.}../*.** Er
3250: 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69  ase all schema i
3260: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
3270: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  the in-memory ha
3280: 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20  sh tables of.** 
3290: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
32a0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
32b0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
32c0: 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20  claim memory.** 
32d0: 62 65 66 6f 72 65 20 74 68 65 20 64 61 74 61 62  before the datab
32e0: 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49 74 20  ase closes.  It 
32f0: 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64  is also called d
3300: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
3310: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65 72  .** if there wer
3320: 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  e schema changes
3330: 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e   during the tran
3340: 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20 61 0a  saction or if a.
3350: 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65  ** schema-cookie
3360: 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75 72 73   mismatch occurs
3370: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30  ..**.** If iDb<0
3380: 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20   then reset the 
3390: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
33a0: 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64  tables for all d
33b0: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73  atabase.** files
33c0: 2e 20 20 49 66 20 69 44 62 3e 3d 30 20 74 68 65  .  If iDb>=0 the
33d0: 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65  n reset the inte
33e0: 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f 72 20  rnal schema for 
33f0: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67  only the.** sing
3400: 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74 65  le file indicate
3410: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
3420: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
3430: 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64  chema(sqlite3 *d
3440: 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69  b, int iDb){.  i
3450: 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 73 73 65 72  nt i, j;.  asser
3460: 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  t( iDb<db->nDb )
3470: 3b 0a 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20  ;..  if( iDb>=0 
3480: 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31  ){.    /* Case 1
3490: 3a 20 20 52 65 73 65 74 20 74 68 65 20 73 69 6e  :  Reset the sin
34a0: 67 6c 65 20 73 63 68 65 6d 61 20 69 64 65 6e 74  gle schema ident
34b0: 69 66 69 65 64 20 62 79 20 69 44 62 20 2a 2f 0a  ified by iDb */.
34c0: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
34d0: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20  b->aDb[iDb];.   
34e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
34f0: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
3500: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
3510: 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e     assert( pDb->
3520: 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20  pSchema!=0 );.  
3530: 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43    sqlite3SchemaC
3540: 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d  lear(pDb->pSchem
3550: 61 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61  a);..    /* If a
3560: 6e 79 20 64 61 74 61 62 61 73 65 20 6f 74 68 65  ny database othe
3570: 72 20 74 68 61 6e 20 54 45 4d 50 20 69 73 20 72  r than TEMP is r
3580: 65 73 65 74 2c 20 74 68 65 6e 20 61 6c 73 6f 20  eset, then also 
3590: 72 65 73 65 74 20 54 45 4d 50 0a 20 20 20 20 2a  reset TEMP.    *
35a0: 2a 20 73 69 6e 63 65 20 54 45 4d 50 20 6d 69 67  * since TEMP mig
35b0: 68 74 20 62 65 20 68 6f 6c 64 69 6e 67 20 74 72  ht be holding tr
35c0: 69 67 67 65 72 73 20 74 68 61 74 20 72 65 66 65  iggers that refe
35d0: 72 65 6e 63 65 20 74 61 62 6c 65 73 20 69 6e 20  rence tables in 
35e0: 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  the.    ** other
35f0: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a   database..    *
3600: 2f 0a 20 20 20 20 69 66 28 20 69 44 62 21 3d 31  /.    if( iDb!=1
3610: 20 29 7b 0a 20 20 20 20 20 20 70 44 62 20 3d 20   ){.      pDb = 
3620: 26 64 62 2d 3e 61 44 62 5b 31 5d 3b 0a 20 20 20  &db->aDb[1];.   
3630: 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e     assert( pDb->
3640: 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20  pSchema!=0 );.  
3650: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
3660: 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68  aClear(pDb->pSch
3670: 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ema);.    }.    
3680: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 2f 2a  return;.  }.  /*
3690: 20 43 61 73 65 20 32 20 28 66 72 6f 6d 20 68 65   Case 2 (from he
36a0: 72 65 20 74 6f 20 74 68 65 20 65 6e 64 29 3a 20  re to the end): 
36b0: 52 65 73 65 74 20 61 6c 6c 20 73 63 68 65 6d 61  Reset all schema
36c0: 73 20 66 6f 72 20 61 6c 6c 20 61 74 74 61 63 68  s for all attach
36d0: 65 64 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  ed.  ** database
36e0: 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  s. */.  assert( 
36f0: 69 44 62 3c 30 20 29 3b 0a 20 20 73 71 6c 69 74  iDb<0 );.  sqlit
3700: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
3710: 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  db);.  for(i=0; 
3720: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
3730: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
3740: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
3750: 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
3760: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3770: 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62  3SchemaClear(pDb
3780: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
3790: 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67  }.  }.  db->flag
37a0: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
37b0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71  ernChanges;.  sq
37c0: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c  lite3VtabUnlockL
37d0: 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ist(db);.  sqlit
37e0: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
37f0: 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  db);..  /* If on
3800: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
3810: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
3820: 61 73 65 20 66 69 6c 65 73 20 68 61 73 20 62 65  ase files has be
3830: 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20  en closed,.  ** 
3840: 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 6d  then remove them
3850: 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c 69   from the auxili
3860: 61 72 79 20 64 61 74 61 62 61 73 65 20 6c 69 73  ary database lis
3870: 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65 0a  t.  We take the.
3880: 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79    ** opportunity
3890: 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72 65   to do this here
38a0: 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6a   since we have j
38b0: 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c 20  ust deleted all 
38c0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68 65  of the.  ** sche
38d0: 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 20 61  ma hash tables a
38e0: 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f 20  nd therefore do 
38f0: 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b 65  not have to make
3900: 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20 2a   any changes.  *
3910: 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73  * to any of thos
3920: 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
3930: 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62   for(i=j=2; i<db
3940: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
3950: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
3960: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
3970: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
3980: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
3990: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
39a0: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
39b0: 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b   pDb->zName = 0;
39c0: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
39d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
39e0: 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  <i ){.      db->
39f0: 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62  aDb[j] = db->aDb
3a00: 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  [i];.    }.    j
3a10: 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ++;.  }.  memset
3a20: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c  (&db->aDb[j], 0,
3a30: 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a   (db->nDb-j)*siz
3a40: 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29  eof(db->aDb[j]))
3a50: 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b  ;.  db->nDb = j;
3a60: 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d  .  if( db->nDb<=
3a70: 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62  2 && db->aDb!=db
3a80: 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20  ->aDbStatic ){. 
3a90: 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44     memcpy(db->aD
3aa0: 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62  bStatic, db->aDb
3ab0: 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61  , 2*sizeof(db->a
3ac0: 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c  Db[0]));.    sql
3ad0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 64  ite3DbFree(db, d
3ae0: 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d  b->aDb);.    db-
3af0: 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74  >aDb = db->aDbSt
3b00: 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  atic;.  }.}../*.
3b10: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3b20: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
3b30: 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a   commit occurs..
3b40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
3b50: 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
3b60: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
3b70: 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  ){.  db->flags &
3b80: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  = ~SQLITE_Intern
3b90: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
3ba0: 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79 20  * Delete memory 
3bb0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
3bc0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f  e column names o
3bd0: 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
3be0: 77 20 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65 2e  w (the.** Table.
3bf0: 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a 2a  aCol[] array)..*
3c00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
3c10: 6c 69 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  liteDeleteColumn
3c20: 4e 61 6d 65 73 28 73 71 6c 69 74 65 33 20 2a 64  Names(sqlite3 *d
3c30: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
3c40: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f  ){.  int i;.  Co
3c50: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73  lumn *pCol;.  as
3c60: 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20  sert( pTable!=0 
3c70: 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d  );.  if( (pCol =
3c80: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d   pTable->aCol)!=
3c90: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
3ca0: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
3cb0: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
3cc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
3cd0: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e  ree(db, pCol->zN
3ce0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
3cf0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
3d00: 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  , pCol->pDflt);.
3d10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
3d20: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44  ree(db, pCol->zD
3d30: 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  flt);.      sqli
3d40: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
3d50: 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20  ol->zType);.    
3d60: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3d70: 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29  db, pCol->zColl)
3d80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
3d90: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
3da0: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d  able->aCol);.  }
3db0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
3dc0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61   the memory data
3dd0: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
3de0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
3df0: 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20  given.** Table. 
3e00: 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
3e10: 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20  made to disk by 
3e20: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
3e30: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3e40: 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68   just deletes th
3e50: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
3e60: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75  .  It does not u
3e70: 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62  nlink.** the tab
3e80: 6c 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  le data structur
3e90: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
3ea0: 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64  table.  But it d
3eb0: 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d  oes destroy.** m
3ec0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
3ed0: 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20   of the indices 
3ee0: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
3ef0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3f00: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a   .** the table..
3f10: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
3f20: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
3f30: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
3f40: 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20  Table){.  Index 
3f50: 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b  *pIndex, *pNext;
3f60: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 54 61  ..  assert( !pTa
3f70: 62 6c 65 20 7c 7c 20 70 54 61 62 6c 65 2d 3e 6e  ble || pTable->n
3f80: 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 44  Ref>0 );..  /* D
3f90: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
3fa0: 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65   table until the
3fb0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
3fc0: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a   reaches zero. *
3fd0: 2f 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65 20  /.  if( !pTable 
3fe0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
3ff0: 28 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42  ((!db || db->pnB
4000: 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26  ytesFreed==0) &&
4010: 20 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 52 65 66   (--pTable->nRef
4020: 29 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  )>0) ) return;..
4030: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
4040: 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
4050: 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62  ed with this tab
4060: 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e  le. */.  for(pIn
4070: 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49  dex = pTable->pI
4080: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
4090: 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ndex=pNext){.   
40a0: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
40b0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65  >pNext;.    asse
40c0: 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  rt( pIndex->pSch
40d0: 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63  ema==pTable->pSc
40e0: 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20  hema );.    if( 
40f0: 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74  !db || db->pnByt
4100: 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20  esFreed==0 ){.  
4110: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
4120: 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b  = pIndex->zName;
4130: 20 0a 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59   .      TESTONLY
4140: 20 28 20 49 6e 64 65 78 20 2a 70 4f 6c 64 20 3d   ( Index *pOld =
4150: 20 29 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   ) sqlite3HashIn
4160: 73 65 72 74 28 0a 09 20 20 26 70 49 6e 64 65 78  sert(..  &pIndex
4170: 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
4180: 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74  sh, zName, sqlit
4190: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
41a0: 29 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  ), 0.      );.  
41b0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d      assert( db==
41c0: 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 63 68 65  0 || sqlite3Sche
41d0: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
41e0: 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  0, pIndex->pSche
41f0: 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ma) );.      ass
4200: 65 72 74 28 20 70 4f 6c 64 3d 3d 70 49 6e 64 65  ert( pOld==pInde
4210: 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29 3b 0a  x || pOld==0 );.
4220: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e      }.    freeIn
4230: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
4240: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
4250: 65 20 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65  e any foreign ke
4260: 79 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ys attached to t
4270: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
4280: 73 71 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28  sqlite3FkDelete(
4290: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20  db, pTable);..  
42a0: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61  /* Delete the Ta
42b0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74  ble structure it
42c0: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  self..  */.  sql
42d0: 69 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  iteDeleteColumnN
42e0: 61 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29  ames(db, pTable)
42f0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
4300: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  e(db, pTable->zN
4310: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
4320: 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65  bFree(db, pTable
4330: 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71  ->zColAff);.  sq
4340: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
4350: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53  e(db, pTable->pS
4360: 65 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65 66 20  elect);.#ifndef 
4370: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
4380: 4b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  K.  sqlite3ExprD
4390: 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65  elete(db, pTable
43a0: 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69  ->pCheck);.#endi
43b0: 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
43c0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
43d0: 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  LE.  sqlite3Vtab
43e0: 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65  Clear(db, pTable
43f0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
4400: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
4410: 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  able);.}../*.** 
4420: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
4430: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
4440: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
4450: 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a  the delete the.*
4460: 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  * table structur
4470: 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69  e with all its i
4480: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
4490: 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64  gn keys..*/.void
44a0: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
44b0: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
44c0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
44d0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
44e0: 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c  TabName){.  Tabl
44f0: 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b  e *p;.  Db *pDb;
4500: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
4510: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
4520: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
4530: 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
4540: 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20  ( zTabName );.  
4550: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
4560: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
4570: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
4580: 74 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61  testcase( zTabNa
4590: 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20  me[0]==0 );  /* 
45a0: 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c  Zero-length tabl
45b0: 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f  e names are allo
45c0: 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26  wed */.  pDb = &
45d0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
45e0: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
45f0: 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68  nsert(&pDb->pSch
4600: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54  ema->tblHash, zT
4610: 61 62 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  abName,.        
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
4640: 7a 54 61 62 4e 61 6d 65 29 2c 30 29 3b 0a 20 20  zTabName),0);.  
4650: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
4660: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d  le(db, p);.  db-
4670: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
4680: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
4690: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
46a0: 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61   token, return a
46b0: 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e   string that con
46c0: 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78  sists of the tex
46d0: 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b  t of that.** tok
46e0: 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  en.  Space to ho
46f0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
4700: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74  string.** is obt
4710: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
4720: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
4730: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
4740: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
4750: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e  nction..**.** An
4760: 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b  y quotation mark
4770: 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20  s (ex:  "name", 
4780: 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20  'name', [name], 
4790: 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a  or `name`) that.
47a0: 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20  ** surround the 
47b0: 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65  body of the toke
47c0: 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a  n are removed..*
47d0: 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20  *.** Tokens are 
47e0: 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74  often just point
47f0: 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ers into the ori
4800: 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61  ginal SQL text a
4810: 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74  nd so.** are not
4820: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
4830: 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72   and are not per
4840: 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65  sistent.  The re
4850: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a  turned string.**
4860: 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61   is \000 termina
4870: 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69  ted and is persi
4880: 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a  stent..*/.char *
4890: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
48a0: 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  oken(sqlite3 *db
48b0: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
48c0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
48d0: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
48e0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
48f0: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
4900: 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c  (char*)pName->z,
4910: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
4920: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
4930: 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Name);.  }else{.
4940: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20      zName = 0;. 
4950: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d   }.  return zNam
4960: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  e;.}../*.** Open
4970: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
4980: 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20  er table stored 
4990: 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62  in database numb
49a0: 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72  er iDb for.** wr
49b0: 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65  iting. The table
49c0: 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67   is opened using
49d0: 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f   cursor 0..*/.vo
49e0: 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61  id sqlite3OpenMa
49f0: 73 74 65 72 54 61 62 6c 65 28 50 61 72 73 65 20  sterTable(Parse 
4a00: 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  *p, int iDb){.  
4a10: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
4a20: 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73  3GetVdbe(p);.  s
4a30: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
4a40: 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52  p, iDb, MASTER_R
4a50: 4f 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54  OOT, 1, SCHEMA_T
4a60: 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 73 71  ABLE(iDb));.  sq
4a70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4a80: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
4a90: 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c   0, MASTER_ROOT,
4aa0: 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   iDb);.  sqlite3
4ab0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
4ac0: 2d 31 2c 20 28 63 68 61 72 20 2a 29 35 2c 20 50  -1, (char *)5, P
4ad0: 34 5f 49 4e 54 33 32 29 3b 20 20 2f 2a 20 35 20  4_INT32);  /* 5 
4ae0: 63 6f 6c 75 6d 6e 20 74 61 62 6c 65 20 2a 2f 0a  column table */.
4af0: 20 20 69 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30    if( p->nTab==0
4b00: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20   ){.    p->nTab 
4b10: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
4b20: 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d  * Parameter zNam
4b30: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75  e points to a nu
4b40: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 62 75 66  l-terminated buf
4b50: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
4b60: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20  he name.** of a 
4b70: 64 61 74 61 62 61 73 65 20 28 22 6d 61 69 6e 22  database ("main"
4b80: 2c 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  , "temp" or the 
4b90: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
4ba0: 68 65 64 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a  hed db). This.**
4bb0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
4bc0: 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
4bd0: 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73  he named databas
4be0: 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20  e in db->aDb[], 
4bf0: 6f 72 0a 2a 2a 20 2d 31 20 69 66 20 74 68 65 20  or.** -1 if the 
4c00: 6e 61 6d 65 64 20 64 62 20 63 61 6e 6e 6f 74 20  named db cannot 
4c10: 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  be found..*/.int
4c20: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
4c30: 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  me(sqlite3 *db, 
4c40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
4c50: 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31  e){.  int i = -1
4c60: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ;         /* Dat
4c70: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  abase number */.
4c80: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
4c90: 20 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 20 20     Db *pDb;.    
4ca0: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
4cb0: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
4cc0: 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e      for(i=(db->n
4cd0: 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e  Db-1), pDb=&db->
4ce0: 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d  aDb[i]; i>=0; i-
4cf0: 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20  -, pDb--){.     
4d00: 20 69 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50   if( (!OMIT_TEMP
4d10: 44 42 20 7c 7c 20 69 21 3d 31 20 29 20 26 26 20  DB || i!=1 ) && 
4d20: 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  n==sqlite3Strlen
4d30: 33 30 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26  30(pDb->zName) &
4d40: 26 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d 3d  & .          0==
4d50: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
4d60: 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  Db->zName, zName
4d70: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  ) ){.        bre
4d80: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4d90: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  }.  }.  return i
4da0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  ;.}../*.** The t
4db0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74  oken *pName cont
4dc0: 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  ains the name of
4dd0: 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69 74   a database (eit
4de0: 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a  her "main" or.**
4df0: 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e   "temp" or the n
4e00: 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68  ame of an attach
4e10: 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75  ed db). This rou
4e20: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
4e30: 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65  .** index of the
4e40: 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
4e50: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72  in db->aDb[], or
4e60: 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64   -1 if the named
4e70: 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74   db .** does not
4e80: 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73   exist..*/.int s
4e90: 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c  qlite3FindDb(sql
4ea0: 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20  ite3 *db, Token 
4eb0: 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *pName){.  int i
4ec0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ee0: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
4ef0: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  er */.  char *zN
4f00: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
4f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4f20: 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 72  Name we are sear
4f30: 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a  ching for */.  z
4f40: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
4f50: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
4f60: 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71  pName);.  i = sq
4f70: 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
4f80: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  db, zName);.  sq
4f90: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4fa0: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
4fb0: 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61   i;.}../* The ta
4fc0: 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74  ble or view or t
4fd0: 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70  rigger name is p
4fe0: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f  assed to this ro
4ff0: 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73  utine via tokens
5000: 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70  .** pName1 and p
5010: 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61  Name2. If the ta
5020: 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c  ble name was ful
5030: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f  ly qualified, fo
5040: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
5050: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
5060: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20  x.yyy (...);.** 
5070: 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20  .** Then pName1 
5080: 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20  is set to "xxx" 
5090: 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22  and pName2 "yyy"
50a0: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
50b0: 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  and if.** the ta
50c0: 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  ble name is not 
50d0: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
50e0: 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45   i.e.:.**.** CRE
50f0: 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e  ATE TABLE yyy(..
5100: 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70  .);.**.** Then p
5110: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
5120: 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32  "yyy" and pName2
5130: 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68   is ""..**.** Th
5140: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
5150: 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f  the *ppUnqual po
5160: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
5170: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
5180: 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32  me1 or.** pName2
5190: 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  ) that stores th
51a0: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61  e unqualified ta
51b0: 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69  ble name.  The i
51c0: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64  ndex of the.** d
51d0: 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69 73  atabase "xxx" is
51e0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
51f0: 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  t sqlite3TwoPart
5200: 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70  Name(.  Parse *p
5210: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
5220: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
5230: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
5240: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
5250: 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54  Name1,      /* T
5260: 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 20  he "xxx" in the 
5270: 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f  name "xxx.yyy" o
5280: 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b  r "xxx" */.  Tok
5290: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
52a0: 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e   /* The "yyy" in
52b0: 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79   the name "xxx.y
52c0: 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  yy" */.  Token *
52d0: 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20  *pUnqual     /* 
52e0: 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c  Write the unqual
52f0: 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d  ified object nam
5300: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
5310: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
5320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
5330: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74  tabase holding t
5340: 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  he object */.  s
5350: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
5360: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
5370: 41 4c 57 41 59 53 28 70 4e 61 6d 65 32 21 3d 30  ALWAYS(pName2!=0
5380: 29 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  ) && pName2->n>0
5390: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
53a0: 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20  init.busy ) {.  
53b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
53c0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72  Msg(pParse, "cor
53d0: 72 75 70 74 20 64 61 74 61 62 61 73 65 22 29 3b  rupt database");
53e0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
53f0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Err++;.      ret
5400: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
5410: 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61    *pUnqual = pNa
5420: 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  me2;.    iDb = s
5430: 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c  qlite3FindDb(db,
5440: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66   pName1);.    if
5450: 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20  ( iDb<0 ){.     
5460: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5470: 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
5480: 6e 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20  n database %T", 
5490: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 70  pName1);.      p
54a0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
54b0: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
54c0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
54d0: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69     assert( db->i
54e0: 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62  nit.iDb==0 || db
54f0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
5500: 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69     iDb = db->ini
5510: 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71  t.iDb;.    *pUnq
5520: 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20  ual = pName1;.  
5530: 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a  }.  return iDb;.
5540: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
5550: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
5560: 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 55 54   check if the UT
5570: 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65  F-8 string zName
5580: 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75   is a legal.** u
5590: 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
55a0: 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61  for a new schema
55b0: 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20   object (table, 
55c0: 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a  index, view or.*
55d0: 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20  * trigger). All 
55e0: 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20  names are legal 
55f0: 65 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61  except those tha
5600: 74 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  t begin with the
5610: 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69   string.** "sqli
5620: 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20  te_" (in upper, 
5630: 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63  lower or mixed c
5640: 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69  ase). This porti
5650: 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70  on of the namesp
5660: 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76  ace.** is reserv
5670: 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  ed for internal 
5680: 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
5690: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
56a0: 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  me(Parse *pParse
56b0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
56c0: 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61  ame){.  if( !pPa
56d0: 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  rse->db->init.bu
56e0: 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65  sy && pParse->ne
56f0: 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20  sted==0 .       
5700: 20 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64     && (pParse->d
5710: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
5720: 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d  E_WriteSchema)==
5730: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30  0.          && 0
5740: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
5750: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
5760: 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71  _", 7) ){.    sq
5770: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5780: 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61  arse, "object na
5790: 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  me reserved for 
57a0: 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73  internal use: %s
57b0: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ", zName);.    r
57c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
57d0: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
57e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
57f0: 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74  *.** Begin const
5800: 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ructing a new ta
5810: 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
5820: 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54  on in memory.  T
5830: 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  his is.** the fi
5840: 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61  rst of several a
5850: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74  ction routines t
5860: 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69  hat get called i
5870: 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f  n response.** to
5880: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
5890: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70  statement.  In p
58a0: 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20  articular, this 
58b0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
58c0: 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e  d.** after seein
58d0: 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45  g tokens "CREATE
58e0: 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e  " and "TABLE" an
58f0: 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  d the table name
5900: 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20  . The isTemp.** 
5910: 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
5920: 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  the table should
5930: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68   be stored in th
5940: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
5950: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73  base.** file ins
5960: 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d  tead of in the m
5970: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
5980: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
5990: 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a  ally the case.**
59a0: 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22   when the "TEMP"
59b0: 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20   or "TEMPORARY" 
59c0: 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69  keyword occurs i
59d0: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45  n between.** CRE
59e0: 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a  ATE and TABLE..*
59f0: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62  *.** The new tab
5a00: 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69  le record is ini
5a10: 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74  tialized and put
5a20: 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   in pParse->pNew
5a30: 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72  Table..** As mor
5a40: 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  e of the CREATE 
5a50: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
5a60: 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74  is parsed, addit
5a70: 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20  ional action.** 
5a80: 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65  routines will be
5a90: 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d   called to add m
5aa0: 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
5ab0: 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a  to this record..
5ac0: 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
5ad0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
5ae0: 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
5af0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
5b00: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  () routine.** is
5b10: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
5b20: 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63  ete the construc
5b30: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
5b40: 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  table record..*/
5b50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61  .void sqlite3Sta
5b60: 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  rtTable(.  Parse
5b70: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
5b80: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
5b90: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
5ba0: 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72  ,   /* First par
5bb0: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
5bc0: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
5bd0: 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ew */.  Token *p
5be0: 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f  Name2,   /* Seco
5bf0: 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  nd part of the n
5c00: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
5c10: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e   or view */.  in
5c20: 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f  t isTemp,      /
5c30: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
5c40: 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a  s a TEMP table *
5c50: 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20  /.  int isView, 
5c60: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5c70: 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a  this is a VIEW *
5c80: 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75 61  /.  int isVirtua
5c90: 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  l,   /* True if 
5ca0: 74 68 69 73 20 69 73 20 61 20 56 49 52 54 55 41  this is a VIRTUA
5cb0: 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  L table */.  int
5cc0: 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a   noErr        /*
5cd0: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
5ce0: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
5cf0: 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
5d00: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61  e *pTable;.  cha
5d10: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a  r *zName = 0; /*
5d20: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
5d30: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
5d40: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
5d50: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
5d60: 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20   *v;.  int iDb; 
5d70: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
5d80: 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72  ase number to cr
5d90: 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  eate the table i
5da0: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
5db0: 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61  ame;    /* Unqua
5dc0: 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
5dd0: 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61  he table to crea
5de0: 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  te */..  /* The 
5df0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
5e00: 6d 65 20 74 6f 20 63 72 65 61 74 65 20 69 73 20  me to create is 
5e10: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
5e20: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
5e30: 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e  s.  ** pName1 an
5e40: 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65  d pName2. If the
5e50: 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20   table name was 
5e60: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
5e70: 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20   for example:.  
5e80: 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54  **.  ** CREATE T
5e90: 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e  ABLE xxx.yyy (..
5ea0: 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54  .);.  ** .  ** T
5eb0: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
5ec0: 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70  t to "xxx" and p
5ed0: 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20  Name2 "yyy". On 
5ee0: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69  the other hand i
5ef0: 66 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65  f.  ** the table
5f00: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c   name is not ful
5f10: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e  ly qualified, i.
5f20: 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52  e.:.  **.  ** CR
5f30: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
5f40: 2e 2e 29 3b 0a 20 20 2a 2a 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 79 79 79 22 20 61 6e 64 20 70  t to "yyy" and p
5f70: 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20 2a  Name2 is ""..  *
5f80: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20  *.  ** The call 
5f90: 62 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20 70  below sets the p
5fa0: 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  Name pointer to 
5fb0: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b  point at the tok
5fc0: 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20  en (pName1 or.  
5fd0: 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20  ** pName2) that 
5fe0: 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61  stores the unqua
5ff0: 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d  lified table nam
6000: 65 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65 20  e. The variable 
6010: 69 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74 20  iDb is.  ** set 
6020: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
6030: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
6040: 74 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  t the table or v
6050: 69 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20 2a  iew is to be.  *
6060: 2a 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20 20  * created in..  
6070: 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  */.  iDb = sqlit
6080: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
6090: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
60a0: 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
60b0: 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74   if( iDb<0 ) ret
60c0: 75 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d 49 54  urn;.  if( !OMIT
60d0: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
60e0: 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  p && pName2->n>0
60f0: 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20 20   && iDb!=1 ){.  
6100: 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67    /* If creating
6110: 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74   a temp table, t
6120: 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20  he name may not 
6130: 62 65 20 71 75 61 6c 69 66 69 65 64 2e 20 55 6e  be qualified. Un
6140: 6c 65 73 73 20 0a 20 20 20 20 2a 2a 20 74 68 65  less .    ** the
6150: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
6160: 73 20 22 74 65 6d 70 22 20 61 6e 79 77 61 79 2e  s "temp" anyway.
6170: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
6180: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6190: 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c   "temporary tabl
61a0: 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75  e name must be u
61b0: 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20  nqualified");.  
61c0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
61d0: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
61e0: 20 26 26 20 69 73 54 65 6d 70 20 29 20 69 44 62   && isTemp ) iDb
61f0: 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d   = 1;..  pParse-
6200: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70  >sNameToken = *p
6210: 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  Name;.  zName = 
6220: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
6230: 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
6240: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
6250: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
6260: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
6270: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
6280: 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
6290: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67   ){.    goto beg
62a0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
62b0: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e    }.  if( db->in
62c0: 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65  it.iDb==1 ) isTe
62d0: 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  mp = 1;.#ifndef 
62e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
62f0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65  ORIZATION.  asse
6300: 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29  rt( (isTemp & 1)
6310: 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a  ==isTemp );.  {.
6320: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
6330: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
6340: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
6350: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
6360: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
6370: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
6380: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
6390: 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
63a0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
63b0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
63c0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
63d0: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
63e0: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
63f0: 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  && isTemp ){.   
6400: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
6410: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
6420: 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
6430: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
6440: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
6450: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
6460: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
6470: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
6480: 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  & isTemp ){.    
6490: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
64a0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
64b0: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
64c0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
64d0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
64e0: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
64f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56    }.    if( !isV
6500: 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65  irtual && sqlite
6510: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
6520: 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20  e, code, zName, 
6530: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
6540: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
6550: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
6560: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
6570: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
6580: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
6590: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
65a0: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
65b0: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
65c0: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
65d0: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
65e0: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
65f0: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
6600: 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70   does. The excep
6610: 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73  tion is if the s
6620: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70  tatement being p
6630: 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64  arsed was passed
6640: 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69  .  ** to an sqli
6650: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
6660: 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74  () call. In that
6670: 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63   case only the c
6680: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a  olumn names.  **
6690: 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20   and types will 
66a0: 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72  be used, so ther
66b0: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
66c0: 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61  test for namespa
66d0: 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f  ce.  ** collisio
66e0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
66f0: 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
6700: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62  ){.    char *zDb
6710: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
6720: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 53  zName;.    if( S
6730: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
6740: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
6750: 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  se) ){.      got
6760: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
6770: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ror;.    }.    p
6780: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46  Table = sqlite3F
6790: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
67a0: 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66  me, zDb);.    if
67b0: 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( pTable ){.    
67c0: 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a    if( !noErr ){.
67d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
67e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
67f0: 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64  "table %T alread
6800: 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65  y exists", pName
6810: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
6820: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6830: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
6840: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6850: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
6860: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
6870: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
6880: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
6890: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
68a0: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49  if( sqlite3FindI
68b0: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
68c0: 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  zDb)!=0 ){.     
68d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
68e0: 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
68f0: 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e  is already an in
6900: 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  dex named %s", z
6910: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
6920: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
6930: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ror;.    }.  }..
6940: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
6950: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
6960: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
6970: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
6980: 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  =0 ){.    db->ma
6990: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
69a0: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
69b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
69c0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
69d0: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69  +;.    goto begi
69e0: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
69f0: 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61   }.  pTable->zNa
6a00: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54  me = zName;.  pT
6a10: 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  able->iPKey = -1
6a20: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68  ;.  pTable->pSch
6a30: 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ema = db->aDb[iD
6a40: 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54  b].pSchema;.  pT
6a50: 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  able->nRef = 1;.
6a60: 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 45 73    pTable->nRowEs
6a70: 74 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 61  t = 1000000;.  a
6a80: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
6a90: 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  NewTable==0 );. 
6aa0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
6ab0: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20  le = pTable;..  
6ac0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
6ad0: 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73  e magic sqlite_s
6ae0: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73  equence table us
6af0: 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d  ed by autoincrem
6b00: 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  ent,.  ** then r
6b10: 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20  ecord a pointer 
6b20: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e  to this table in
6b30: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
6b40: 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
6b50: 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54  * so that INSERT
6b60: 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61   can find the ta
6b70: 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f  ble easily..  */
6b80: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6b90: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
6ba0: 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  NT.  if( !pParse
6bb0: 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72 63  ->nested && strc
6bc0: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
6bd0: 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20  e_sequence")==0 
6be0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
6bf0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
6c00: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
6c10: 29 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  ) );.    pTable-
6c20: 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61  >pSchema->pSeqTa
6c30: 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a  b = pTable;.  }.
6c40: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67  #endif..  /* Beg
6c50: 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  in generating th
6c60: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
6c70: 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c   insert the tabl
6c80: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20  e record into.  
6c90: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  ** the SQLITE_MA
6ca0: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74  STER table.  Not
6cb0: 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20  e in particular 
6cc0: 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20  that we must go 
6cd0: 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61  ahead.  ** and a
6ce0: 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f  llocate the reco
6cf0: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
6d00: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f  e table entry no
6d10: 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20  w.  Before any. 
6d20: 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
6d30: 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72  or UNIQUE keywor
6d40: 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20  ds are parsed.  
6d50: 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77  Those keywords w
6d60: 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69  ill cause.  ** i
6d70: 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65  ndices to be cre
6d80: 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62  ated and the tab
6d90: 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63  le record must c
6da0: 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a  ome before the .
6db0: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48    ** indices.  H
6dc0: 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64  ence, the record
6dd0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
6de0: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c  table must be al
6df0: 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77  located.  ** now
6e00: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
6e10: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28  ->init.busy && (
6e20: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
6e30: 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29  be(pParse))!=0 )
6e40: 7b 0a 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20  {.    int j1;.  
6e50: 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74    int fileFormat
6e60: 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20  ;.    int reg1, 
6e70: 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20  reg2, reg3;.    
6e80: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
6e90: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
6ea0: 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66  e, 0, iDb);..#if
6eb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6ec0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
6ed0: 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c 20    if( isVirtual 
6ee0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6ef0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
6f00: 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a  _VBegin);.    }.
6f10: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
6f20: 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  f the file forma
6f30: 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69  t and encoding i
6f40: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
6f50: 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74  ave not been set
6f60: 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  , .    ** set th
6f70: 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20  em now..    */. 
6f80: 20 20 20 72 65 67 31 20 3d 20 70 50 61 72 73 65     reg1 = pParse
6f90: 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70  ->regRowid = ++p
6fa0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
6fb0: 20 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e   reg2 = pParse->
6fc0: 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72  regRoot = ++pPar
6fd0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
6fe0: 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  g3 = ++pParse->n
6ff0: 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
7000: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7010: 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62  _ReadCookie, iDb
7020: 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46 49  , reg3, BTREE_FI
7030: 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20  LE_FORMAT);.    
7040: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
7050: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
7060: 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
7070: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
7080: 66 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 66 69  f, reg3);.    fi
7090: 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e  leFormat = (db->
70a0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c  flags & SQLITE_L
70b0: 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30  egacyFileFmt)!=0
70c0: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
70d0: 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f       1 : SQLITE_
70e0: 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b  MAX_FILE_FORMAT;
70f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7100: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
7110: 65 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74  eger, fileFormat
7120: 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c  , reg3);.    sql
7130: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7140: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
7150: 69 44 62 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f  iDb, BTREE_FILE_
7160: 46 4f 52 4d 41 54 2c 20 72 65 67 33 29 3b 0a 20  FORMAT, reg3);. 
7170: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7180: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
7190: 65 72 2c 20 45 4e 43 28 64 62 29 2c 20 72 65 67  er, ENC(db), reg
71a0: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
71b0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
71c0: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
71d0: 42 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44  BTREE_TEXT_ENCOD
71e0: 49 4e 47 2c 20 72 65 67 33 29 3b 0a 20 20 20 20  ING, reg3);.    
71f0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
7200: 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 20  ere(v, j1);..   
7210: 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72   /* This just cr
7220: 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f  eates a place-ho
7230: 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74  lder record in t
7240: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
7250: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54   table..    ** T
7260: 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74 65  he record create
7270: 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  d does not conta
7280: 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e  in anything yet.
7290: 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70    It will be rep
72a0: 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  laced.    ** by 
72b0: 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69  the real entry i
72c0: 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  n code generated
72d0: 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61   at sqlite3EndTa
72e0: 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ble()..    **.  
72f0: 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66    ** The rowid f
7300: 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  or the new entry
7310: 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69   is left in regi
7320: 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67  ster pParse->reg
7330: 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68  Rowid..    ** Th
7340: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
7350: 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  er of the new ta
7360: 62 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72  ble is left in r
7370: 65 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  eg pParse->regRo
7380: 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  ot..    ** The r
7390: 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61  owid and root pa
73a0: 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73  ge number values
73b0: 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74   are needed by t
73c0: 68 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20  he code that.   
73d0: 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61   ** sqlite3EndTa
73e0: 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  ble will generat
73f0: 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64  e..    */.#if !d
7400: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
7410: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
7420: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
7430: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20  _VIRTUALTABLE). 
7440: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c     if( isView ||
7450: 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20   isVirtual ){.  
7460: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7470: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
7480: 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20  ger, 0, reg2);. 
7490: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
74a0: 20 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69      {.      sqli
74b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
74c0: 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c   OP_CreateTable,
74d0: 20 69 44 62 2c 20 72 65 67 32 29 3b 0a 20 20 20   iDb, reg2);.   
74e0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70   }.    sqlite3Op
74f0: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50  enMasterTable(pP
7500: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
7510: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7520: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
7530: 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  , 0, reg1);.    
7540: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7550: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
7560: 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69   reg3);.    sqli
7570: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7580: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72   OP_Insert, 0, r
7590: 65 67 33 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  eg3, reg1);.    
75a0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
75b0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
75c0: 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74  PEND);.    sqlit
75d0: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
75e0: 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a  OP_Close);.  }..
75f0: 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e    /* Normal (non
7600: 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20  -error) return. 
7610: 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  */.  return;..  
7620: 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
7630: 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68  ccurs, we jump h
7640: 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62  ere */.begin_tab
7650: 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69  le_error:.  sqli
7660: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
7670: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
7680: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61  }../*.** This ma
7690: 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20 63  cro is used to c
76a0: 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 72 69 6e  ompare two strin
76b0: 67 73 20 69 6e 20 61 20 63 61 73 65 2d 69 6e 73  gs in a case-ins
76c0: 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65 72 2e  ensitive manner.
76d0: 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69 67 68 74  .** It is slight
76e0: 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e 20 63  ly faster than c
76f0: 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 53 74  alling sqlite3St
7700: 72 49 43 6d 70 28 29 20 64 69 72 65 63 74 6c 79  rICmp() directly
7710: 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63 65  , but.** produce
7720: 73 20 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a 2a  s larger code..*
7730: 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68  *.** WARNING: Th
7740: 69 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20  is macro is not 
7750: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
7760: 74 68 65 20 73 74 72 63 6d 70 28 29 20 66 61 6d  the strcmp() fam
7770: 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75 72  ily. It.** retur
7780: 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74  ns true if the t
7790: 77 6f 20 73 74 72 69 6e 67 73 20 61 72 65 20 65  wo strings are e
77a0: 71 75 61 6c 2c 20 6f 74 68 65 72 77 69 73 65 20  qual, otherwise 
77b0: 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  false..*/.#defin
77c0: 65 20 53 54 52 49 43 4d 50 28 78 2c 20 79 29 20  e STRICMP(x, y) 
77d0: 28 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54  (\.sqlite3UpperT
77e0: 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65  oLower[*(unsigne
77f0: 64 20 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d 20  d char *)(x)]== 
7800: 20 20 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72    \.sqlite3Upper
7810: 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e  ToLower[*(unsign
7820: 65 64 20 63 68 61 72 20 2a 29 28 79 29 5d 20 20  ed char *)(y)]  
7830: 20 20 20 5c 0a 26 26 20 73 71 6c 69 74 65 33 53     \.&& sqlite3S
7840: 74 72 49 43 6d 70 28 28 78 29 2b 31 2c 28 79 29  trICmp((x)+1,(y)
7850: 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20  +1)==0 )../*.** 
7860: 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e  Add a new column
7870: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
7880: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
7890: 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a  nstructed..**.**
78a0: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
78b0: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  s this routine o
78c0: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  nce for each col
78d0: 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  umn declaration.
78e0: 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  ** in a CREATE T
78f0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
7900: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
7910: 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64  le() gets called
7920: 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74  .** first to get
7930: 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20   things going.  
7940: 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  Then this routin
7950: 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
7960: 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a  each.** column..
7970: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
7980: 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a  ddColumn(Parse *
7990: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
79a0: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
79b0: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
79c0: 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20  ar *z;.  Column 
79d0: 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33  *pCol;.  sqlite3
79e0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
79f0: 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  b;.  if( (p = pP
7a00: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
7a10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69  ==0 ) return;.#i
7a20: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  f SQLITE_MAX_COL
7a30: 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f  UMN.  if( p->nCo
7a40: 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  l+1>db->aLimit[S
7a50: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
7a60: 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MN] ){.    sqlit
7a70: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7a80: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
7a90: 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e  umns on %s", p->
7aa0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
7ab0: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rn;.  }.#endif. 
7ac0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65   z = sqlite3Name
7ad0: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
7ae0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  ame);.  if( z==0
7af0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
7b00: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
7b10: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53   i++){.    if( S
7b20: 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f  TRICMP(z, p->aCo
7b30: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20  l[i].zName) ){. 
7b40: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7b50: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75  rMsg(pParse, "du
7b60: 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e  plicate column n
7b70: 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ame: %s", z);.  
7b80: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
7b90: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
7ba0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
7bb0: 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c  }.  if( (p->nCol
7bc0: 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20   & 0x7)==0 ){.  
7bd0: 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a    Column *aNew;.
7be0: 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
7bf0: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70  e3DbRealloc(db,p
7c00: 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b  ->aCol,(p->nCol+
7c10: 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  8)*sizeof(p->aCo
7c20: 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  l[0]));.    if( 
7c30: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
7c40: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7c50: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  b, z);.      ret
7c60: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
7c70: 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20  ->aCol = aNew;. 
7c80: 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e   }.  pCol = &p->
7c90: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20  aCol[p->nCol];. 
7ca0: 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c   memset(pCol, 0,
7cb0: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b   sizeof(p->aCol[
7cc0: 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e  0]));.  pCol->zN
7cd0: 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20  ame = z;. .  /* 
7ce0: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74  If there is no t
7cf0: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63  ype specified, c
7d00: 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20  olumns have the 
7d10: 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79  default affinity
7d20: 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66  .  ** 'NONE'. If
7d30: 20 74 68 65 72 65 20 69 73 20 61 20 74 79 70 65   there is a type
7d40: 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e   specified, then
7d50: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
7d60: 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a  nType() will.  *
7d70: 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74  * be called next
7d80: 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66   to set pCol->af
7d90: 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79  finity correctly
7da0: 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61  ..  */.  pCol->a
7db0: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
7dc0: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e  _AFF_NONE;.  p->
7dd0: 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nCol++;.}../*.**
7de0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
7df0: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
7e00: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
7e10: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
7e20: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
7e30: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
7e40: 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20  .  A "NOT NULL" 
7e50: 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a  constraint has.*
7e60: 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61  * been seen on a
7e70: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72   column.  This r
7e80: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
7e90: 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a  notNull flag on.
7ea0: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75  ** the column cu
7eb0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
7ec0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
7ed0: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f  oid sqlite3AddNo
7ee0: 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61  tNull(Parse *pPa
7ef0: 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72  rse, int onError
7f00: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
7f10: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
7f20: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
7f30: 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e  =0 || NEVER(p->n
7f40: 43 6f 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b  Col<1) ) return;
7f50: 0a 20 20 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43  .  p->aCol[p->nC
7f60: 6f 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20  ol-1].notNull = 
7f70: 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a  (u8)onError;.}..
7f80: 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63  /*.** Scan the c
7f90: 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20  olumn type name 
7fa0: 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54  zType (length nT
7fb0: 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20  ype) and return 
7fc0: 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  the.** associate
7fd0: 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e  d affinity type.
7fe0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7ff0: 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d  ine does a case-
8000: 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72  independent sear
8010: 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20  ch of zType for 
8020: 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e  the .** substrin
8030: 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  gs in the follow
8040: 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e  ing table. If on
8050: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
8060: 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c  ngs is.** found,
8070: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
8080: 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72  ng affinity is r
8090: 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70  eturned. If zTyp
80a0: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f  e contains.** mo
80b0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74  re than one of t
80c0: 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65  he substrings, e
80d0: 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68  ntries toward th
80e0: 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65  e top of .** the
80f0: 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f   table take prio
8100: 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c  rity. For exampl
8110: 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27  e, if zType is '
8120: 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51  BLOBINT', .** SQ
8130: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
8140: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
8150: 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20  .** Substring   
8160: 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20    | Affinity.** 
8170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8190: 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20  .** 'INT'       
81a0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49    | SQLITE_AFF_I
81b0: 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27  NTEGER.** 'CHAR'
81c0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
81d0: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c  _AFF_TEXT.** 'CL
81e0: 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OB'        | SQL
81f0: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
8200: 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20  'TEXT'        | 
8210: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
8220: 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20  ** 'BLOB'       
8230: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   | SQLITE_AFF_NO
8240: 4e 45 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20  NE.** 'REAL'    
8250: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
8260: 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20  _REAL.** 'FLOA' 
8270: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
8280: 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55  AFF_REAL.** 'DOU
8290: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
82a0: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a  TE_AFF_REAL.**.*
82b0: 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
82c0: 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74   substrings in t
82d0: 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61  he above table a
82e0: 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c  re found,.** SQL
82f0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
8300: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
8310: 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69  char sqlite3Affi
8320: 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63  nityType(const c
8330: 68 61 72 20 2a 7a 49 6e 29 7b 0a 20 20 75 33 32  har *zIn){.  u32
8340: 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61   h = 0;.  char a
8350: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
8360: 4e 55 4d 45 52 49 43 3b 0a 0a 20 20 69 66 28 20  NUMERIC;..  if( 
8370: 7a 49 6e 20 29 20 77 68 69 6c 65 28 20 7a 49 6e  zIn ) while( zIn
8380: 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20 28  [0] ){.    h = (
8390: 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55  h<<8) + sqlite3U
83a0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49  pperToLower[(*zI
83b0: 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49  n)&0xff];.    zI
83c0: 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d  n++;.    if( h==
83d0: 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c  (('c'<<24)+('h'<
83e0: 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72  <16)+('a'<<8)+'r
83f0: 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  ') ){           
8400: 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20    /* CHAR */.   
8410: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8420: 41 46 46 5f 54 45 58 54 3b 20 0a 20 20 20 20 7d  AFF_TEXT; .    }
8430: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63  else if( h==(('c
8440: 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29  '<<24)+('l'<<16)
8450: 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29  +('o'<<8)+'b') )
8460: 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20  {       /* CLOB 
8470: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
8480: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
8490: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
84a0: 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27  =(('t'<<24)+('e'
84b0: 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27  <<16)+('x'<<8)+'
84c0: 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20  t') ){       /* 
84d0: 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66  TEXT */.      af
84e0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
84f0: 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EXT;.    }else i
8500: 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29  f( h==(('b'<<24)
8510: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
8520: 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20  <8)+'b')        
8530: 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20    /* BLOB */.   
8540: 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51       && (aff==SQ
8550: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
8560: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
8570: 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20  AFF_REAL) ){.   
8580: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8590: 41 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66 6e 64 65  AFF_NONE;.#ifnde
85a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
85b0: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
85c0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
85d0: 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31  'r'<<24)+('e'<<1
85e0: 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29  6)+('a'<<8)+'l')
85f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41            /* REA
8600: 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  L */.        && 
8610: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
8620: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
8630: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
8640: 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73  F_REAL;.    }els
8650: 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c  e if( h==(('f'<<
8660: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
8670: 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20  o'<<8)+'a')     
8680: 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a       /* FLOA */.
8690: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
86a0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
86b0: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
86c0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
86d0: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  L;.    }else if(
86e0: 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28   h==(('d'<<24)+(
86f0: 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38  'o'<<16)+('u'<<8
8700: 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20  )+'b')          
8710: 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20  /* DOUB */.     
8720: 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54     && aff==SQLIT
8730: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
8740: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
8750: 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65  ITE_AFF_REAL;.#e
8760: 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69  ndif.    }else i
8770: 66 28 20 28 68 26 30 78 30 30 46 46 46 46 46 46  f( (h&0x00FFFFFF
8780: 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27  )==(('i'<<16)+('
8790: 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20  n'<<8)+'t') ){  
87a0: 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20    /* INT */.    
87b0: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
87c0: 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  FF_INTEGER;.    
87d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
87e0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 66 66   }..  return aff
87f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
8800: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
8810: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
8820: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
8830: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
8840: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
8850: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
8860: 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73   pFirst token is
8870: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f   the first.** to
8880: 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65  ken in the seque
8890: 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68  nce of tokens th
88a0: 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65 20  at describe the 
88b0: 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  type of the.** c
88c0: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
88d0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
88e0: 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74  on.   pLast is t
88f0: 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a  he last token.**
8900: 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65   in the sequence
8910: 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f  .  Use this info
8920: 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74  rmation to const
8930: 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a  ruct a string.**
8940: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
8950: 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74  he typename of t
8960: 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74  he column and st
8970: 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a  ore that string.
8980: 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20  ** in zType..*/ 
8990: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
89a0: 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65  ColumnType(Parse
89b0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
89c0: 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65  *pType){.  Table
89d0: 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *p;.  Column *p
89e0: 43 6f 6c 3b 0a 0a 20 20 70 20 3d 20 70 50 61 72  Col;..  p = pPar
89f0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
8a00: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56   if( p==0 || NEV
8a10: 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20  ER(p->nCol<1) ) 
8a20: 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d  return;.  pCol =
8a30: 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f   &p->aCol[p->nCo
8a40: 6c 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  l-1];.  assert( 
8a50: 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29  pCol->zType==0 )
8a60: 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20  ;.  pCol->zType 
8a70: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
8a80: 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
8a90: 62 2c 20 70 54 79 70 65 29 3b 0a 20 20 70 43 6f  b, pType);.  pCo
8aa0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
8ab0: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
8ac0: 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a  e(pCol->zType);.
8ad0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70  }../*.** The exp
8ae0: 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64  ression is the d
8af0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
8b00: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
8b10: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a  ly added column.
8b20: 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
8b30: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
8b40: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a  construction..**
8b50: 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75  .** Default valu
8b60: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75  e expressions mu
8b70: 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20  st be constant. 
8b80: 20 52 61 69 73 65 20 61 6e 20 65 78 63 65 70 74   Raise an except
8b90: 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69  ion if this.** i
8ba0: 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a  s not the case..
8bb0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8bc0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
8bd0: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
8be0: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
8bf0: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
8c00: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
8c10: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
8c20: 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74  qlite3AddDefault
8c30: 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61  Value(Parse *pPa
8c40: 72 73 65 2c 20 45 78 70 72 53 70 61 6e 20 2a 70  rse, ExprSpan *p
8c50: 53 70 61 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Span){.  Table *
8c60: 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  p;.  Column *pCo
8c70: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  l;.  sqlite3 *db
8c80: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
8c90: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
8ca0: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 21  wTable;.  if( p!
8cb0: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d  =0 ){.    pCol =
8cc0: 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43   &(p->aCol[p->nC
8cd0: 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20  ol-1]);.    if( 
8ce0: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
8cf0: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
8d00: 28 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 20 29  (pSpan->pExpr) )
8d10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
8d20: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8d30: 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f  "default value o
8d40: 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73  f column [%s] is
8d50: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a   not constant",.
8d60: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
8d70: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
8d80: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63 6f  e{.      /* A co
8d90: 70 79 20 6f 66 20 70 45 78 70 72 20 69 73 20 75  py of pExpr is u
8da0: 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74  sed instead of t
8db0: 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20  he original, as 
8dc0: 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20  pExpr contains. 
8dd0: 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74       ** tokens t
8de0: 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c  hat point to vol
8df0: 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 20 54 68  atile memory. Th
8e00: 65 20 27 73 70 61 6e 27 20 6f 66 20 74 68 65 20  e 'span' of the 
8e10: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20  expression.     
8e20: 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 20   ** is required 
8e30: 62 79 20 70 72 61 67 6d 61 20 74 61 62 6c 65 5f  by pragma table_
8e40: 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  info..      */. 
8e50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8e60: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d  Delete(db, pCol-
8e70: 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 70  >pDflt);.      p
8e80: 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c  Col->pDflt = sql
8e90: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
8ea0: 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c 20 45 58  pSpan->pExpr, EX
8eb0: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
8ec0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
8ed0: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66  ee(db, pCol->zDf
8ee0: 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  lt);.      pCol-
8ef0: 3e 7a 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33  >zDflt = sqlite3
8f00: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
8f10: 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61  har*)pSpan->zSta
8f20: 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt,.            
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f40: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70           (int)(p
8f50: 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70  Span->zEnd - pSp
8f60: 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20  an->zStart));.  
8f70: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
8f80: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
8f90: 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d  pSpan->pExpr);.}
8fa0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74  ../*.** Designat
8fb0: 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  e the PRIMARY KE
8fc0: 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  Y for the table.
8fd0: 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73    pList is a lis
8fe0: 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f  t of names .** o
8ff0: 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66  f columns that f
9000: 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20  orm the primary 
9010: 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69  key.  If pList i
9020: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  s NULL, then the
9030: 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  .** most recentl
9040: 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f  y added column o
9050: 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74  f the table is t
9060: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a  he primary key..
9070: 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61  **.** A table ca
9080: 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f  n have at most o
9090: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  ne primary key. 
90a0: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   If the table al
90b0: 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70  ready has.** a p
90c0: 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20  rimary key (and 
90d0: 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f  this is the seco
90e0: 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20  nd primary key) 
90f0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a  then create an.*
9100: 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  * error..**.** I
9110: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
9120: 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65  Y is on a single
9130: 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61   column whose da
9140: 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47 45  tatype is INTEGE
9150: 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69  R,.** then we wi
9160: 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  ll try to use th
9170: 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65  at column as the
9180: 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65   rowid.  Set the
9190: 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20   Table.iPKey.** 
91a0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62  field of the tab
91b0: 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
91c0: 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20  ction to be the 
91d0: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
91e0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
91f0: 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62  KEY column.  Tab
9200: 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20  le.iPKey is set 
9210: 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69  to -1 if there i
9220: 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20  s.** no INTEGER 
9230: 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a  PRIMARY KEY..**.
9240: 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73  ** If the key is
9250: 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20   not an INTEGER 
9260: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
9270: 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  n create a uniqu
9280: 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74  e.** index for t
9290: 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65  he key.  No inde
92a0: 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72  x is created for
92b0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
92c0: 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   KEYs..*/.void s
92d0: 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79  qlite3AddPrimary
92e0: 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Key(.  Parse *pP
92f0: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
9300: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9310: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9320: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69  ,  /* List of fi
9330: 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20  eld names to be 
9340: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
9350: 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
9360: 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
9370: 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63  h a uniqueness c
9380: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74  onflict */.  int
9390: 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f   autoInc,      /
93a0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41 55  * True if the AU
93b0: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77  TOINCREMENT keyw
93c0: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
93d0: 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
93e0: 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  r     /* SQLITE_
93f0: 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45  SO_ASC or SQLITE
9400: 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20  _SO_DESC */.){. 
9410: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
9420: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
9430: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20  ;.  char *zType 
9440: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20  = 0;.  int iCol 
9450: 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70  = -1, i;.  if( p
9460: 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43  Tab==0 || IN_DEC
9470: 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f  LARE_VTAB ) goto
9480: 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69   primary_key_exi
9490: 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74  t;.  if( pTab->t
94a0: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73  abFlags & TF_Has
94b0: 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20  PrimaryKey ){.  
94c0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
94d0: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
94e0: 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68   "table \"%s\" h
94f0: 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
9500: 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70   primary key", p
9510: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
9520: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
9530: 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54  y_exit;.  }.  pT
9540: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
9550: 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79  TF_HasPrimaryKey
9560: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
9570: 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
9580: 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20  Tab->nCol - 1;. 
9590: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43     pTab->aCol[iC
95a0: 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20  ol].isPrimKey = 
95b0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
95c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
95d0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
95e0: 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b       for(iCol=0;
95f0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
9600: 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
9610: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
9620: 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
9630: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61  ].zName, pTab->a
9640: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29  Col[iCol].zName)
9650: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
9660: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
9670: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
9680: 69 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  if( iCol<pTab->n
9690: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Col ){.        p
96a0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
96b0: 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20  isPrimKey = 1;. 
96c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
96d0: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70   if( pList->nExp
96e0: 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b  r>1 ) iCol = -1;
96f0: 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e  .  }.  if( iCol>
9700: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
9710: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79  >nCol ){.    zTy
9720: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
9730: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d  iCol].zType;.  }
9740: 0a 20 20 69 66 28 20 7a 54 79 70 65 20 26 26 20  .  if( zType && 
9750: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
9760: 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29  Type, "INTEGER")
9770: 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 73  ==0.        && s
9780: 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45  ortOrder==SQLITE
9790: 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 70  _SO_ASC ){.    p
97a0: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f  Tab->iPKey = iCo
97b0: 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79  l;.    pTab->key
97c0: 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72  Conf = (u8)onErr
97d0: 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  or;.    assert( 
97e0: 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75  autoInc==0 || au
97f0: 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20  toInc==1 );.    
9800: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
9810: 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74  = autoInc*TF_Aut
9820: 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 7d 65  oincrement;.  }e
9830: 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20  lse if( autoInc 
9840: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
9850: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
9860: 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33  MENT.    sqlite3
9870: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9880: 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20   "AUTOINCREMENT 
9890: 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20  is only allowed 
98a0: 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22  on an ".       "
98b0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
98c0: 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  KEY");.#endif.  
98d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65 78  }else{.    Index
98e0: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c   *p;.    p = sql
98f0: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
9900: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c  pParse, 0, 0, 0,
9910: 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c   pList, onError,
9920: 20 30 2c 20 30 2c 20 73 6f 72 74 4f 72 64 65 72   0, 0, sortOrder
9930: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 20  , 0);.    if( p 
9940: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  ){.      p->auto
9950: 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20 20 20 7d  Index = 2;.    }
9960: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a  .    pList = 0;.
9970: 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79    }..primary_key
9980: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
9990: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
99a0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74  Parse->db, pList
99b0: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
99c0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
99d0: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
99e0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
99f0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
9a00: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
9a10: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 68  oid sqlite3AddCh
9a20: 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  eckConstraint(. 
9a30: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9a40: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
9a50: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
9a60: 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20  *pCheckExpr  /* 
9a70: 54 68 65 20 63 68 65 63 6b 20 65 78 70 72 65 73  The check expres
9a80: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  sion */.){.  sql
9a90: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9aa0: 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53  e->db;.#ifndef S
9ab0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
9ac0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
9ad0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
9ae0: 6c 65 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26  le;.  if( pTab &
9af0: 26 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  & !IN_DECLARE_VT
9b00: 41 42 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  AB ){.    pTab->
9b10: 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33  pCheck = sqlite3
9b20: 45 78 70 72 41 6e 64 28 64 62 2c 20 70 54 61 62  ExprAnd(db, pTab
9b30: 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68 65 63 6b  ->pCheck, pCheck
9b40: 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  Expr);.  }else.#
9b50: 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71  endif.  {.    sq
9b60: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
9b70: 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b  db, pCheckExpr);
9b80: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
9b90: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  t the collation 
9ba0: 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  function of the 
9bb0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61  most recently pa
9bc0: 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d  rsed table colum
9bd0: 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c  n.** to the Coll
9be0: 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f  Seq given..*/.vo
9bf0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
9c00: 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a  lateType(Parse *
9c10: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
9c20: 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20  Token){.  Table 
9c30: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
9c40: 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20  har *zColl;     
9c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75           /* Dequ
9c60: 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c  oted name of col
9c70: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
9c80: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
9c90: 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  ;..  if( (p = pP
9ca0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
9cb0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
9cc0: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
9cd0: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
9ce0: 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  ;.  zColl = sqli
9cf0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
9d00: 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  (db, pToken);.  
9d10: 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74  if( !zColl ) ret
9d20: 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  urn;..  if( sqli
9d30: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
9d40: 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20  (pParse, zColl) 
9d50: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
9d60: 64 78 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b  dx;.    p->aCol[
9d70: 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c  i].zColl = zColl
9d80: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  ;.  .    /* If t
9d90: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63  he column is dec
9da0: 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e  lared as "<name>
9db0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c   PRIMARY KEY COL
9dc0: 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20  LATE <type>",.  
9dd0: 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64    ** then an ind
9de0: 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ex may have been
9df0: 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73   created on this
9e00: 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74   column before t
9e10: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74  he.    ** collat
9e20: 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64  ion type was add
9e30: 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73  ed. Correct this
9e40: 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61   if it is the ca
9e50: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  se..    */.    f
9e60: 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65  or(pIdx=p->pInde
9e70: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
9e80: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
9e90: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
9ea0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
9eb0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
9ec0: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a  Column[0]==i ){.
9ed0: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
9ee0: 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f  Coll[0] = p->aCo
9ef0: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[i].zColl;.    
9f00: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
9f10: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  e{.    sqlite3Db
9f20: 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
9f30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
9f40: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
9f50: 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  rns the collatio
9f60: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64  n sequence for d
9f70: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74  atabase native t
9f80: 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20  ext.** encoding 
9f90: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
9fa0: 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20  e string zName, 
9fb0: 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a  length nName..**
9fc0: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
9fd0: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  sted collation s
9fe0: 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61  equence is not a
9ff0: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74  vailable, or not
a000: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e   available.** in
a010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
a020: 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74  tive encoding, t
a030: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
a040: 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20  tory is invoked 
a050: 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74  to.** request it
a060: 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  . If the collati
a070: 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20  on factory does 
a080: 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20  not supply such 
a090: 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61  a sequence,.** a
a0a0: 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  nd the sequence 
a0b0: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
a0c0: 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63  another text enc
a0d0: 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74  oding, then that
a0e0: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
a0f0: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
a100: 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66  f no versions of
a110: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
a120: 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e  ollations sequen
a130: 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ce are available
a140: 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20  , or.** another 
a150: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
a160: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
a170: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nd an error mess
a180: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
a190: 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a  .** pParse..**.*
a1a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
a1b0: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
a1c0: 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  nd sqlite3FindCo
a1d0: 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20 72  llSeq().  This r
a1e0: 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65  outine.** invoke
a1f0: 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
a200: 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e  factory if the n
a210: 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63  amed collation c
a220: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a  annot be found.*
a230: 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20  * and generates 
a240: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
a250: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
a260: 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  : sqlite3FindCol
a270: 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33 47  lSeq(), sqlite3G
a280: 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43  etCollSeq().*/.C
a290: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c  ollSeq *sqlite3L
a2a0: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72  ocateCollSeq(Par
a2b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
a2c0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
a2d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
a2e0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38  pParse->db;.  u8
a2f0: 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a   enc = ENC(db);.
a300: 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20    u8 initbusy = 
a310: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20  db->init.busy;. 
a320: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
a330: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
a340: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
a350: 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69  b, enc, zName, i
a360: 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20  nitbusy);.  if( 
a370: 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70  !initbusy && (!p
a380: 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e  Coll || !pColl->
a390: 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f  xCmp) ){.    pCo
a3a0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43  ll = sqlite3GetC
a3b0: 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20  ollSeq(db, enc, 
a3c0: 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20  pColl, zName);. 
a3d0: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
a3e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
a3f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
a400: 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f  no such collatio
a410: 6e 20 73 65 71 75 65 6e 63 65 3a 20 25 73 22 2c  n sequence: %s",
a420: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   zName);.    }. 
a430: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f   }..  return pCo
a440: 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  ll;.}.../*.** Ge
a450: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
a460: 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20   will increment 
a470: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
a480: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68  e..**.** The sch
a490: 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73  ema cookie is us
a4a0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
a4b0: 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20  when the schema 
a4c0: 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  for the.** datab
a4d0: 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66  ase changes.  Af
a4e0: 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61 20  ter each schema 
a4f0: 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b  change, the cook
a500: 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e  ie value.** chan
a510: 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f  ges.  When a pro
a520: 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64 73  cess first reads
a530: 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20 72   the schema it r
a540: 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f  ecords the.** co
a550: 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74 65  okie.  Thereafte
a560: 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20 67  r, whenever it g
a570: 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68  oes to access th
a580: 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69  e database,.** i
a590: 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f  t checks the coo
a5a0: 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  kie to make sure
a5b0: 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20   the schema has 
a5c0: 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73  not changed.** s
a5d0: 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74  ince it was last
a5e0: 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   read..**.** Thi
a5f0: 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f  s plan is not co
a600: 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d  mpletely bullet-
a610: 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f  proof.  It is po
a620: 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68  ssible for.** th
a630: 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e  e schema to chan
a640: 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ge multiple time
a650: 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f  s and for the co
a660: 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65  okie to be.** se
a670: 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20  t back to prior 
a680: 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65  value.  But sche
a690: 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 69  ma changes are i
a6a0: 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64  nfrequent.** and
a6b0: 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
a6c0: 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65 20   of hitting the 
a6d0: 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75  same cookie valu
a6e0: 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63  e is only.** 1 c
a6f0: 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20  hance in 2^32.  
a700: 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65 6e  So we're safe en
a710: 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ough..*/.void sq
a720: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
a730: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
a740: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74   int iDb){.  int
a750: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
a760: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
a770: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
a780: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
a790: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
a7a0: 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
a7b0: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
a7c0: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
a7d0: 2c 20 30 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  , 0) );.  sqlite
a7e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a7f0: 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61  P_Integer, db->a
a800: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
a810: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31  >schema_cookie+1
a820: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
a830: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
a840: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
a850: 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45   BTREE_SCHEMA_VE
a860: 52 53 49 4f 4e 2c 20 72 31 29 3b 0a 20 20 73 71  RSION, r1);.  sq
a870: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
a880: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
a890: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72  .}../*.** Measur
a8a0: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
a8b0: 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65  characters neede
a8c0: 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  d to output the 
a8d0: 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66  given.** identif
a8e0: 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ier.  The number
a8f0: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
a900: 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73  es any quotes us
a910: 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e  ed.** but does n
a920: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  ot include the n
a930: 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ull terminator..
a940: 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61  **.** The estima
a950: 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69  te is conservati
a960: 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65  ve.  It might be
a970: 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61   larger that wha
a980: 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e  t is.** really n
a990: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
a9a0: 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68   int identLength
a9b0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
a9c0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28  .  int n;.  for(
a9d0: 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b  n=0; *z; n++, z+
a9e0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
a9f0: 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20  '"' ){ n++; }.  
aa00: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32  }.  return n + 2
aa10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
aa20: 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 69  irst parameter i
aa30: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
aa40: 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  n output buffer.
aa50: 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   The second .** 
aa60: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
aa70: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74  ointer to an int
aa80: 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69  eger that contai
aa90: 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20 61 74  ns the offset at
aaa0: 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72 69  .** which to wri
aab0: 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  te into the outp
aac0: 75 74 20 62 75 66 66 65 72 2e 20 54 68 69 73 20  ut buffer. This 
aad0: 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73 20  function copies 
aae0: 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  the.** nul-termi
aaf0: 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f 69  nated string poi
ab00: 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 74  nted to by the t
ab10: 68 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c 20  hird parameter, 
ab20: 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a  zSignedIdent,.**
ab30: 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
ab40: 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  d offset in the 
ab50: 62 75 66 66 65 72 20 61 6e 64 20 75 70 64 61 74  buffer and updat
ab60: 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66 65  es *pIdx to refe
ab70: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73  r.** to the firs
ab80: 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68 65  t byte after the
ab90: 20 6c 61 73 74 20 62 79 74 65 20 77 72 69 74 74   last byte writt
aba0: 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  en before return
abb0: 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  ing..** .** If t
abc0: 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e 65  he string zSigne
abd0: 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73 20  dIdent consists 
abe0: 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70 68  entirely of alph
abf0: 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61  a-numeric.** cha
ac00: 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e 6f  racters, does no
ac10: 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 64  t begin with a d
ac20: 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74 20  igit and is not 
ac30: 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c 0a  an SQL keyword,.
ac40: 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f  ** then it is co
ac50: 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70  pied to the outp
ac60: 75 74 20 62 75 66 66 65 72 20 65 78 61 63 74 6c  ut buffer exactl
ac70: 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68 65  y as it is. Othe
ac80: 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20  rwise,.** it is 
ac90: 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f 75  quoted using dou
aca0: 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73  ble-quotes..*/.s
acb0: 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74  tatic void ident
acc0: 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74  Put(char *z, int
acd0: 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53   *pIdx, char *zS
ace0: 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75  ignedIdent){.  u
acf0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
ad00: 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  dent = (unsigned
ad10: 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64   char*)zSignedId
ad20: 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  ent;.  int i, j,
ad30: 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20   needQuote;.  i 
ad40: 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72 28  = *pIdx;..  for(
ad50: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
ad60: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73  j++){.    if( !s
ad70: 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 49  qlite3Isalnum(zI
ad80: 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65  dent[j]) && zIde
ad90: 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65  nt[j]!='_' ) bre
ada0: 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75  ak;.  }.  needQu
adb0: 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73 64  ote = sqlite3Isd
adc0: 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 20  igit(zIdent[0]) 
add0: 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72  || sqlite3Keywor
ade0: 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29  dCode(zIdent, j)
adf0: 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20 21  !=TK_ID;.  if( !
ae00: 6e 65 65 64 51 75 6f 74 65 20 29 7b 0a 20 20 20  needQuote ){.   
ae10: 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 7a 49 64   needQuote = zId
ae20: 65 6e 74 5b 6a 5d 3b 0a 20 20 7d 0a 0a 20 20 69  ent[j];.  }..  i
ae30: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
ae40: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66  [i++] = '"';.  f
ae50: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
ae60: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69  ]; j++){.    z[i
ae70: 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b  ++] = zIdent[j];
ae80: 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b  .    if( zIdent[
ae90: 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d  j]=='"' ) z[i++]
aea0: 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66   = '"';.  }.  if
aeb0: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
aec0: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b  i++] = '"';.  z[
aed0: 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20  i] = 0;.  *pIdx 
aee0: 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = i;.}../*.** Ge
aef0: 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20  nerate a CREATE 
af00: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
af10: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
af20: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62  the given.** tab
af30: 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68  le.  Memory to h
af40: 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20  old the text of 
af50: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
af60: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f   obtained.** fro
af70: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
af80: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
af90: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
afa0: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  g function..*/.s
afb0: 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61  tatic char *crea
afc0: 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c 69  teTableStmt(sqli
afd0: 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  te3 *db, Table *
afe0: 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20  p){.  int i, k, 
aff0: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  n;.  char *zStmt
b000: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20  ;.  char *zSep, 
b010: 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20  *zSep2, *zEnd;. 
b020: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
b030: 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   n = 0;.  for(pC
b040: 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d  ol = p->aCol, i=
b050: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
b060: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
b070: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
b080: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20  (pCol->zName) + 
b090: 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64  5;.  }.  n += id
b0a0: 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61  entLength(p->zNa
b0b0: 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20  me);.  if( n<50 
b0c0: 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  ){ .    zSep = "
b0d0: 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22  ";.    zSep2 = "
b0e0: 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22  ,";.    zEnd = "
b0f0: 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  )";.  }else{.   
b100: 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a   zSep = "\n  ";.
b110: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e      zSep2 = ",\n
b120: 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20    ";.    zEnd = 
b130: 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b  "\n)";.  }.  n +
b140: 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c  = 35 + 6*p->nCol
b150: 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69  ;.  zStmt = sqli
b160: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30  te3DbMallocRaw(0
b170: 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d  , n);.  if( zStm
b180: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  t==0 ){.    db->
b190: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
b1a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
b1b0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e    }.  sqlite3_sn
b1c0: 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c  printf(n, zStmt,
b1d0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22   "CREATE TABLE "
b1e0: 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65 33  );.  k = sqlite3
b1f0: 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b  Strlen30(zStmt);
b200: 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d  .  identPut(zStm
b210: 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29  t, &k, p->zName)
b220: 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d  ;.  zStmt[k++] =
b230: 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c   '(';.  for(pCol
b240: 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69  =p->aCol, i=0; i
b250: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
b260: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74  Col++){.    stat
b270: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  ic const char * 
b280: 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d  const azType[] =
b290: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51   {.        /* SQ
b2a0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20  LITE_AFF_TEXT   
b2b0: 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20 20 20   */ " TEXT",.   
b2c0: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
b2d0: 46 46 5f 4e 4f 4e 45 20 20 20 20 2a 2f 20 22 22  FF_NONE    */ ""
b2e0: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
b2f0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
b300: 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20  */ " NUM",.     
b310: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
b320: 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20 49 4e  _INTEGER */ " IN
b330: 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  T",.        /* S
b340: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20  QLITE_AFF_REAL  
b350: 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20 20    */ " REAL".   
b360: 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b   };.    int len;
b370: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
b380: 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c  *zType;..    sql
b390: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d  ite3_snprintf(n-
b3a0: 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53  k, &zStmt[k], zS
b3b0: 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71  ep);.    k += sq
b3c0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a  lite3Strlen30(&z
b3d0: 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53  Stmt[k]);.    zS
b3e0: 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20  ep = zSep2;.    
b3f0: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
b400: 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  &k, pCol->zName)
b410: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
b420: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c  ol->affinity-SQL
b430: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 3e 3d 20  ITE_AFF_TEXT >= 
b440: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
b450: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d   pCol->affinity-
b460: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
b470: 3c 20 41 72 72 61 79 53 69 7a 65 28 61 7a 54 79  < ArraySize(azTy
b480: 70 65 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63  pe) );.    testc
b490: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
b4a0: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
b4b0: 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65 73 74  TEXT );.    test
b4c0: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
b4d0: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
b4e0: 5f 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 74 65 73  _NONE );.    tes
b4f0: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
b500: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
b510: 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20  F_NUMERIC );.   
b520: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
b530: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
b540: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
b550: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
b560: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
b570: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29  QLITE_AFF_REAL )
b580: 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79 70 65  ;.    .    zType
b590: 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e   = azType[pCol->
b5a0: 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c 49 54  affinity - SQLIT
b5b0: 45 5f 41 46 46 5f 54 45 58 54 5d 3b 0a 20 20 20  E_AFF_TEXT];.   
b5c0: 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74   len = sqlite3St
b5d0: 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20  rlen30(zType);. 
b5e0: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
b5f0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
b600: 45 5f 41 46 46 5f 4e 4f 4e 45 20 0a 20 20 20 20  E_AFF_NONE .    
b610: 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c 2d          || pCol-
b620: 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74  >affinity==sqlit
b630: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a  e3AffinityType(z
b640: 54 79 70 65 29 20 29 3b 0a 20 20 20 20 6d 65 6d  Type) );.    mem
b650: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
b660: 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  Type, len);.    
b670: 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73  k += len;.    as
b680: 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20  sert( k<=n );.  
b690: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  }.  sqlite3_snpr
b6a0: 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74  intf(n-k, &zStmt
b6b0: 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29  [k], "%s", zEnd)
b6c0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74  ;.  return zStmt
b6d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
b6e0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
b6f0: 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20  d to report the 
b700: 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74  final ")" that t
b710: 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43  erminates.** a C
b720: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
b730: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
b740: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
b750: 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69   that other acti
b760: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65  on routines have
b770: 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a   been building.*
b780: 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  * is added to th
b790: 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  e internal hash 
b7a0: 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67  tables, assuming
b7b0: 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a   no errors have.
b7c0: 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a  ** occurred..**.
b7d0: 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20  ** An entry for 
b7e0: 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64  the table is mad
b7f0: 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20  e in the master 
b800: 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75  table on disk, u
b810: 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73  nless.** this is
b820: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
b830: 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62  le or db->init.b
b840: 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62  usy==1.  When db
b850: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a  ->init.busy==1.*
b860: 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  * it means we ar
b870: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  e reading the sq
b880: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
b890: 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  e because we jus
b8a0: 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74  t.** connected t
b8b0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  o the database o
b8c0: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71  r because the sq
b8d0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
b8e0: 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c  e has.** recentl
b8f0: 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68  y changed, so th
b900: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73  e entry for this
b910: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
b920: 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20  xists in.** the 
b930: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
b940: 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  ble.  We do not 
b950: 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69  want to create i
b960: 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49  t again..**.** I
b970: 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72  f the pSelect ar
b980: 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
b990: 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  LL, it means tha
b9a0: 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
b9b0: 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  * was called to 
b9c0: 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67  create a table g
b9d0: 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20  enerated from a 
b9e0: 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c  .** "CREATE TABL
b9f0: 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20  E ... AS SELECT 
ba00: 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20  ..." statement. 
ba10: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   The column name
ba20: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  s of.** the new 
ba30: 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68  table will match
ba40: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
ba50: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  of the SELECT..*
ba60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e  /.void sqlite3En
ba70: 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  dTable(.  Parse 
ba80: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
ba90: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
baa0: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
bab0: 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20  Cons,           
bac0: 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e  /* The ',' token
bad0: 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20   after the last 
bae0: 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a  column defn. */.
baf0: 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20    Token *pEnd,  
bb00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
bb10: 20 66 69 6e 61 6c 20 27 29 27 20 74 6f 6b 65 6e   final ')' token
bb20: 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
bb30: 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ABLE */.  Select
bb40: 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20   *pSelect       
bb50: 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d    /* Select from
bb60: 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41   a "CREATE ... A
bb70: 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a  S SELECT" */.){.
bb80: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71    Table *p;.  sq
bb90: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
bba0: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
bbb0: 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d  b;..  if( (pEnd=
bbc0: 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30  =0 && pSelect==0
bbd0: 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ) || db->mallocF
bbe0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
bbf0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 70  urn;.  }.  p = p
bc00: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
bc10: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
bc20: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
bc30: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
bc40: 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a   || !pSelect );.
bc50: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
bc60: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
bc70: 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a  , p->pSchema);..
bc80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
bc90: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52  MIT_CHECK.  /* R
bca0: 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20  esolve names in 
bcb0: 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  all CHECK constr
bcc0: 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73  aint expressions
bcd0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
bce0: 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 53 72  pCheck ){.    Sr
bcf0: 63 4c 69 73 74 20 73 53 72 63 3b 20 20 20 20 20  cList sSrc;     
bd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bd10: 20 46 61 6b 65 20 53 72 63 4c 69 73 74 20 66 6f   Fake SrcList fo
bd20: 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  r pParse->pNewTa
bd30: 62 6c 65 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43  ble */.    NameC
bd40: 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20  ontext sNC;     
bd50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
bd60: 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
bd70: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
bd80: 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28   */..    memset(
bd90: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
bda0: 73 4e 43 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  sNC));.    memse
bdb0: 74 28 26 73 53 72 63 2c 20 30 2c 20 73 69 7a 65  t(&sSrc, 0, size
bdc0: 6f 66 28 73 53 72 63 29 29 3b 0a 20 20 20 20 73  of(sSrc));.    s
bdd0: 53 72 63 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20  Src.nSrc = 1;.  
bde0: 20 20 73 53 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d    sSrc.a[0].zNam
bdf0: 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  e = p->zName;.  
be00: 20 20 73 53 72 63 2e 61 5b 30 5d 2e 70 54 61 62    sSrc.a[0].pTab
be10: 20 3d 20 70 3b 0a 20 20 20 20 73 53 72 63 2e 61   = p;.    sSrc.a
be20: 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31  [0].iCursor = -1
be30: 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65  ;.    sNC.pParse
be40: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73   = pParse;.    s
be50: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 26 73  NC.pSrcList = &s
be60: 53 72 63 3b 0a 20 20 20 20 73 4e 43 2e 69 73 43  Src;.    sNC.isC
be70: 68 65 63 6b 20 3d 20 31 3b 0a 20 20 20 20 69 66  heck = 1;.    if
be80: 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  ( sqlite3Resolve
be90: 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20  ExprNames(&sNC, 
bea0: 70 2d 3e 70 43 68 65 63 6b 29 20 29 7b 0a 20 20  p->pCheck) ){.  
beb0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
bec0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
bed0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
bee0: 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a  OMIT_CHECK) */..
bef0: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
bf00: 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69  init.busy is 1 i
bf10: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
bf20: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
bf30: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
bf40: 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22  ite_master" or "
bf50: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
bf60: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
bf70: 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64   disk..  ** So d
bf80: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
bf90: 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20  he disk again.  
bfa0: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
bfb0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
bfc0: 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
bfd0: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69  from the db->ini
bfe0: 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  t.newTnum field.
bff0: 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62    (The page numb
c000: 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  er.  ** should h
c010: 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65  ave been put the
c020: 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  re by the sqlite
c030: 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29  OpenCb routine.)
c040: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
c050: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
c060: 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69   p->tnum = db->i
c070: 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d  nit.newTnum;.  }
c080: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e  ..  /* If not in
c090: 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e  itializing, then
c0a0: 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64   create a record
c0b0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
c0c0: 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53  le.  ** in the S
c0d0: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
c0e0: 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  le of the databa
c0f0: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  se..  **.  ** If
c100: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f   this is a TEMPO
c110: 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74  RARY table, writ
c120: 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f  e the entry into
c130: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20   the auxiliary. 
c140: 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64   ** file instead
c150: 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   of into the mai
c160: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
c170: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
c180: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
c190: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62    int n;.    Vdb
c1a0: 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a  e *v;.    char *
c1b0: 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69  zType;    /* "vi
c1c0: 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a  ew" or "table" *
c1d0: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  /.    char *zTyp
c1e0: 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20  e2;   /* "VIEW" 
c1f0: 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20  or "TABLE" */.  
c200: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20    char *zStmt;  
c210: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
c220: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72   CREATE TABLE or
c230: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
c240: 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76  tement */..    v
c250: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
c260: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
c270: 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
c280: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71   return;..    sq
c290: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
c2a0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b  v, OP_Close, 0);
c2b0: 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a  ..    /* .    **
c2c0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70   Initialize zTyp
c2d0: 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69  e for the new vi
c2e0: 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20  ew or table..   
c2f0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
c300: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
c310: 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20     /* A regular 
c320: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a  table */.      z
c330: 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a  Type = "table";.
c340: 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22        zType2 = "
c350: 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20  TABLE";.#ifndef 
c360: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
c370: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c380: 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20    /* A view */. 
c390: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69       zType = "vi
c3a0: 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  ew";.      zType
c3b0: 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64  2 = "VIEW";.#end
c3c0: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
c3d0: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52   If this is a CR
c3e0: 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53  EATE TABLE xx AS
c3f0: 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65   SELECT ..., exe
c400: 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a  cute the SELECT.
c410: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
c420: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65   to populate the
c430: 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20   new table. The 
c440: 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
c450: 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20   for the.    ** 
c460: 6e 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20  new table is in 
c470: 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d  register pParse-
c480: 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a  >regRoot..    **
c490: 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65  .    ** Once the
c4a0: 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e   SELECT has been
c4b0: 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65   coded by sqlite
c4c0: 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73  3Select(), it is
c4d0: 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69   in a.    ** sui
c4e0: 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71  table state to q
c4f0: 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  uery for the col
c500: 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79  umn names and ty
c510: 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20  pes to be used. 
c520: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77     ** by the new
c530: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20   table..    **. 
c540: 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63     ** A shared-c
c550: 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ache write-lock 
c560: 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
c570: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
c580: 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a  new table,.    *
c590: 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f  * as a schema-lo
c5a0: 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ck must have alr
c5b0: 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e  eady been obtain
c5c0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e  ed to create it.
c5d0: 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20   Since.    ** a 
c5e0: 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c  schema-lock excl
c5f0: 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64  udes all other d
c600: 61 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74  atabase users, t
c610: 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f  he write-lock wo
c620: 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65  uld.    ** be re
c630: 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a  dundant..    */.
c640: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
c650: 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  ){.      SelectD
c660: 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20  est dest;.      
c670: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a  Table *pSelTab;.
c680: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
c690: 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a  arse->nTab==1);.
c6a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c6b0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
c6c0: 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50 61 72  enWrite, 1, pPar
c6d0: 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62  se->regRoot, iDb
c6e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c6f0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
c700: 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  1);.      pParse
c710: 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20  ->nTab = 2;.    
c720: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
c730: 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
c740: 52 54 5f 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20  RT_Table, 1);.  
c750: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
c760: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
c770: 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  t, &dest);.     
c780: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c790: 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
c7a0: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  1);.      if( pP
c7b0: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b  arse->nErr==0 ){
c7c0: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
c7d0: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
c7e0: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
c7f0: 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  se, pSelect);.  
c800: 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61        if( pSelTa
c810: 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  b==0 ) return;. 
c820: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
c830: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
c840: 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70       p->nCol = p
c850: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
c860: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20        p->aCol = 
c870: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
c880: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e         pSelTab->
c890: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
c8a0: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
c8b0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
c8c0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
c8d0: 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  db, pSelTab);.  
c8e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
c8f0: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
c900: 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
c910: 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74   the CREATE stat
c920: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28  ement */.    if(
c930: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
c940: 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65    zStmt = create
c950: 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 29  TableStmt(db, p)
c960: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c970: 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e     n = (int)(pEn
c980: 64 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73  d->z - pParse->s
c990: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31  NameToken.z) + 1
c9a0: 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  ;.      zStmt = 
c9b0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
c9c0: 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 43  b, .          "C
c9d0: 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20  REATE %s %.*s", 
c9e0: 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73  zType2, n, pPars
c9f0: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a  e->sNameToken.z.
ca00: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
ca10: 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f      /* A slot fo
ca20: 72 20 74 68 65 20 72 65 63 6f 72 64 20 68 61 73  r the record has
ca30: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
ca40: 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a  located in the .
ca50: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41      ** SQLITE_MA
ca60: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20  STER table.  We 
ca70: 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64  just need to upd
ca80: 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69  ate that slot wi
ca90: 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68  th all.    ** th
caa0: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65  e information we
cab0: 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 0a 20  've collected.. 
cac0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
cad0: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
cae0: 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41  rse,.      "UPDA
caf0: 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20  TE %Q.%s ".     
cb00: 20 20 20 20 22 53 45 54 20 74 79 70 65 3d 27 25      "SET type='%
cb10: 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c  s', name=%Q, tbl
cb20: 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61  _name=%Q, rootpa
cb30: 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20 22  ge=#%d, sql=%Q "
cb40: 0a 20 20 20 20 20 20 20 22 57 48 45 52 45 20 72  .       "WHERE r
cb50: 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20 20 20  owid=#%d",.     
cb60: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
cb70: 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
cb80: 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 7a 54  E(iDb),.      zT
cb90: 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e  ype,.      p->zN
cba0: 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e  ame,.      p->zN
cbb0: 61 6d 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73  ame,.      pPars
cbc0: 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20  e->regRoot,.    
cbd0: 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70    zStmt,.      p
cbe0: 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a  Parse->regRowid.
cbf0: 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
cc00: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74  e3DbFree(db, zSt
cc10: 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mt);.    sqlite3
cc20: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
cc30: 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  rse, iDb);..#ifn
cc40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cc50: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
cc60: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
cc70: 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
cc80: 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65  create an sqlite
cc90: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
cca0: 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69  for.    ** keepi
ccb0: 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f  ng track of auto
ccc0: 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a  increment keys..
ccd0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
cce0: 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
ccf0: 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b  Autoincrement ){
cd00: 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d  .      Db *pDb =
cd10: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
cd20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
cd30: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
cd40: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
cd50: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44   );.      if( pD
cd60: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71  b->pSchema->pSeq
cd70: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
cd80: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
cd90: 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
cda0: 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
cdb0: 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73  ABLE %Q.sqlite_s
cdc0: 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71  equence(name,seq
cdd0: 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44  )",.          pD
cde0: 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20  b->zName.       
cdf0: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
ce00: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
ce10: 20 52 65 70 61 72 73 65 20 65 76 65 72 79 74 68   Reparse everyth
ce20: 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75  ing to update ou
ce30: 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20  r internal data 
ce40: 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20  structures */.  
ce50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ce60: 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c  ParseSchemaOp(v,
ce70: 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20   iDb,.          
ce80: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
ce90: 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d  ntf(db, "tbl_nam
cea0: 65 3d 27 25 71 27 22 2c 20 70 2d 3e 7a 4e 61 6d  e='%q'", p->zNam
ceb0: 65 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  e));.  }...  /* 
cec0: 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f  Add the table to
ced0: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
cee0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
cef0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
cf00: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
cf10: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 54  it.busy ){.    T
cf20: 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20  able *pOld;.    
cf30: 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20  Schema *pSchema 
cf40: 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  = p->pSchema;.  
cf50: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
cf60: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
cf70: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
cf80: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
cf90: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 53  e3HashInsert(&pS
cfa0: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
cfb0: 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  p->zName,.      
cfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
cfe0: 72 6c 65 6e 33 30 28 70 2d 3e 7a 4e 61 6d 65 29  rlen30(p->zName)
cff0: 2c 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  ,p);.    if( pOl
d000: 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  d ){.      asser
d010: 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f  t( p==pOld );  /
d020: 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
d030: 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65  ve failed inside
d040: 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f   HashInsert() */
d050: 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  .      db->mallo
d060: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
d070: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
d080: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  .    pParse->pNe
d090: 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  wTable = 0;.    
d0a0: 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20  db->nTable++;.  
d0b0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
d0c0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
d0d0: 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ges;..#ifndef SQ
d0e0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54  LITE_OMIT_ALTERT
d0f0: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d  ABLE.    if( !p-
d100: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
d110: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
d120: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
d130: 72 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d  r *)pParse->sNam
d140: 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20  eToken.z;.      
d150: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20  int nName;.     
d160: 20 61 73 73 65 72 74 28 20 21 70 53 65 6c 65 63   assert( !pSelec
d170: 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45  t && pCons && pE
d180: 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nd );.      if( 
d190: 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  pCons->z==0 ){. 
d1a0: 20 20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70         pCons = p
d1b0: 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  End;.      }.   
d1c0: 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29     nName = (int)
d1d0: 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70  ((const char *)p
d1e0: 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29  Cons->z - zName)
d1f0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f  ;.      p->addCo
d200: 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73  lOffset = 13 + s
d210: 71 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65  qlite3Utf8CharLe
d220: 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  n(zName, nName);
d230: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
d240: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
d250: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
d260: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
d270: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
d280: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72  e in order to cr
d290: 65 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a  eate a new VIEW.
d2a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
d2b0: 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72  reateView(.  Par
d2c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d2d0: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
d2e0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
d2f0: 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f  n *pBegin,     /
d300: 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
d310: 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74  en that begins t
d320: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
d330: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
d340: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
d350: 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
d360: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
d370: 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
d380: 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame2,     /* The
d390: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
d3a0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
d3b0: 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65  e view */.  Sele
d3c0: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f  ct *pSelect,   /
d3d0: 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65  * A SELECT state
d3e0: 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62  ment that will b
d3f0: 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69  ecome the new vi
d400: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
d410: 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 52  mp,        /* TR
d420: 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41  UE for a TEMPORA
d430: 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  RY view */.  int
d440: 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20 20   noErr          
d450: 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72 72 6f  /* Suppress erro
d460: 72 20 6d 65 73 73 61 67 65 73 20 69 66 20 56 49  r messages if VI
d470: 45 57 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  EW already exist
d480: 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  s */.){.  Table 
d490: 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63  *p;.  int n;.  c
d4a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
d4b0: 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62  Token sEnd;.  Db
d4c0: 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f  Fixer sFix;.  To
d4d0: 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a  ken *pName = 0;.
d4e0: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c    int iDb;.  sql
d4f0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
d500: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50  e->db;..  if( pP
d510: 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a  arse->nVar>0 ){.
d520: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
d530: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70 61 72  Msg(pParse, "par
d540: 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20  ameters are not 
d550: 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73  allowed in views
d560: 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  ");.    sqlite3S
d570: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
d580: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
d590: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
d5a0: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
d5b0: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
d5c0: 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c  ame2, isTemp, 1,
d5d0: 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20   0, noErr);.  p 
d5e0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
d5f0: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
d600: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
d610: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
d620: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
d630: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74  Select);.    ret
d640: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
d650: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
d660: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
d670: 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
d680: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
d690: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
d6a0: 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 69  p->pSchema);.  i
d6b0: 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  f( sqlite3FixIni
d6c0: 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
d6d0: 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e   iDb, "view", pN
d6e0: 61 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69  ame).    && sqli
d6f0: 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46  te3FixSelect(&sF
d700: 69 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29  ix, pSelect).  )
d710: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
d720: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
d730: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
d740: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  rn;.  }..  /* Ma
d750: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
d760: 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73   entire SELECT s
d770: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
d780: 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
d790: 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66    ** This will f
d7a0: 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70  orce all the Exp
d7b0: 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73  r.token.z values
d7c0: 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
d7d0: 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
d7e0: 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f  d rather than po
d7f0: 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74  int to the input
d800: 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20   string - which 
d810: 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20  means that.  ** 
d820: 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73  they will persis
d830: 74 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  t after the curr
d840: 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ent sqlite3_exec
d850: 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e  () call returns.
d860: 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65  .  */.  p->pSele
d870: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
d880: 63 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63  ctDup(db, pSelec
d890: 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  t, EXPRDUP_REDUC
d8a0: 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  E);.  sqlite3Sel
d8b0: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
d8c0: 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 64 62  elect);.  if( db
d8d0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
d8e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
d8f0: 7d 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  }.  if( !db->ini
d900: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71  t.busy ){.    sq
d910: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
d920: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
d930: 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  p);.  }..  /* Lo
d940: 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20  cate the end of 
d950: 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20  the CREATE VIEW 
d960: 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65  statement.  Make
d970: 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20   sEnd point to. 
d980: 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a   ** the end..  *
d990: 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73  /.  sEnd = pPars
d9a0: 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20  e->sLastToken;. 
d9b0: 20 69 66 28 20 41 4c 57 41 59 53 28 73 45 6e 64   if( ALWAYS(sEnd
d9c0: 2e 7a 5b 30 5d 21 3d 30 29 20 26 26 20 73 45 6e  .z[0]!=0) && sEn
d9d0: 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20  d.z[0]!=';' ){. 
d9e0: 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e     sEnd.z += sEn
d9f0: 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e  d.n;.  }.  sEnd.
da00: 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e  n = 0;.  n = (in
da10: 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67  t)(sEnd.z - pBeg
da20: 69 6e 2d 3e 7a 29 3b 0a 20 20 7a 20 3d 20 70 42  in->z);.  z = pB
da30: 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65  egin->z;.  while
da40: 28 20 41 4c 57 41 59 53 28 6e 3e 30 29 20 26 26  ( ALWAYS(n>0) &&
da50: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
da60: 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20  z[n-1]) ){ n--; 
da70: 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b  }.  sEnd.z = &z[
da80: 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d  n-1];.  sEnd.n =
da90: 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71   1;..  /* Use sq
daa0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
dab0: 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20  to add the view 
dac0: 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  to the SQLITE_MA
dad0: 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20  STER table */.  
dae0: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
daf0: 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64  pParse, 0, &sEnd
db00: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  , 0);.  return;.
db10: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
db20: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
db30: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
db40: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
db50: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
db60: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
db70: 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ABLE)./*.** The 
db80: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
db90: 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79  pTable is really
dba0: 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69   a VIEW.  Fill i
dbb0: 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a  n the names of.*
dbc0: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  * the columns of
dbd0: 20 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65   the view in the
dbe0: 20 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72   pTable structur
dbf0: 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  e.  Return the n
dc00: 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f  umber.** of erro
dc10: 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  rs.  If an error
dc20: 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61   is seen leave a
dc30: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
dc40: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
dc50: 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
dc60: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
dc70: 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ames(Parse *pPar
dc80: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  se, Table *pTabl
dc90: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65  e){.  Table *pSe
dca0: 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b  lTab;   /* A fak
dcb0: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69  e table from whi
dcc0: 63 68 20 77 65 20 67 65 74 20 74 68 65 20 72 65  ch we get the re
dcd0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65  sult set */.  Se
dce0: 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20  lect *pSel;     
dcf0: 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53  /* Copy of the S
dd00: 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65  ELECT that imple
dd10: 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a  ments the view *
dd20: 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  /.  int nErr = 0
dd30: 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
dd40: 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e  of errors encoun
dd50: 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  tered */.  int n
dd60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
dd70: 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64  Temporarily hold
dd80: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
dd90: 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64  cursors assigned
dda0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
ddb0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
ddc0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
ddd0: 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c  nection for mall
dde0: 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  oc errors */.  i
ddf0: 6e 74 20 28 2a 78 41 75 74 68 29 28 76 6f 69 64  nt (*xAuth)(void
de00: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72  *,int,const char
de10: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  *,const char*,co
de20: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
de30: 63 68 61 72 2a 29 3b 0a 0a 20 20 61 73 73 65 72  char*);..  asser
de40: 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69  t( pTable );..#i
de50: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
de60: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
de70: 20 69 66 28 20 73 71 6c 69 74 65 33 56 74 61 62   if( sqlite3Vtab
de80: 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72  CallConnect(pPar
de90: 73 65 2c 20 70 54 61 62 6c 65 29 20 29 7b 0a 20  se, pTable) ){. 
dea0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
deb0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
dec0: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
ded0: 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  le) ) return 0;.
dee0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
def0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
df00: 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65  .  /* A positive
df10: 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20   nCol means the 
df20: 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f  columns names fo
df30: 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a  r this view are.
df40: 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f    ** already kno
df50: 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  wn..  */.  if( p
df60: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20  Table->nCol>0 ) 
df70: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
df80: 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20  A negative nCol 
df90: 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72  is a special mar
dfa0: 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ker meaning that
dfb0: 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   we are currentl
dfc0: 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f  y.  ** trying to
dfd0: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c   compute the col
dfe0: 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77  umn names.  If w
dff0: 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75  e enter this rou
e000: 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61  tine with.  ** a
e010: 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20   negative nCol, 
e020: 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20  it means two or 
e030: 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20  more views form 
e040: 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69  a loop, like thi
e050: 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
e060: 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65   CREATE VIEW one
e070: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
e080: 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20  M two;.  **     
e090: 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20  CREATE VIEW two 
e0a0: 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
e0b0: 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20   one;.  **.  ** 
e0c0: 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 65 72  Actually, the er
e0d0: 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e 6f 77  ror above is now
e0e0: 20 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f   caught prior to
e0f0: 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 70   reaching this p
e100: 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74  oint..  ** But t
e110: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
e120: 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72  t is still impor
e130: 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65 73 20  tant as it does 
e140: 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20  come up.  ** in 
e150: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20  the following:. 
e160: 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43 52   ** .  **     CR
e170: 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e  EATE TABLE main.
e180: 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20  ex1(a);.  **    
e190: 20 43 52 45 41 54 45 20 54 45 4d 50 20 56 49 45   CREATE TEMP VIE
e1a0: 57 20 65 78 31 20 41 53 20 53 45 4c 45 43 54 20  W ex1 AS SELECT 
e1b0: 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a  a FROM ex1;.  **
e1c0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
e1d0: 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a  OM temp.ex1;.  *
e1e0: 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
e1f0: 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71  nCol<0 ){.    sq
e200: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
e210: 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69  arse, "view %s i
e220: 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66  s circularly def
e230: 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  ined", pTable->z
e240: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
e250: 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 1;.  }.  asser
e260: 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  t( pTable->nCol>
e270: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  =0 );..  /* If w
e280: 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
e290: 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64  it means we need
e2a0: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
e2b0: 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  table names..  *
e2c0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
e2d0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52  call to sqlite3R
e2e0: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
e2f0: 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61  () will expand a
e300: 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d  ny.  ** "*" elem
e310: 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73 75  ents in the resu
e320: 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65 20 76  lts set of the v
e330: 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73  iew and will ass
e340: 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a  ign cursors.  **
e350: 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73   to the elements
e360: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
e370: 75 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20  use.  But we do 
e380: 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20 63  not want these c
e390: 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  hanges.  ** to b
e3a0: 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f  e permanent.  So
e3b0: 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
e3c0: 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f   is done on a co
e3d0: 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
e3e0: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
e3f0: 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
e400: 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73   view..  */.  as
e410: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53  sert( pTable->pS
e420: 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20  elect );.  pSel 
e430: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
e440: 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70  up(db, pTable->p
e450: 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66  Select, 0);.  if
e460: 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 75 38  ( pSel ){.    u8
e470: 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65   enableLookaside
e480: 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65   = db->lookaside
e490: 2e 62 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 6e  .bEnabled;.    n
e4a0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
e4b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  .    sqlite3SrcL
e4c0: 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
e4d0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70  (pParse, pSel->p
e4e0: 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62 6c 65  Src);.    pTable
e4f0: 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20  ->nCol = -1;.   
e500: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
e510: 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 23 69 66  Enabled = 0;.#if
e520: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e530: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
e540: 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78     xAuth = db->x
e550: 41 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41  Auth;.    db->xA
e560: 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 70 53 65  uth = 0;.    pSe
e570: 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
e580: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
e590: 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20  pParse, pSel);. 
e5a0: 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78     db->xAuth = x
e5b0: 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Auth;.#else.    
e5c0: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
e5d0: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
e5e0: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29  ct(pParse, pSel)
e5f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 62 2d  ;.#endif.    db-
e600: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
e610: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 4c 6f 6f 6b  led = enableLook
e620: 61 73 69 64 65 3b 0a 20 20 20 20 70 50 61 72 73  aside;.    pPars
e630: 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20  e->nTab = n;.   
e640: 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a   if( pSelTab ){.
e650: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
e660: 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  able->aCol==0 );
e670: 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  .      pTable->n
e680: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e  Col = pSelTab->n
e690: 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61 62 6c  Col;.      pTabl
e6a0: 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->aCol = pSelTa
e6b0: 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70  b->aCol;.      p
e6c0: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30  SelTab->nCol = 0
e6d0: 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d  ;.      pSelTab-
e6e0: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >aCol = 0;.     
e6f0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
e700: 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29  ble(db, pSelTab)
e710: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e720: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
e730: 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 54  exHeld(db, 0, pT
e740: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29 20 29  able->pSchema) )
e750: 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ;.      pTable->
e760: 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 20 7c  pSchema->flags |
e770: 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  = DB_UnresetView
e780: 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
e790: 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
e7a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72 72   = 0;.      nErr
e7b0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ++;.    }.    sq
e7c0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
e7d0: 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 7d  e(db, pSel);.  }
e7e0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72   else {.    nErr
e7f0: 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ++;.  }.#endif /
e800: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
e810: 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e  EW */.  return n
e820: 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20  Err;  .}.#endif 
e830: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
e840: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
e850: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
e860: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
e870: 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  LE) */..#ifndef 
e880: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
e890: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
e8a0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72   column names fr
e8b0: 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e  om every VIEW in
e8c0: 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a   database idx..*
e8d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
e8e0: 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
e8f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
e900: 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c  t idx){.  HashEl
e910: 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72 74 28  em *i;.  assert(
e920: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
e930: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 64 78 2c  texHeld(db, idx,
e940: 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21 44 62   0) );.  if( !Db
e950: 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20  HasProperty(db, 
e960: 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56  idx, DB_UnresetV
e970: 69 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a  iews) ) return;.
e980: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
e990: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62  shFirst(&db->aDb
e9a0: 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  [idx].pSchema->t
e9b0: 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c  blHash); i;i=sql
e9c0: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
e9d0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
e9e0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
e9f0: 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54  a(i);.    if( pT
ea00: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
ea10: 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74       sqliteDelet
ea20: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c  eColumnNames(db,
ea30: 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54   pTab);.      pT
ea40: 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
ea50: 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d      pTab->nCol =
ea60: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
ea70: 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
ea80: 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
ea90: 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c  setViews);.}.#el
eaa0: 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69  se.# define sqli
eab0: 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41  teViewResetAll(A
eac0: 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ,B).#endif /* SQ
ead0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
eae0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
eaf0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
eb00: 20 62 79 20 74 68 65 20 56 44 42 45 20 74 6f 20   by the VDBE to 
eb10: 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72  adjust the inter
eb20: 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73  nal schema.** us
eb30: 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65  ed by SQLite whe
eb40: 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  n the btree laye
eb50: 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20  r moves a table 
eb60: 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a  root page. The.*
eb70: 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  * root-page of a
eb80: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
eb90: 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 20  in database iDb 
eba0: 68 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d  has changed from
ebb0: 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f   iFrom.** to iTo
ebc0: 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23  ..**.** Ticket #
ebd0: 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62 6f  1728:  The symbo
ebe0: 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73 74  l table might st
ebf0: 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f  ill contain info
ec00: 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61  rmation.** on ta
ec10: 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69  bles and/or indi
ec20: 63 65 73 20 74 68 61 74 20 61 72 65 20 74 68 65  ces that are the
ec30: 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e   process of bein
ec40: 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66  g deleted..** If
ec50: 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b 79   you are unlucky
ec60: 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64  , one of those d
ec70: 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20 6f  eleted indices o
ec80: 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a  r tables might.*
ec90: 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  * have the same 
eca0: 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 20  rootpage number 
ecb0: 61 73 20 74 68 65 20 72 65 61 6c 20 74 61 62 6c  as the real tabl
ecc0: 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20  e or index that 
ecd0: 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65  is.** being move
ece0: 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74  d.  So we cannot
ecf0: 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67 20   stop searching 
ed00: 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20  after the first 
ed10: 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75 73  match .** becaus
ed20: 65 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  e the first matc
ed30: 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20 6f  h might be for o
ed40: 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65  ne of the delete
ed50: 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20  d indices.** or 
ed60: 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74  tables and not t
ed70: 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 74  he table/index t
ed80: 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20  hat is actually 
ed90: 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20  being moved..** 
eda0: 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65  We must continue
edb0: 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61   looping until a
edc0: 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  ll tables and in
edd0: 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f  dices with.** ro
ede0: 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61  otpage==iFrom ha
edf0: 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65  ve been converte
ee00: 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f 74  d to have a root
ee10: 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69  page of iTo.** i
ee20: 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 65  n order to be ce
ee30: 72 74 61 69 6e 20 74 68 61 74 20 77 65 20 67 6f  rtain that we go
ee40: 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65 2e  t the right one.
ee50: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
ee60: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
ee70: 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  UM.void sqlite3R
ee80: 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73 71 6c  ootPageMoved(sql
ee90: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
eea0: 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  b, int iFrom, in
eeb0: 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c  t iTo){.  HashEl
eec0: 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73  em *pElem;.  Has
eed0: 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62 20 2a  h *pHash;.  Db *
eee0: 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pDb;..  assert( 
eef0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
ef00: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
ef10: 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64  0) );.  pDb = &d
ef20: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
ef30: 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63  Hash = &pDb->pSc
ef40: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20  hema->tblHash;. 
ef50: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
ef60: 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68  eHashFirst(pHash
ef70: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
ef80: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
ef90: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c  Elem)){.    Tabl
efa0: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
efb0: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
efc0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74  .    if( pTab->t
efd0: 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  num==iFrom ){.  
efe0: 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d      pTab->tnum =
eff0: 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   iTo;.    }.  }.
f000: 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e    pHash = &pDb->
f010: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
f020: 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
f030: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48  liteHashFirst(pH
f040: 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
f050: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
f060: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49  t(pElem)){.    I
f070: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c  ndex *pIdx = sql
f080: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
f090: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  m);.    if( pIdx
f0a0: 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b  ->tnum==iFrom ){
f0b0: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75  .      pIdx->tnu
f0c0: 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20  m = iTo;.    }. 
f0d0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
f0e0: 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f  ** Write code to
f0f0: 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c 65   erase the table
f100: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
f110: 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61  iTable from data
f120: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73  base iDb..** Als
f130: 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20  o write code to 
f140: 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74  modify the sqlit
f150: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e_master table a
f160: 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
f170: 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d  ma.** if a root-
f180: 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20  page of another 
f190: 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
f1a0: 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65  y the btree-laye
f1b0: 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73  r whilst.** eras
f1c0: 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69 73  ing iTable (this
f1d0: 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
f1e0: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
f1f0: 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73  database)..*/ .s
f200: 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
f210: 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65  oyRootPage(Parse
f220: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54   *pParse, int iT
f230: 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  able, int iDb){.
f240: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
f250: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
f260: 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  e);.  int r1 = s
f270: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
f280: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
f290: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
f2a0: 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61   OP_Destroy, iTa
f2b0: 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20  ble, r1, iDb);. 
f2c0: 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
f2d0: 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65  (pParse);.#ifnde
f2e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
f2f0: 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50  TOVACUUM.  /* OP
f300: 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20  _Destroy stores 
f310: 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31  an in integer r1
f320: 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65  . If this intege
f330: 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  r.  ** is non-ze
f340: 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ro, then it is t
f350: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
f360: 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d  ber of a table m
f370: 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63  oved to.  ** loc
f380: 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68  ation iTable. Th
f390: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
f3a0: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71   modifies the sq
f3b0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
f3c0: 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63  e to.  ** reflec
f3d0: 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a  t this..  **.  *
f3e0: 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20  * The "#NNN" in 
f3f0: 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65  the SQL is a spe
f400: 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68  cial constant th
f410: 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65  at means whateve
f420: 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20  r value.  ** is 
f430: 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e  in register NNN.
f440: 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75    See grammar ru
f450: 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  les associated w
f460: 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53  ith the TK_REGIS
f470: 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66  TER.  ** token f
f480: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
f490: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  formation..  */.
f4a0: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
f4b0: 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
f4c0: 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
f4d0: 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64   SET rootpage=%d
f4e0: 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20 72   WHERE #%d AND r
f4f0: 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20  ootpage=#%d",.  
f500: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61     pParse->db->a
f510: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
f520: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
f530: 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72 31  , iTable, r1, r1
f540: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
f550: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
f560: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d  g(pParse, r1);.}
f570: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44  ../*.** Write VD
f580: 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65  BE code to erase
f590: 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
f5a0: 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69  all associated i
f5b0: 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a  ndices on disk..
f5c0: 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74  ** Code to updat
f5d0: 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
f5e0: 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69  ter tables and i
f5f0: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64  nternal schema d
f600: 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e  efinitions.** in
f610: 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67   case a root-pag
f620: 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61  e belonging to a
f630: 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20  nother table is 
f640: 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72  moved by the btr
f650: 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61  ee layer.** is a
f660: 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20  lso added (this 
f670: 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20  can happen with 
f680: 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
f690: 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61  atabase)..*/.sta
f6a0: 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79  tic void destroy
f6b0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
f6c0: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
f6d0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
f6e0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
f6f0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
f700: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
f710: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
f720: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
f730: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64  b->pSchema);.  d
f740: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
f750: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75  Parse, pTab->tnu
f760: 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28 70  m, iDb);.  for(p
f770: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
f780: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
f790: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64  x->pNext){.    d
f7a0: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
f7b0: 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75  Parse, pIdx->tnu
f7c0: 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c  m, iDb);.  }.#el
f7d0: 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  se.  /* If the d
f7e0: 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20 61  atabase may be a
f7f0: 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62  uto-vacuum capab
f800: 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d  le (if SQLITE_OM
f810: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
f820: 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  ** is not define
f830: 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69  d), then it is i
f840: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c  mportant to call
f850: 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74   OP_Destroy on t
f860: 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e  he.  ** table an
f870: 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67  d index root-pag
f880: 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61  es in order, sta
f890: 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e  rting with the n
f8a0: 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a  umerically .  **
f8b0: 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
f8c0: 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20  ge number. This 
f8d0: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
f8e0: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74  none of the root
f8f0: 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  -pages.  ** to b
f900: 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 72  e destroyed is r
f910: 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65  elocated by an e
f920: 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f  arlier OP_Destro
f930: 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20  y. i.e. if the. 
f940: 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65   ** following we
f950: 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20  re coded:.  **. 
f960: 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34   ** OP_Destroy 4
f970: 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a   0.  ** ....  **
f980: 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a   OP_Destroy 5 0.
f990: 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f    **.  ** and ro
f9a0: 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65 6e  ot page 5 happen
f9b0: 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72  ed to be the lar
f9c0: 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
f9d0: 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a  umber in the.  *
f9e0: 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  * database, then
f9f0: 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75   root page 5 wou
fa00: 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70  ld be moved to p
fa10: 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20 20  age 4 by the .  
fa20: 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34  ** "OP_Destroy 4
fa30: 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20   0" opcode. The 
fa40: 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44  subsequent "OP_D
fa50: 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c  estroy 5 0" woul
fa60: 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65  d hit.  ** a fre
fa70: 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a  e-list page..  *
fa80: 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
fa90: 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74  Tab->tnum;.  int
faa0: 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b   iDestroyed = 0;
fab0: 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ..  while( 1 ){.
fac0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
fad0: 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73  .    int iLarges
fae0: 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  t = 0;..    if( 
faf0: 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c  iDestroyed==0 ||
fb00: 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64   iTab<iDestroyed
fb10: 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65   ){.      iLarge
fb20: 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d  st = iTab;.    }
fb30: 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
fb40: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
fb50: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
fb60: 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  xt){.      int i
fb70: 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d  Idx = pIdx->tnum
fb80: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
fb90: 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  pIdx->pSchema==p
fba0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
fbb0: 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73 74        if( (iDest
fbc0: 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64  royed==0 || (iId
fbd0: 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20 26  x<iDestroyed)) &
fbe0: 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20  & iIdx>iLargest 
fbf0: 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67  ){.        iLarg
fc00: 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20  est = iIdx;.    
fc10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
fc20: 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b  ( iLargest==0 ){
fc30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
fc40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fc50: 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
fc60: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
fc70: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
fc80: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
fc90: 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
fca0: 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73  (pParse, iLarges
fcb0: 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69  t, iDb);.      i
fcc0: 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72  Destroyed = iLar
fcd0: 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gest;.    }.  }.
fce0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
fcf0: 52 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66  Remove entries f
fd00: 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73  rom the sqlite_s
fd10: 74 61 74 31 20 61 6e 64 20 73 71 6c 69 74 65 5f  tat1 and sqlite_
fd20: 73 74 61 74 32 20 74 61 62 6c 65 73 0a 2a 2a 20  stat2 tables.** 
fd30: 61 66 74 65 72 20 61 20 44 52 4f 50 20 49 4e 44  after a DROP IND
fd40: 45 58 20 6f 72 20 44 52 4f 50 20 54 41 42 4c 45  EX or DROP TABLE
fd50: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61   command..*/.sta
fd60: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
fd70: 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28  ClearStatTables(
fd80: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
fd90: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
fda0: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
fdb0: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20 20   */.  int iDb,  
fdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fdd0: 54 68 65 20 64 61 74 61 62 61 73 65 20 6e 75 6d  The database num
fde0: 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ber */.  const c
fdf0: 68 61 72 20 2a 7a 54 79 70 65 2c 20 20 20 20 20  har *zType,     
fe00: 2f 2a 20 22 69 64 78 22 20 6f 72 20 22 74 62 6c  /* "idx" or "tbl
fe10: 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  " */.  const cha
fe20: 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 2f 2a  r *zName      /*
fe30: 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65 78 20 6f   Name of index o
fe40: 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  r table */.){.  
fe50: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
fe60: 72 20 2a 61 7a 53 74 61 74 54 61 62 5b 5d 20 3d  r *azStatTab[] =
fe70: 20 7b 20 0a 20 20 20 20 22 73 71 6c 69 74 65 5f   { .    "sqlite_
fe80: 73 74 61 74 31 22 2c 0a 20 20 20 20 22 73 71 6c  stat1",.    "sql
fe90: 69 74 65 5f 73 74 61 74 32 22 2c 0a 20 20 20 20  ite_stat2",.    
fea0: 22 73 71 6c 69 74 65 5f 73 74 61 74 33 22 2c 0a  "sqlite_stat3",.
feb0: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
fec0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
fed0: 61 6d 65 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ame = pParse->db
fee0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
fef0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41  ;.  for(i=0; i<A
ff00: 72 72 61 79 53 69 7a 65 28 61 7a 53 74 61 74 54  rraySize(azStatT
ff10: 61 62 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ab); i++){.    i
ff20: 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  f( sqlite3FindTa
ff30: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
ff40: 61 7a 53 74 61 74 54 61 62 5b 69 5d 2c 20 7a 44  azStatTab[i], zD
ff50: 62 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  bName) ){.      
ff60: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
ff70: 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
ff80: 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
ff90: 25 51 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25  %Q.%s WHERE %s=%
ffa0: 51 22 2c 0a 20 20 20 20 20 20 20 20 7a 44 62 4e  Q",.        zDbN
ffb0: 61 6d 65 2c 20 61 7a 53 74 61 74 54 61 62 5b 69  ame, azStatTab[i
ffc0: 5d 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 0a  ], zType, zName.
ffd0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
ffe0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
fff0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64 72 6f  rate code to dro
10000 70 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f  p a table..*/.vo
10010 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72  id sqlite3CodeDr
10020 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
10030 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
10040 61 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  ab, int iDb, int
10050 20 69 73 56 69 65 77 29 7b 0a 20 20 56 64 62 65   isView){.  Vdbe
10060 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
10070 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
10080 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69  .  Trigger *pTri
10090 67 67 65 72 3b 0a 20 20 44 62 20 2a 70 44 62 20  gger;.  Db *pDb 
100a0 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
100b0 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
100c0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
100d0 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
100e0 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
100f0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
10100 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
10110 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10120 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
10130 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  E.  if( IsVirtua
10140 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73  l(pTab) ){.    s
10150 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
10160 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a  (v, OP_VBegin);.
10170 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
10180 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65   Drop all trigge
10190 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
101a0 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  th the table bei
101b0 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65  ng dropped. Code
101c0 0a 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74  .  ** is generat
101d0 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74  ed to remove ent
101e0 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65  ries from sqlite
101f0 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20  _master and/or. 
10200 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f   ** sqlite_temp_
10210 6d 61 73 74 65 72 20 69 66 20 72 65 71 75 69 72  master if requir
10220 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69 67  ed..  */.  pTrig
10230 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69  ger = sqlite3Tri
10240 67 67 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ggerList(pParse,
10250 20 70 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28   pTab);.  while(
10260 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
10270 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65   assert( pTrigge
10280 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  r->pSchema==pTab
10290 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20  ->pSchema || .  
102a0 20 20 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e        pTrigger->
102b0 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62  pSchema==db->aDb
102c0 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20  [1].pSchema );. 
102d0 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72     sqlite3DropTr
102e0 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c  iggerPtr(pParse,
102f0 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20   pTrigger);.    
10300 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67  pTrigger = pTrig
10310 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ger->pNext;.  }.
10320 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10330 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
10340 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61  NT.  /* Remove a
10350 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68  ny entries of th
10360 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  e sqlite_sequenc
10370 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74  e table associat
10380 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65  ed with.  ** the
10390 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
103a0 70 70 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f  pped. This is do
103b0 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 61  ne before the ta
103c0 62 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20  ble is dropped. 
103d0 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65   ** at the btree
103e0 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20   level, in case 
103f0 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
10400 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20  nce table needs 
10410 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20  to.  ** move as 
10420 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  a result of the 
10430 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e  drop (can happen
10440 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
10450 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  mode)..  */.  if
10460 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73  ( pTab->tabFlags
10470 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
10480 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ent ){.    sqlit
10490 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
104a0 61 72 73 65 2c 0a 20 20 20 20 20 20 22 44 45 4c  arse,.      "DEL
104b0 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69  ETE FROM %Q.sqli
104c0 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52  te_sequence WHER
104d0 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20  E name=%Q",.    
104e0 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54    pDb->zName, pT
104f0 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b  ab->zName.    );
10500 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
10510 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54  * Drop all SQLIT
10520 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61  E_MASTER table a
10530 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  nd index entries
10540 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
10550 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54  he.  ** table. T
10560 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20  he program name 
10570 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68  loops through th
10580 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e master table a
10590 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 2a 2a 20  nd deletes.  ** 
105a0 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72  every row that r
105b0 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
105c0 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
105d0 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69  e as the one bei
105e0 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e  ng.  ** dropped.
105f0 20 54 72 69 67 67 65 72 73 20 61 72 65 20 68 61   Triggers are ha
10600 6e 64 6c 65 64 20 73 65 70 65 72 61 74 65 6c 79  ndled seperately
10610 20 62 65 63 61 75 73 65 20 61 20 74 72 69 67 67   because a trigg
10620 65 72 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 63  er can be.  ** c
10630 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65  reated in the te
10640 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74  mp database that
10650 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
10660 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20  le in another.  
10670 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ** database..  *
10680 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65  /.  sqlite3Neste
10690 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
106a0 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
106b0 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 74  OM %Q.%s WHERE t
106c0 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74  bl_name=%Q and t
106d0 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c  ype!='trigger'",
106e0 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d  .      pDb->zNam
106f0 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
10700 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  iDb), pTab->zNam
10710 65 29 3b 0a 20 20 69 66 28 20 21 69 73 56 69 65  e);.  if( !isVie
10720 77 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28  w && !IsVirtual(
10730 70 54 61 62 29 20 29 7b 0a 20 20 20 20 64 65 73  pTab) ){.    des
10740 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65  troyTable(pParse
10750 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20  , pTab);.  }..  
10760 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61  /* Remove the ta
10770 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53  ble entry from S
10780 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c  QLite's internal
10790 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69   schema and modi
107a0 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65  fy.  ** the sche
107b0 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a  ma cookie..  */.
107c0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
107d0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
107e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
107f0 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69  , OP_VDestroy, i
10800 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e  Db, 0, 0, pTab->
10810 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 20  zName, 0);.  }. 
10820 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10830 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62  p4(v, OP_DropTab
10840 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70  le, iDb, 0, 0, p
10850 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
10860 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
10870 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
10880 62 29 3b 0a 20 20 73 71 6c 69 74 65 56 69 65 77  b);.  sqliteView
10890 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62  ResetAll(db, iDb
108a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
108b0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
108c0 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  ed to do the wor
108d0 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c  k of a DROP TABL
108e0 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  E statement..** 
108f0 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  pName is the nam
10900 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
10910 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f  o be dropped..*/
10920 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
10930 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
10940 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
10950 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77  Name, int isView
10960 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20  , int noErr){.  
10970 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56  Table *pTab;.  V
10980 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
10990 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
109a0 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
109b0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
109c0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
109d0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
109e0 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  le;.  }.  assert
109f0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
10a00 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
10a10 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
10a20 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64  .  if( noErr ) d
10a30 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2b 2b  b->suppressErr++
10a40 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
10a50 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
10a60 61 72 73 65 2c 20 69 73 56 69 65 77 2c 20 0a 20  arse, isView, . 
10a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a80 20 20 20 20 20 20 20 20 20 20 20 70 4e 61 6d 65             pName
10a90 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e  ->a[0].zName, pN
10aa0 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
10ab0 61 73 65 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72  ase);.  if( noEr
10ac0 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73  r ) db->suppress
10ad0 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54  Err--;..  if( pT
10ae0 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ab==0 ){.    if(
10af0 20 6e 6f 45 72 72 20 29 20 73 71 6c 69 74 65 33   noErr ) sqlite3
10b00 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53  CodeVerifyNamedS
10b10 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e  chema(pParse, pN
10b20 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
10b30 61 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ase);.    goto e
10b40 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
10b50 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
10b60 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
10b70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
10b80 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ma);.  assert( i
10b90 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
10ba0 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  >nDb );..  /* If
10bb0 20 70 54 61 62 20 69 73 20 61 20 76 69 72 74 75   pTab is a virtu
10bc0 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56  al table, call V
10bd0 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
10be0 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20 20  s() to ensure.  
10bf0 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c  ** it is initial
10c00 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ized..  */.  if(
10c10 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
10c20 20 26 26 20 73 71 6c 69 74 65 33 56 69 65 77 47   && sqlite3ViewG
10c30 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
10c40 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20  arse, pTab) ){. 
10c50 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
10c60 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66  p_table;.  }.#if
10c70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10c80 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
10c90 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b   {.    int code;
10ca0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
10cb0 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
10cc0 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 63  ABLE(iDb);.    c
10cd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
10ce0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
10cf0 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
10d00 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a  har *zArg2 = 0;.
10d10 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
10d20 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
10d30 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
10d40 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a  zTab, 0, zDb)){.
10d50 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
10d60 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
10d70 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  }.    if( isView
10d80 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f   ){.      if( !O
10d90 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
10da0 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
10db0 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
10dc0 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  OP_TEMP_VIEW;.  
10dd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10de0 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
10df0 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20  _DROP_VIEW;.    
10e00 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
10e10 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
10e20 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69  ABLE.    }else i
10e30 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
10e40 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65  b) ){.      code
10e50 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
10e60 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72  TABLE;.      zAr
10e70 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  g2 = sqlite3GetV
10e80 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 2d  Table(db, pTab)-
10e90 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65  >pMod->zName;.#e
10ea0 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
10eb0 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
10ec0 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
10ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
10ee0 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
10ef0 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
10f00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10f10 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
10f20 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  OP_TABLE;.      
10f30 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
10f40 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
10f50 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
10f60 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67  Tab->zName, zArg
10f70 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  2, zDb) ){.     
10f80 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
10f90 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  table;.    }.   
10fa0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
10fb0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
10fc0 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61  LITE_DELETE, pTa
10fd0 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62  b->zName, 0, zDb
10fe0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
10ff0 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
11000 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
11010 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  f.  if( sqlite3S
11020 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e  trNICmp(pTab->zN
11030 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
11040 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  7)==0 ){.    sql
11050 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11060 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
11070 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  ay not be droppe
11080 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
11090 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
110a0 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
110b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
110c0 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45  OMIT_VIEW.  /* E
110d0 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45  nsure DROP TABLE
110e0 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20   is not used on 
110f0 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50  a view, and DROP
11100 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65   VIEW is not use
11110 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c  d.  ** on a tabl
11120 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  e..  */.  if( is
11130 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
11140 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
11150 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
11160 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
11170 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74  P TABLE to delet
11180 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61  e table %s", pTa
11190 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
111a0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
111b0 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ble;.  }.  if( !
111c0 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
111d0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
111e0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
111f0 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
11200 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20   VIEW to delete 
11210 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e  view %s", pTab->
11220 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
11230 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
11240 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
11250 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
11260 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74   to remove the t
11270 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61  able from the ma
11280 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ster table.  ** 
11290 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
112a0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
112b0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
112c0 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
112d0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
112e0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
112f0 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
11300 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65  e3ClearStatTable
11310 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  s(pParse, iDb, "
11320 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  tbl", pTab->zNam
11330 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  e);.    sqlite3F
11340 6b 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73  kDropTable(pPars
11350 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b  e, pName, pTab);
11360 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
11370 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65  DropTable(pParse
11380 2c 20 70 54 61 62 2c 20 69 44 62 2c 20 69 73 56  , pTab, iDb, isV
11390 69 65 77 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f  iew);.  }..exit_
113a0 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71  drop_table:.  sq
113b0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
113c0 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d  te(db, pName);.}
113d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
113e0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
113f0 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66  o create a new f
11400 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68  oreign key on th
11410 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65  e table.** curre
11420 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
11430 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43  ruction.  pFromC
11440 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  ol determines wh
11450 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69  ich columns.** i
11460 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  n the current ta
11470 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ble point to the
11480 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49   foreign key.  I
11490 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68  f pFromCol==0 th
114a0 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68  en.** connect th
114b0 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73  e key to the las
114c0 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65  t column inserte
114d0 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e  d.  pTo is the n
114e0 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61  ame of.** the ta
114f0 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e  ble referred to.
11500 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69    pToCol is a li
11510 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  st of tables in 
11520 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f  the other.** pTo
11530 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20   table that the 
11540 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e  foreign key poin
11550 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f  ts to.  flags co
11560 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e  ntains all.** in
11570 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
11580 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  the conflict res
11590 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
115a0 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  ms specified.** 
115b0 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45  in the ON DELETE
115c0 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20  , ON UPDATE and 
115d0 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65  ON INSERT clause
115e0 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79  s..**.** An FKey
115f0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72   structure is cr
11600 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20  eated and added 
11610 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
11620 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20  rently.** under 
11630 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20  construction in 
11640 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  the pParse->pNew
11650 54 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a  Table field..**.
11660 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b  ** The foreign k
11670 65 79 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d  ey is set for IM
11680 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73 73 69  MEDIATE processi
11690 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e  ng.  A subsequen
116a0 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c  t call.** to sql
116b0 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
116c0 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e  Key() might chan
116d0 67 65 20 74 68 69 73 20 74 6f 20 44 45 46 45 52  ge this to DEFER
116e0 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  RED..*/.void sql
116f0 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69 67  ite3CreateForeig
11700 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  nKey(.  Parse *p
11710 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
11720 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
11730 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
11740 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c  FromCol,  /* Col
11750 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62  umns in this tab
11760 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  le that point to
11770 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
11780 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20    Token *pTo,   
11790 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
117a0 66 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c  f the other tabl
117b0 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
117c0 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43  *pToCol,    /* C
117d0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74  olumns in the ot
117e0 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  her table */.  i
117f0 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
11800 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20      /* Conflict 
11810 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72  resolution algor
11820 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73  ithms. */.){.  s
11830 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
11840 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66  rse->db;.#ifndef
11850 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
11860 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20  EIGN_KEY.  FKey 
11870 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 46 4b  *pFKey = 0;.  FK
11880 65 79 20 2a 70 4e 65 78 74 54 6f 3b 0a 20 20 54  ey *pNextTo;.  T
11890 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65  able *p = pParse
118a0 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
118b0 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
118c0 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20  i;.  int nCol;. 
118d0 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73   char *z;..  ass
118e0 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20  ert( pTo!=0 );. 
118f0 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f   if( p==0 || IN_
11900 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67  DECLARE_VTAB ) g
11910 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66  oto fk_end;.  if
11920 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b  ( pFromCol==0 ){
11930 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  .    int iCol = 
11940 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69  p->nCol-1;.    i
11950 66 28 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30 29  f( NEVER(iCol<0)
11960 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
11970 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26      if( pToCol &
11980 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21  & pToCol->nExpr!
11990 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
119a0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
119b0 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79  se, "foreign key
119c0 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20   on %s".        
119d0 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65   " should refere
119e0 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c  nce only one col
119f0 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22  umn of table %T"
11a00 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43  ,.         p->aC
11a10 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20  ol[iCol].zName, 
11a20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  pTo);.      goto
11a30 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20   fk_end;.    }. 
11a40 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d     nCol = 1;.  }
11a50 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20  else if( pToCol 
11a60 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72  && pToCol->nExpr
11a70 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  !=pFromCol->nExp
11a80 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
11a90 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11aa0 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72  .        "number
11ab0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66   of columns in f
11ac0 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20  oreign key does 
11ad0 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75  not match the nu
11ae0 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20  mber of ".      
11af0 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68    "columns in th
11b00 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
11b10 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66  le");.    goto f
11b20 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  k_end;.  }else{.
11b30 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d      nCol = pFrom
11b40 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a  Col->nExpr;.  }.
11b50 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
11b60 28 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f 6c  (*pFKey) + (nCol
11b70 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79  -1)*sizeof(pFKey
11b80 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f  ->aCol[0]) + pTo
11b90 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70  ->n + 1;.  if( p
11ba0 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72  ToCol ){.    for
11bb0 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e  (i=0; i<pToCol->
11bc0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
11bd0 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69     nByte += sqli
11be0 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43  te3Strlen30(pToC
11bf0 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20  ol->a[i].zName) 
11c00 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  + 1;.    }.  }. 
11c10 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   pFKey = sqlite3
11c20 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
11c30 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
11c40 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  pFKey==0 ){.    
11c50 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d  goto fk_end;.  }
11c60 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20  .  pFKey->pFrom 
11c70 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e  = p;.  pFKey->pN
11c80 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b  extFrom = p->pFK
11c90 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a  ey;.  z = (char*
11ca0 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43  )&pFKey->aCol[nC
11cb0 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54  ol];.  pFKey->zT
11cc0 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28  o = z;.  memcpy(
11cd0 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e  z, pTo->z, pTo->
11ce0 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20  n);.  z[pTo->n] 
11cf0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  = 0;.  sqlite3De
11d00 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d  quote(z);.  z +=
11d10 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b   pTo->n+1;.  pFK
11d20 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b  ey->nCol = nCol;
11d30 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
11d40 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d  =0 ){.    pFKey-
11d50 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d  >aCol[0].iFrom =
11d60 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65   p->nCol-1;.  }e
11d70 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
11d80 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
11d90 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
11da0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
11db0 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
11dc0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
11dd0 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b  StrICmp(p->aCol[
11de0 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43  j].zName, pFromC
11df0 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  ol->a[i].zName)=
11e00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11e10 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  pFKey->aCol[i].i
11e20 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20  From = j;.      
11e30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
11e40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
11e50 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f     if( j>=p->nCo
11e60 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
11e70 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11e80 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
11e90 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20  "unknown column 
11ea0 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67  \"%s\" in foreig
11eb0 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
11ec0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46  ", .          pF
11ed0 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
11ee0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
11ef0 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20  o fk_end;.      
11f00 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
11f10 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
11f20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
11f30 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
11f40 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
11f50 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  en30(pToCol->a[i
11f60 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
11f70 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  pFKey->aCol[i].z
11f80 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d  Col = z;.      m
11f90 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d  emcpy(z, pToCol-
11fa0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b  >a[i].zName, n);
11fb0 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b  .      z[n] = 0;
11fc0 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b  .      z += n+1;
11fd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
11fe0 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
11ff0 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63   0;.  pFKey->aAc
12000 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66  tion[0] = (u8)(f
12010 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20 20 20  lags & 0xff);   
12020 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44           /* ON D
12030 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a  ELETE action */.
12040 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e    pFKey->aAction
12050 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c 61 67  [1] = (u8)((flag
12060 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 29  s >> 8 ) & 0xff)
12070 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54  ;    /* ON UPDAT
12080 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61  E action */..  a
12090 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
120a0 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
120b0 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  , 0, p->pSchema)
120c0 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20   );.  pNextTo = 
120d0 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65 33 48  (FKey *)sqlite3H
120e0 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53  ashInsert(&p->pS
120f0 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c  chema->fkeyHash,
12100 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a   .      pFKey->z
12110 54 6f 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  To, sqlite3Strle
12120 6e 33 30 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2c  n30(pFKey->zTo),
12130 20 28 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20   (void *)pFKey. 
12140 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 78 74 54   );.  if( pNextT
12150 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20 20  o==pFKey ){.    
12160 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
12170 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 66   = 1;.    goto f
12180 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  k_end;.  }.  if(
12190 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20 20 20   pNextTo ){.    
121a0 61 73 73 65 72 74 28 20 70 4e 65 78 74 54 6f 2d  assert( pNextTo-
121b0 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20  >pPrevTo==0 );. 
121c0 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54     pFKey->pNextT
121d0 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20  o = pNextTo;.   
121e0 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54   pNextTo->pPrevT
121f0 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a  o = pFKey;.  }..
12200 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f    /* Link the fo
12210 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65  reign key to the
12220 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61   table as the la
12230 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20  st step..  */.  
12240 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79  p->pFKey = pFKey
12250 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a  ;.  pFKey = 0;..
12260 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  fk_end:.  sqlite
12270 33 44 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65  3DbFree(db, pFKe
12280 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  y);.#endif /* !d
12290 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
122a0 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20  IT_FOREIGN_KEY) 
122b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
122c0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
122d0 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  FromCol);.  sqli
122e0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
122f0 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d  e(db, pToCol);.}
12300 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
12310 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
12320 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59  hen an INITIALLY
12330 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e   IMMEDIATE or IN
12340 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
12350 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65  .** clause is se
12360 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  en as part of a 
12370 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
12380 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44  nition.  The isD
12390 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d  eferred.** param
123a0 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e  eter is 1 for IN
123b0 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
123c0 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49   and 0 for INITI
123d0 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a  ALLY IMMEDIATE..
123e0 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20  ** The behavior 
123f0 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
12400 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72  ntly created for
12410 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75  eign key is adju
12420 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e  sted.** accordin
12430 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gly..*/.void sql
12440 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
12450 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  Key(Parse *pPars
12460 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65  e, int isDeferre
12470 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  d){.#ifndef SQLI
12480 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
12490 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  KEY.  Table *pTa
124a0 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  b;.  FKey *pFKey
124b0 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20  ;.  if( (pTab = 
124c0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
124d0 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20  e)==0 || (pFKey 
124e0 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d  = pTab->pFKey)==
124f0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
12500 73 65 72 74 28 20 69 73 44 65 66 65 72 72 65 64  sert( isDeferred
12510 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65 72 72 65  ==0 || isDeferre
12520 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52  d==1 ); /* EV: R
12530 2d 33 30 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a  -30323-21917 */.
12540 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
12550 72 65 64 20 3d 20 28 75 38 29 69 73 44 65 66 65  red = (u8)isDefe
12560 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rred;.#endif.}..
12570 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
12580 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72  ode that will er
12590 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69  ase and refill i
125a0 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69  ndex *pIdx.  Thi
125b0 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  s is.** used to 
125c0 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  initialize a new
125d0 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 65 78  ly created index
125e0 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65   or to recompute
125f0 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
12600 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72  of an index in r
12610 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49  esponse to a REI
12620 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
12630 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61  .** if memRootPa
12640 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69  ge is not negati
12650 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ve, it means tha
12660 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e  t the index is n
12670 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e  ewly.** created.
12680 20 20 54 68 65 20 72 65 67 69 73 74 65 72 20 73    The register s
12690 70 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52  pecified by memR
126a0 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  ootPage contains
126b0 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
126c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
126d0 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f  index.  If memRo
126e0 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  otPage is negati
126f0 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ve, then.** the 
12700 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
12710 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65  ists and must be
12720 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20   cleared before 
12730 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61  being refilled a
12740 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  nd.** the root p
12750 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
12760 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e  e index is taken
12770 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e   from pIndex->tn
12780 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  um..*/.static vo
12790 69 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c  id sqlite3Refill
127a0 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
127b0 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  rse, Index *pInd
127c0 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50  ex, int memRootP
127d0 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  age){.  Table *p
127e0 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54  Tab = pIndex->pT
127f0 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61  able;  /* The ta
12800 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64 65  ble that is inde
12810 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  xed */.  int iTa
12820 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
12830 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65  ++;     /* Btree
12840 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   cursor used for
12850 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
12860 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
12870 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab++;     /* Btr
12880 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
12890 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69  or pIndex */.  i
128a0 6e 74 20 69 53 6f 72 74 65 72 20 3d 20 69 54 61  nt iSorter = iTa
128b0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b;            /*
128c0 20 43 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 62   Cursor opened b
128d0 79 20 4f 70 65 6e 53 6f 72 74 65 72 20 28 69 66  y OpenSorter (if
128e0 20 69 6e 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e   in use) */.  in
128f0 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20  t addr1;        
12900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12910 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f  Address of top o
12920 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  f loop */.  int 
12930 61 64 64 72 32 3b 20 20 20 20 20 20 20 20 20 20  addr2;          
12940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
12950 64 72 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f  dress to jump to
12960 20 66 6f 72 20 6e 65 78 74 20 69 74 65 72 61 74   for next iterat
12970 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75  ion */.  int tnu
12980 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
12990 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
129a0 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  page of index */
129b0 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
129c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129d0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
129e0 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72  de into this vir
129f0 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a  tual machine */.
12a00 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b    KeyInfo *pKey;
12a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20   /* KeyInfo for 
12a30 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72  index */.  int r
12a40 65 67 49 64 78 4b 65 79 3b 20 20 20 20 20 20 20  egIdxKey;       
12a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
12a60 69 73 74 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e  isters containin
12a70 67 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 20  g the index key 
12a80 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
12a90 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rd;             
12aa0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
12ab0 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 69  holding assembli
12ac0 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  ed index record 
12ad0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
12ae0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
12af0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
12b00 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
12b10 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71  /.  int iDb = sq
12b20 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
12b30 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70  ex(db, pIndex->p
12b40 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65  Schema);..#ifnde
12b50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12b60 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66  THORIZATION.  if
12b70 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
12b80 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
12b90 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65  E_REINDEX, pInde
12ba0 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20  x->zName, 0,.   
12bb0 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
12bc0 7a 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72  zName ) ){.    r
12bd0 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
12be0 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20  f..  /* Require 
12bf0 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
12c00 74 68 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72  the table to per
12c10 66 6f 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74  form this operat
12c20 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
12c30 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
12c40 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
12c50 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 1, pTab->zNam
12c60 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  e);..  v = sqlit
12c70 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
12c80 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
12c90 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65  return;.  if( me
12ca0 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a  mRootPage>=0 ){.
12cb0 20 20 20 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f      tnum = memRo
12cc0 6f 74 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b  otPage;.  }else{
12cd0 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64  .    tnum = pInd
12ce0 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 73 71  ex->tnum;.    sq
12cf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12d00 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75  v, OP_Clear, tnu
12d10 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70  m, iDb);.  }.  p
12d20 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64  Key = sqlite3Ind
12d30 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65  exKeyinfo(pParse
12d40 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c  , pIndex);.  sql
12d50 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
12d60 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
12d70 69 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c  iIdx, tnum, iDb,
12d80 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
12d90 20 20 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b        (char *)pK
12da0 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  ey, P4_KEYINFO_H
12db0 41 4e 44 4f 46 46 29 3b 0a 20 20 69 66 28 20 6d  ANDOFF);.  if( m
12dc0 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b  emRootPage>=0 ){
12dd0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12de0 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a  ChangeP5(v, 1);.
12df0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
12e00 49 54 45 5f 4f 4d 49 54 5f 4d 45 52 47 45 5f 53  ITE_OMIT_MERGE_S
12e10 4f 52 54 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  ORT.  /* Open th
12e20 65 20 73 6f 72 74 65 72 20 63 75 72 73 6f 72 20  e sorter cursor 
12e30 69 66 20 77 65 20 61 72 65 20 74 6f 20 75 73 65  if we are to use
12e40 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 53 6f 72 74   one. */.  iSort
12e50 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  er = pParse->nTa
12e60 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  b++;.  sqlite3Vd
12e70 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
12e80 6f 72 74 65 72 4f 70 65 6e 2c 20 69 53 6f 72 74  orterOpen, iSort
12e90 65 72 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a  er, 0, 0, (char*
12ea0 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46  )pKey, P4_KEYINF
12eb0 4f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  O);.#endif..  /*
12ec0 20 4f 70 65 6e 20 74 68 65 20 74 61 62 6c 65 2e   Open the table.
12ed0 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
12ee0 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61  l rows of the ta
12ef0 62 6c 65 2c 20 69 6e 73 65 72 74 69 6e 67 20 69  ble, inserting i
12f00 6e 64 65 78 0a 20 20 2a 2a 20 72 65 63 6f 72 64  ndex.  ** record
12f10 73 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65  s into the sorte
12f20 72 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4f  r. */.  sqlite3O
12f30 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
12f40 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62   iTab, iDb, pTab
12f50 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
12f60 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
12f70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12f80 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20  P_Rewind, iTab, 
12f90 30 29 3b 0a 20 20 61 64 64 72 32 20 3d 20 61 64  0);.  addr2 = ad
12fa0 64 72 31 20 2b 20 31 3b 0a 20 20 72 65 67 52 65  dr1 + 1;.  regRe
12fb0 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
12fc0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
12fd0 3b 0a 20 20 72 65 67 49 64 78 4b 65 79 20 3d 20  ;.  regIdxKey = 
12fe0 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
12ff0 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20  ndexKey(pParse, 
13000 70 49 6e 64 65 78 2c 20 69 54 61 62 2c 20 72 65  pIndex, iTab, re
13010 67 52 65 63 6f 72 64 2c 20 31 29 3b 0a 0a 23 69  gRecord, 1);..#i
13020 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13030 54 5f 4d 45 52 47 45 5f 53 4f 52 54 0a 20 20 73  T_MERGE_SORT.  s
13040 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13050 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  (v, OP_SorterIns
13060 65 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 72 65  ert, iSorter, re
13070 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
13080 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13090 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20   OP_Next, iTab, 
130a0 61 64 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69  addr1+1);.  sqli
130b0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
130c0 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 61 64 64  v, addr1);.  add
130d0 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
130e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
130f0 74 65 72 53 6f 72 74 2c 20 69 53 6f 72 74 65 72  terSort, iSorter
13100 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  , 0);.  if( pInd
13110 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  ex->onError!=OE_
13120 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  None ){.    int 
13130 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j2 = sqlite3Vdbe
13140 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
13150 20 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   3;.    sqlite3V
13160 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13170 47 6f 74 6f 2c 20 30 2c 20 6a 32 29 3b 0a 20 20  Goto, 0, j2);.  
13180 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
13190 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
131a0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
131b0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
131c0 5f 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c 20  _SorterCompare, 
131d0 69 53 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65 67  iSorter, j2, reg
131e0 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 73 71 6c  Record);.    sql
131f0 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69  ite3HaltConstrai
13200 6e 74 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  nt(.        pPar
13210 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 22 69  se, OE_Abort, "i
13220 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61  ndexed columns a
13230 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20  re not unique", 
13240 50 34 5f 53 54 41 54 49 43 0a 20 20 20 20 29 3b  P4_STATIC.    );
13250 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64  .  }else{.    ad
13260 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
13270 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
13280 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
13290 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
132a0 6f 72 74 65 72 44 61 74 61 2c 20 69 53 6f 72 74  orterData, iSort
132b0 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  er, regRecord);.
132c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
132d0 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op3(v, OP_IdxIns
132e0 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67 52 65  ert, iIdx, regRe
132f0 63 6f 72 64 2c 20 31 29 3b 0a 20 20 73 71 6c 69  cord, 1);.  sqli
13300 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
13310 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
13320 4b 52 45 53 55 4c 54 29 3b 0a 23 65 6c 73 65 0a  KRESULT);.#else.
13330 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e    if( pIndex->on
13340 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
13350 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
13360 72 65 67 52 6f 77 69 64 20 3d 20 72 65 67 49 64  regRowid = regId
13370 78 4b 65 79 20 2b 20 70 49 6e 64 65 78 2d 3e 6e  xKey + pIndex->n
13380 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 63 6f 6e 73  Column;.    cons
13390 74 20 69 6e 74 20 6a 32 20 3d 20 73 71 6c 69 74  t int j2 = sqlit
133a0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
133b0 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20 76 6f  r(v) + 2;.    vo
133c0 69 64 20 2a 20 63 6f 6e 73 74 20 70 52 65 67 4b  id * const pRegK
133d0 65 79 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 5f  ey = SQLITE_INT_
133e0 54 4f 5f 50 54 52 28 72 65 67 49 64 78 4b 65 79  TO_PTR(regIdxKey
133f0 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  );..    /* The r
13400 65 67 69 73 74 65 72 73 20 61 63 63 65 73 73 65  egisters accesse
13410 64 20 62 79 20 74 68 65 20 4f 50 5f 49 73 55 6e  d by the OP_IsUn
13420 69 71 75 65 20 6f 70 63 6f 64 65 20 77 65 72 65  ique opcode were
13430 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a   allocated.    *
13440 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 47  * using sqlite3G
13450 65 74 54 65 6d 70 52 61 6e 67 65 28 29 20 69 6e  etTempRange() in
13460 73 69 64 65 20 6f 66 20 74 68 65 20 73 71 6c 69  side of the sqli
13470 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78  te3GenerateIndex
13480 4b 65 79 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  Key().    ** cal
13490 6c 20 61 62 6f 76 65 2e 20 4a 75 73 74 20 62 65  l above. Just be
134a0 66 6f 72 65 20 74 68 61 74 20 66 75 6e 63 74 69  fore that functi
134b0 6f 6e 20 77 61 73 20 66 72 65 65 64 20 74 68 65  on was freed the
134c0 79 20 77 65 72 65 20 72 65 6c 65 61 73 65 64 0a  y were released.
134d0 20 20 20 20 2a 2a 20 28 6d 61 64 65 20 61 76 61      ** (made ava
134e0 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 63 6f  ilable to the co
134f0 6d 70 69 6c 65 72 20 66 6f 72 20 72 65 75 73 65  mpiler for reuse
13500 29 20 75 73 69 6e 67 20 0a 20 20 20 20 2a 2a 20  ) using .    ** 
13510 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
13520 6d 70 52 61 6e 67 65 28 29 2e 20 53 6f 20 69 6e  mpRange(). So in
13530 20 73 6f 6d 65 20 77 61 79 73 20 68 61 76 69 6e   some ways havin
13540 67 20 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75  g the OP_IsUniqu
13550 65 0a 20 20 20 20 2a 2a 20 6f 70 63 6f 64 65 20  e.    ** opcode 
13560 75 73 65 20 74 68 65 20 76 61 6c 75 65 73 20 73  use the values s
13570 74 6f 72 65 64 20 77 69 74 68 69 6e 20 73 65 65  tored within see
13580 6d 73 20 64 61 6e 67 65 72 6f 75 73 2e 20 48 6f  ms dangerous. Ho
13590 77 65 76 65 72 2c 20 73 69 6e 63 65 0a 20 20 20  wever, since.   
135a0 20 2a 2a 20 77 65 20 63 61 6e 20 62 65 20 73 75   ** we can be su
135b0 72 65 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  re that no other
135c0 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 73 20   temp registers 
135d0 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61  have been alloca
135e0 74 65 64 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65  ted.    ** since
135f0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
13600 65 6d 70 52 61 6e 67 65 28 29 20 77 61 73 20 63  empRange() was c
13610 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 73 61 66  alled, it is saf
13620 65 20 74 6f 20 64 6f 20 73 6f 2e 0a 20 20 20 20  e to do so..    
13630 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
13640 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49  beAddOp4(v, OP_I
13650 73 55 6e 69 71 75 65 2c 20 69 49 64 78 2c 20 6a  sUnique, iIdx, j
13660 32 2c 20 72 65 67 52 6f 77 69 64 2c 20 70 52 65  2, regRowid, pRe
13670 67 4b 65 79 2c 20 50 34 5f 49 4e 54 33 32 29 3b  gKey, P4_INT32);
13680 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74  .    sqlite3Halt
13690 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 20 20  Constraint(.    
136a0 20 20 20 20 70 50 61 72 73 65 2c 20 4f 45 5f 41      pParse, OE_A
136b0 62 6f 72 74 2c 20 22 69 6e 64 65 78 65 64 20 63  bort, "indexed c
136c0 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75  olumns are not u
136d0 6e 69 71 75 65 22 2c 20 50 34 5f 53 54 41 54 49  nique", P4_STATI
136e0 43 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  C);.  }.  sqlite
136f0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
13700 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64  P_IdxInsert, iId
13710 78 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 30 29  x, regRecord, 0)
13720 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
13730 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
13740 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
13750 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
13760 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
13770 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
13780 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rd);.  sqlite3Vd
13790 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
137a0 6f 72 74 65 72 4e 65 78 74 2c 20 69 53 6f 72 74  orterNext, iSort
137b0 65 72 2c 20 61 64 64 72 32 29 3b 0a 20 20 73 71  er, addr2);.  sq
137c0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
137d0 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20  e(v, addr1);..  
137e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
137f0 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
13800 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Tab);.  sqlite3V
13810 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
13820 43 6c 6f 73 65 2c 20 69 49 64 78 29 3b 0a 20 20  Close, iIdx);.  
13830 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13840 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
13850 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Sorter);.}../*.*
13860 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69  * Create a new i
13870 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20  ndex for an SQL 
13880 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70  table.  pName1.p
13890 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d  Name2 is the nam
138a0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a  e of the index .
138b0 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20  ** and pTblList 
138c0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
138d0 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
138e0 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
138f0 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62   Both will .** b
13900 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69  e NULL for a pri
13910 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69  mary key or an i
13920 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65  ndex that is cre
13930 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  ated to satisfy 
13940 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73  a.** UNIQUE cons
13950 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62  traint.  If pTab
13960 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72  le and pIndex ar
13970 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72  e NULL, use pPar
13980 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a  se->pNewTable.**
13990 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f   as the table to
139a0 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50   be indexed.  pP
139b0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
139c0 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  is a table that 
139d0 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  is.** currently 
139e0 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
139f0 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41  d by a CREATE TA
13a00 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
13a10 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20  *.** pList is a 
13a20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
13a30 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
13a40 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55  pList will be NU
13a50 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73  LL if this.** is
13a60 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
13a70 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61  r unique-constra
13a80 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20  int on the most 
13a90 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64  recent column ad
13aa0 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61  ded.** to the ta
13ab0 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
13ac0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
13ad0 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
13ae0 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65   index is create
13af0 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
13b00 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
13b10 20 74 6f 20 74 68 65 20 6e 65 77 20 49 6e 64 65   to the new Inde
13b20 78 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  x.** structure. 
13b30 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
13b40 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72  sqlite3AddPrimar
13b50 79 4b 65 79 28 29 20 74 6f 20 6d 61 72 6b 20 74  yKey() to mark t
13b60 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 74  he index.** as t
13b70 68 65 20 74 61 62 6c 65 73 20 70 72 69 6d 61 72  he tables primar
13b80 79 20 6b 65 79 20 28 49 6e 64 65 78 2e 61 75 74  y key (Index.aut
13b90 6f 49 6e 64 65 78 3d 3d 32 29 2e 0a 2a 2f 0a 49  oIndex==2)..*/.I
13ba0 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 43 72 65  ndex *sqlite3Cre
13bb0 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ateIndex(.  Pars
13bc0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
13bd0 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * All informatio
13be0 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72  n about this par
13bf0 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
13c00 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69  Name1,     /* Fi
13c10 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65  rst part of inde
13c20 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
13c30 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
13c40 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53  pName2,     /* S
13c50 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e  econd part of in
13c60 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
13c70 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69   NULL */.  SrcLi
13c80 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a  st *pTblName, /*
13c90 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e   Table to index.
13ca0 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   Use pParse->pNe
13cb0 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20  wTable if 0 */. 
13cc0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
13cd0 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66  ,   /* A list of
13ce0 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
13cf0 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
13d00 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f  onError,       /
13d10 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49  * OE_Abort, OE_I
13d20 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63  gnore, OE_Replac
13d30 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f  e, or OE_None */
13d40 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  .  Token *pStart
13d50 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
13d60 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
13d70 65 67 69 6e 73 20 74 68 69 73 20 73 74 61 74 65  egins this state
13d80 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ment */.  Token 
13d90 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 2f 2a 20  *pEnd,       /* 
13da0 54 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f  The ")" that clo
13db0 73 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49  ses the CREATE I
13dc0 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
13dd0 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
13de0 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f  r,     /* Sort o
13df0 72 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20  rder of primary 
13e00 6b 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d  key when pList==
13e10 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66  NULL */.  int if
13e20 4e 6f 74 45 78 69 73 74 20 20 20 20 20 2f 2a 20  NotExist     /* 
13e30 4f 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e  Omit error if in
13e40 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
13e50 74 73 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  ts */.){.  Index
13e60 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20   *pRet = 0;     
13e70 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 72 65  /* Pointer to re
13e80 74 75 72 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20  turn */.  Table 
13e90 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f  *pTab = 0;     /
13ea0 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  * Table to be in
13eb0 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  dexed */.  Index
13ec0 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20   *pIndex = 0;   
13ed0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
13ee0 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  be created */.  
13ef0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
13f00 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
13f10 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  the index */.  i
13f20 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
13f30 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13f40 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a   characters in z
13f50 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  Name */.  int i,
13f60 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c   j;.  Token null
13f70 49 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 61  Id;        /* Fa
13f80 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20  ke token for an 
13f90 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f  empty ID list */
13fa0 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b  .  DbFixer sFix;
13fb0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61          /* For a
13fc0 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73  ssigning databas
13fd0 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c  e names to pTabl
13fe0 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  e */.  int sortO
13ff0 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31  rderMask;   /* 1
14000 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69   to honor DESC i
14010 6e 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69  n index.  0 to i
14020 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69  gnore. */.  sqli
14030 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
14040 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b  ->db;.  Db *pDb;
14050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14060 54 68 65 20 73 70 65 63 69 66 69 63 20 74 61 62  The specific tab
14070 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
14080 65 20 69 6e 64 65 78 65 64 20 64 61 74 61 62 61  e indexed databa
14090 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  se */.  int iDb;
140a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
140b0 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  Index of the dat
140c0 61 62 61 73 65 20 74 68 61 74 20 69 73 20 62 65  abase that is be
140d0 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  ing written */. 
140e0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20   Token *pName = 
140f0 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69  0;    /* Unquali
14100 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65  fied name of the
14110 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65   index to create
14120 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70   */.  struct Exp
14130 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73  rList_item *pLis
14140 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f  tItem; /* For lo
14150 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74  oping over pList
14160 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a   */.  int nCol;.
14170 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30    int nExtra = 0
14180 3b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61  ;.  char *zExtra
14190 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 74  ;..  assert( pSt
141a0 61 72 74 3d 3d 30 20 7c 7c 20 70 45 6e 64 21 3d  art==0 || pEnd!=
141b0 30 20 29 3b 20 2f 2a 20 70 45 6e 64 20 6d 75 73  0 ); /* pEnd mus
141c0 74 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66  t be non-NULL if
141d0 20 70 53 74 61 72 74 20 69 73 20 2a 2f 0a 20 20   pStart is */.  
141e0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
141f0 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 20 20 20  nErr==0 );      
14200 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20  /* Never called 
14210 77 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72  with prior error
14220 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d  s */.  if( db->m
14230 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49  allocFailed || I
14240 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
14250 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
14260 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
14270 7d 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  }.  if( SQLITE_O
14280 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
14290 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
142a0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
142b0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
142c0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
142d0 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
142e0 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
142f0 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69    Return early i
14300 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a  f not found..  *
14310 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65  /.  if( pTblName
14320 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55  !=0 ){..    /* U
14330 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20  se the two-part 
14340 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65  index name to de
14350 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61  termine the data
14360 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20  base .    ** to 
14370 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74  search for the t
14380 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20  able. 'Fix' the 
14390 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
143a0 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66  is db.    ** bef
143b0 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74  ore looking up t
143c0 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  he table..    */
143d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
143e0 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b  me1 && pName2 );
143f0 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
14400 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
14410 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
14420 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
14430 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67     if( iDb<0 ) g
14440 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
14450 69 6e 64 65 78 3b 0a 0a 23 69 66 6e 64 65 66 20  index;..#ifndef 
14460 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50  SQLITE_OMIT_TEMP
14470 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  DB.    /* If the
14480 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20   index name was 
14490 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65  unqualified, che
144a0 63 6b 20 69 66 20 74 68 65 20 74 68 65 20 74 61  ck if the the ta
144b0 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20  ble.    ** is a 
144c0 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73  temp table. If s
144d0 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  o, set the datab
144e0 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74  ase to 1. Do not
144f0 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   do this.    ** 
14500 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20  if initialising 
14510 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  a database schem
14520 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  a..    */.    if
14530 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
14540 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   ){.      pTab =
14550 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c   sqlite3SrcListL
14560 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54  ookup(pParse, pT
14570 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  blName);.      i
14580 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20  f( pName2->n==0 
14590 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d  && pTab && pTab-
145a0 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
145b0 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a  b[1].pSchema ){.
145c0 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b          iDb = 1;
145d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
145e0 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 73  endif..    if( s
145f0 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
14600 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
14610 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65  , "index", pName
14620 29 20 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c  ) &&.        sql
14630 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26  ite3FixSrcList(&
14640 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a  sFix, pTblName).
14650 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
14660 42 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73  Because the pars
14670 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54  er constructs pT
14680 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69  blName from a si
14690 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c  ngle identifier,
146a0 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
146b0 33 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20  3FixSrcList can 
146c0 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20  never fail. */. 
146d0 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a       assert(0);.
146e0 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d      }.    pTab =
146f0 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
14700 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ble(pParse, 0, p
14710 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  TblName->a[0].zN
14720 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54  ame, .        pT
14730 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61  blName->a[0].zDa
14740 74 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28  tabase);.    if(
14750 20 21 70 54 61 62 20 7c 7c 20 64 62 2d 3e 6d 61   !pTab || db->ma
14760 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
14770 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
14780 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dex;.    assert(
14790 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
147a0 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
147b0 68 65 6d 61 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  hema );.  }else{
147c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
147d0 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61  me==0 );.    pTa
147e0 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
147f0 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21  Table;.    if( !
14800 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74  pTab ) goto exit
14810 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
14820 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
14830 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
14840 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
14850 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64  ;.  }.  pDb = &d
14860 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
14870 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
14880 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
14890 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a  rse->nErr==0 );.
148a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
148b0 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d  NICmp(pTab->zNam
148c0 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
148d0 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 6d  ==0 .       && m
148e0 65 6d 63 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61  emcmp(&pTab->zNa
148f0 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f  me[7],"altertab_
14900 22 2c 39 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  ",9)!=0 ){.    s
14910 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14920 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
14930 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
14940 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  xed", pTab->zNam
14950 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
14960 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
14970 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
14980 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69  TE_OMIT_VIEW.  i
14990 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
149a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
149b0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
149c0 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62  "views may not b
149d0 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20  e indexed");.   
149e0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
149f0 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e  e_index;.  }.#en
14a00 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
14a10 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
14a20 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72  ABLE.  if( IsVir
14a30 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
14a40 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
14a50 67 28 70 50 61 72 73 65 2c 20 22 76 69 72 74 75  g(pParse, "virtu
14a60 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f  al tables may no
14a70 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a  t be indexed");.
14a80 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
14a90 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
14aa0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a  #endif..  /*.  *
14ab0 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20  * Find the name 
14ac0 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d  of the index.  M
14ad0 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
14ae0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e  s not already an
14af0 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78  other.  ** index
14b00 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74   or table with t
14b10 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a  he same name.  .
14b20 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74    **.  ** Except
14b30 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20  ion:  If we are 
14b40 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65  reading the name
14b50 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69  s of permanent i
14b60 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a  ndices from the.
14b70 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74    ** sqlite_mast
14b80 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73  er table (becaus
14b90 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
14ba0 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65  cess changed the
14bb0 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a   schema) and.  *
14bc0 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64  * one of the ind
14bd0 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65  ex names collide
14be0 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20  s with the name 
14bf0 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  of a temporary t
14c00 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64  able or.  ** ind
14c10 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ex, then we will
14c20 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f   continue to pro
14c30 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e  cess this index.
14c40 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e  .  **.  ** If pN
14c50 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
14c60 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a  that we are.  **
14c70 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
14c80 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55  primary key or U
14c90 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
14ca0 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  .  We have to in
14cb0 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77  vent our.  ** ow
14cc0 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  n name..  */.  i
14cd0 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( pName ){.    
14ce0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
14cf0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
14d00 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   pName);.    if(
14d10 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f   zName==0 ) goto
14d20 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
14d30 65 78 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  ex;.    if( SQLI
14d40 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
14d50 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
14d60 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
14d70 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
14d80 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
14d90 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d    }.    if( !db-
14da0 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
14db0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
14dc0 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
14dd0 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20  me, 0)!=0 ){.   
14de0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
14df0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68  rMsg(pParse, "th
14e00 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
14e10 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22   table named %s"
14e20 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
14e30 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
14e40 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
14e50 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
14e60 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
14e70 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d  (db, zName, pDb-
14e80 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  >zName)!=0 ){.  
14e90 20 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78      if( !ifNotEx
14ea0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ist ){.        s
14eb0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14ec0 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73  Parse, "index %s
14ed0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
14ee0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
14ef0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
14f00 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
14f10 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20 20  .busy );.       
14f20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
14f30 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
14f40 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20   iDb);.      }. 
14f50 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
14f60 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
14f70 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
14f80 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78  int n;.    Index
14f90 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72   *pLoop;.    for
14fa0 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e  (pLoop=pTab->pIn
14fb0 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b  dex, n=1; pLoop;
14fc0 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e   pLoop=pLoop->pN
14fd0 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20  ext, n++){}.    
14fe0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
14ff0 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69  Printf(db, "sqli
15000 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f  te_autoindex_%s_
15010 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %d", pTab->zName
15020 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  , n);.    if( zN
15030 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
15040 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
15050 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
15060 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
15070 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  r authorization 
15080 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  to create an ind
15090 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ex..  */.#ifndef
150a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
150b0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
150c0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
150d0 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b  Db = pDb->zName;
150e0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
150f0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
15100 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
15110 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
15120 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  b), 0, zDb) ){. 
15130 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
15140 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
15150 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54   }.    i = SQLIT
15160 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a  E_CREATE_INDEX;.
15170 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
15180 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
15190 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
151a0 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  TE_TEMP_INDEX;. 
151b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
151c0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
151d0 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i, zName, pTab->
151e0 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
151f0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
15200 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
15210 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
15220 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c   /* If pList==0,
15230 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72   it means this r
15240 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
15250 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d  d to make a prim
15260 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74  ary.  ** key out
15270 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   of the last col
15280 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  umn added to the
15290 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
152a0 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  struction..  ** 
152b0 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65  So create a fake
152c0 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74   list to simulat
152d0 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69  e this..  */.  i
152e0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
152f0 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54     nullId.z = pT
15300 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
15310 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col-1].zName;.  
15320 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 71 6c    nullId.n = sql
15330 69 74 65 33 53 74 72 6c 65 6e 33 30 28 28 63 68  ite3Strlen30((ch
15340 61 72 2a 29 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20  ar*)nullId.z);. 
15350 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
15360 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
15370 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a  (pParse, 0, 0);.
15380 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
15390 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
153a0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 73  ate_index;.    s
153b0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
153c0 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4c  tName(pParse, pL
153d0 69 73 74 2c 20 26 6e 75 6c 6c 49 64 2c 20 30 29  ist, &nullId, 0)
153e0 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30  ;.    pList->a[0
153f0 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  ].sortOrder = (u
15400 38 29 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  8)sortOrder;.  }
15410 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
15420 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73  t how many bytes
15430 20 6f 66 20 73 70 61 63 65 20 61 72 65 20 72 65   of space are re
15440 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
15450 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20  explicitly.  ** 
15460 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74  specified collat
15470 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
15480 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
15490 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
154a0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
154b0 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73  pr *pExpr = pLis
154c0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
154d0 20 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a     if( pExpr ){.
154e0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
154f0 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43  Coll = pExpr->pC
15500 6f 6c 6c 3b 0a 20 20 20 20 20 20 2f 2a 20 45 69  oll;.      /* Ei
15510 74 68 65 72 20 70 43 6f 6c 6c 21 3d 30 20 6f 72  ther pColl!=0 or
15520 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 4f 4f   there was an OO
15530 4d 20 66 61 69 6c 75 72 65 2e 20 20 42 75 74 20  M failure.  But 
15540 69 66 20 61 6e 20 4f 4f 4d 0a 20 20 20 20 20 20  if an OOM.      
15550 2a 2a 20 66 61 69 6c 75 72 65 20 77 65 20 68 61  ** failure we ha
15560 76 65 20 71 75 69 74 20 62 65 66 6f 72 65 20 72  ve quit before r
15570 65 61 63 68 69 6e 67 20 74 68 69 73 20 70 6f 69  eaching this poi
15580 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  nt. */.      if(
15590 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 29   ALWAYS(pColl) )
155a0 7b 0a 20 20 20 20 20 20 20 20 6e 45 78 74 72 61  {.        nExtra
155b0 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33   += (1 + sqlite3
155c0 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e  Strlen30(pColl->
155d0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d  zName));.      }
155e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
155f0 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20   .  ** Allocate 
15600 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74  the index struct
15610 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61  ure. .  */.  nNa
15620 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
15630 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e  en30(zName);.  n
15640 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  Col = pList->nEx
15650 70 72 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73  pr;.  pIndex = s
15660 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
15670 72 6f 28 64 62 2c 20 0a 20 20 20 20 20 20 73 69  ro(db, .      si
15680 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 20 20  zeof(Index) +   
15690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
156a0 64 65 78 20 73 74 72 75 63 74 75 72 65 20 20 2a  dex structure  *
156b0 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 74  /.      sizeof(t
156c0 52 6f 77 63 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29  Rowcnt)*(nCol+1)
156d0 20 2b 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69   +   /* Index.ai
156e0 52 6f 77 45 73 74 20 20 20 2a 2f 0a 20 20 20 20  RowEst   */.    
156f0 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 43    sizeof(int)*nC
15700 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  ol +           /
15710 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e  * Index.aiColumn
15720 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65     */.      size
15730 6f 66 28 63 68 61 72 20 2a 29 2a 6e 43 6f 6c 20  of(char *)*nCol 
15740 2b 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65  +        /* Inde
15750 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a  x.azColl     */.
15760 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29        sizeof(u8)
15770 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20  *nCol +         
15780 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72     /* Index.aSor
15790 74 4f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20  tOrder */.      
157a0 6e 4e 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20  nName + 1 +     
157b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
157c0 49 6e 64 65 78 2e 7a 4e 61 6d 65 20 20 20 20 20  Index.zName     
157d0 20 2a 2f 0a 20 20 20 20 20 20 6e 45 78 74 72 61   */.      nExtra
157e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157f0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
15800 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
15810 65 73 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28  es */.  );.  if(
15820 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
15830 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
15840 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
15850 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 2d 3e 61  .  }.  pIndex->a
15860 69 52 6f 77 45 73 74 20 3d 20 28 74 52 6f 77 63  iRowEst = (tRowc
15870 6e 74 2a 29 28 26 70 49 6e 64 65 78 5b 31 5d 29  nt*)(&pIndex[1])
15880 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  ;.  pIndex->azCo
15890 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29 28 26 70  ll = (char**)(&p
158a0 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 5b  Index->aiRowEst[
158b0 6e 43 6f 6c 2b 31 5d 29 3b 0a 20 20 70 49 6e 64  nCol+1]);.  pInd
158c0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28  ex->aiColumn = (
158d0 69 6e 74 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e  int *)(&pIndex->
158e0 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20  azColl[nCol]);. 
158f0 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72   pIndex->aSortOr
15900 64 65 72 20 3d 20 28 75 38 20 2a 29 28 26 70 49  der = (u8 *)(&pI
15910 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  ndex->aiColumn[n
15920 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d  Col]);.  pIndex-
15930 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a  >zName = (char *
15940 29 28 26 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74  )(&pIndex->aSort
15950 4f 72 64 65 72 5b 6e 43 6f 6c 5d 29 3b 0a 20 20  Order[nCol]);.  
15960 7a 45 78 74 72 61 20 3d 20 28 63 68 61 72 20 2a  zExtra = (char *
15970 29 28 26 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  )(&pIndex->zName
15980 5b 6e 4e 61 6d 65 2b 31 5d 29 3b 0a 20 20 6d 65  [nName+1]);.  me
15990 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61  mcpy(pIndex->zNa
159a0 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  me, zName, nName
159b0 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70  +1);.  pIndex->p
159c0 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20  Table = pTab;.  
159d0 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
159e0 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
159f0 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f    pIndex->onErro
15a00 72 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b  r = (u8)onError;
15a10 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49  .  pIndex->autoI
15a20 6e 64 65 78 20 3d 20 28 75 38 29 28 70 4e 61 6d  ndex = (u8)(pNam
15a30 65 3d 3d 30 29 3b 0a 20 20 70 49 6e 64 65 78 2d  e==0);.  pIndex-
15a40 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  >pSchema = db->a
15a50 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b  Db[iDb].pSchema;
15a60 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
15a70 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
15a80 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
15a90 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
15aa0 73 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64  see if we should
15ab0 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75   honor DESC requ
15ac0 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f  ests on index co
15ad0 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28  lumns.  */.  if(
15ae0 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66   pDb->pSchema->f
15af0 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b  ile_format>=4 ){
15b00 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61  .    sortOrderMa
15b10 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f  sk = -1;   /* Ho
15b20 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65  nor DESC */.  }e
15b30 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64  lse{.    sortOrd
15b40 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f  erMask = 0;    /
15b50 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f  * Ignore DESC */
15b60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e 20  .  }..  /* Scan 
15b70 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65  the names of the
15b80 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
15b90 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  table to be inde
15ba0 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61  xed and.  ** loa
15bb0 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64  d the column ind
15bc0 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e  ices into the In
15bd0 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 20  dex structure.  
15be0 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a  Report an error.
15bf0 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75    ** if any colu
15c00 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e  mn is not found.
15c10 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a  .  **.  ** TODO:
15c20 20 20 41 64 64 20 61 20 74 65 73 74 20 74 6f 20    Add a test to 
15c30 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
15c40 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69  he same column i
15c50 73 20 6e 6f 74 20 6e 61 6d 65 64 0a 20 20 2a 2a  s not named.  **
15c60 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20   more than once 
15c70 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20  within the same 
15c80 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65  index.  Only the
15c90 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65 20   first instance 
15ca0 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75  of.  ** the colu
15cb0 6d 6e 20 77 69 6c 6c 20 65 76 65 72 20 62 65 20  mn will ever be 
15cc0 75 73 65 64 20 62 79 20 74 68 65 20 6f 70 74 69  used by the opti
15cd0 6d 69 7a 65 72 2e 20 20 4e 6f 74 65 20 74 68 61  mizer.  Note tha
15ce0 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  t using the.  **
15cf0 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 6d 6f 72   same column mor
15d00 65 20 74 68 61 6e 20 6f 6e 63 65 20 63 61 6e 6e  e than once cann
15d10 6f 74 20 62 65 20 61 6e 20 65 72 72 6f 72 20 62  ot be an error b
15d20 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c  ecause that woul
15d30 64 20 0a 20 20 2a 2a 20 62 72 65 61 6b 20 62 61  d .  ** break ba
15d40 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
15d50 69 6c 69 74 79 20 2d 20 69 74 20 6e 65 65 64 73  ility - it needs
15d60 20 74 6f 20 62 65 20 61 20 77 61 72 6e 69 6e 67   to be a warning
15d70 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
15d80 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73  , pListItem=pLis
15d90 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  t->a; i<pList->n
15da0 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74  Expr; i++, pList
15db0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  Item++){.    con
15dc0 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e 61 6d  st char *zColNam
15dd0 65 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 7a  e = pListItem->z
15de0 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e  Name;.    Column
15df0 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 20 20 69   *pTabCol;.    i
15e00 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f 72 74  nt requestedSort
15e10 4f 72 64 65 72 3b 0a 20 20 20 20 63 68 61 72 20  Order;.    char 
15e20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *zColl;         
15e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
15e40 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
15e50 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72  name */..    for
15e60 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54  (j=0, pTabCol=pT
15e70 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62  ab->aCol; j<pTab
15e80 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61  ->nCol; j++, pTa
15e90 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69  bCol++){.      i
15ea0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
15eb0 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62  p(zColName, pTab
15ec0 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29  Col->zName)==0 )
15ed0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15ee0 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e    if( j>=pTab->n
15ef0 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Col ){.      sql
15f00 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15f10 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68  rse, "table %s h
15f20 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d  as no column nam
15f30 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  ed %s",.        
15f40 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pTab->zName, zCo
15f50 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 50  lName);.      pP
15f60 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
15f70 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  a = 1;.      got
15f80 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
15f90 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
15fa0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
15fb0 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 2f 2a 20 4a  i] = j;.    /* J
15fc0 75 73 74 69 66 69 63 61 74 69 6f 6e 20 6f 66 20  ustification of 
15fd0 74 68 65 20 41 4c 57 41 59 53 28 70 4c 69 73 74  the ALWAYS(pList
15fe0 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f  Item->pExpr->pCo
15ff0 6c 6c 29 3a 20 20 42 65 63 61 75 73 65 20 6f 66  ll):  Because of
16000 0a 20 20 20 20 2a 2a 20 74 68 65 20 77 61 79 20  .    ** the way 
16010 74 68 65 20 22 69 64 78 6c 69 73 74 22 20 6e 6f  the "idxlist" no
16020 6e 2d 74 65 72 6d 69 6e 61 6c 20 69 73 20 63 6f  n-terminal is co
16030 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65  nstructed by the
16040 20 70 61 72 73 65 72 2c 0a 20 20 20 20 2a 2a 20   parser,.    ** 
16050 69 66 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45  if pListItem->pE
16060 78 70 72 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20  xpr is not null 
16070 74 68 65 6e 20 65 69 74 68 65 72 20 70 4c 69 73  then either pLis
16080 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43  tItem->pExpr->pC
16090 6f 6c 6c 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20  oll.    ** must 
160a0 65 78 69 73 74 20 6f 72 20 65 6c 73 65 20 74 68  exist or else th
160b0 65 72 65 20 6d 75 73 74 20 68 61 76 65 20 62 65  ere must have be
160c0 65 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  en an OOM error.
160d0 20 20 42 75 74 20 69 66 20 74 68 65 72 65 0a 20    But if there. 
160e0 20 20 20 2a 2a 20 77 61 73 20 61 6e 20 4f 4f 4d     ** was an OOM
160f0 20 65 72 72 6f 72 2c 20 77 65 20 77 6f 75 6c 64   error, we would
16100 20 6e 65 76 65 72 20 72 65 61 63 68 20 74 68 69   never reach thi
16110 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20  s point. */.    
16120 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  if( pListItem->p
16130 45 78 70 72 20 26 26 20 41 4c 57 41 59 53 28 70  Expr && ALWAYS(p
16140 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d  ListItem->pExpr-
16150 3e 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20  >pColl) ){.     
16160 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20   int nColl;.    
16170 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49    zColl = pListI
16180 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c  tem->pExpr->pCol
16190 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l->zName;.      
161a0 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53  nColl = sqlite3S
161b0 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b  trlen30(zColl) +
161c0 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   1;.      assert
161d0 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20  ( nExtra>=nColl 
161e0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
161f0 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e  zExtra, zColl, n
16200 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f  Coll);.      zCo
16210 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20  ll = zExtra;.   
16220 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 43 6f     zExtra += nCo
16230 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  ll;.      nExtra
16240 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d   -= nColl;.    }
16250 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c  else{.      zCol
16260 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  l = pTab->aCol[j
16270 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69  ].zColl;.      i
16280 66 28 20 21 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !zColl ){.   
16290 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 64 62 2d       zColl = db-
162a0 3e 70 44 66 6c 74 43 6f 6c 6c 2d 3e 7a 4e 61 6d  >pDfltColl->zNam
162b0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
162c0 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
162d0 69 74 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69  it.busy && !sqli
162e0 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
162f0 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20  (pParse, zColl) 
16300 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
16310 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
16320 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
16330 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a  x->azColl[i] = z
16340 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73  Coll;.    reques
16350 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70  tedSortOrder = p
16360 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72  ListItem->sortOr
16370 64 65 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d  der & sortOrderM
16380 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d  ask;.    pIndex-
16390 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
163a0 20 28 75 38 29 72 65 71 75 65 73 74 65 64 53 6f   (u8)requestedSo
163b0 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20 73  rtOrder;.  }.  s
163c0 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77  qlite3DefaultRow
163d0 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20  Est(pIndex);..  
163e0 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65  if( pTab==pParse
163f0 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20  ->pNewTable ){. 
16400 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69     /* This routi
16410 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  ne has been call
16420 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
16430 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
16440 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75  as a.    ** resu
16450 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20  lt of a PRIMARY 
16460 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c  KEY or UNIQUE cl
16470 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  ause on a column
16480 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a   definition, or.
16490 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59      ** a PRIMARY
164a0 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
164b0 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  lause following 
164c0 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  the column defin
164d0 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69  itions..    ** i
164e0 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20  .e. one of:.    
164f0 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45  **.    ** CREATE
16500 20 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41   TABLE t(x PRIMA
16510 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20  RY KEY, y);.    
16520 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
16530 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78  t(x, y, UNIQUE(x
16540 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  , y));.    **.  
16550 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c    ** Either way,
16560 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
16570 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   the table alrea
16580 64 79 20 68 61 73 20 73 75 63 68 20 61 6e 20 69  dy has such an i
16590 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20  ndex. If.    ** 
165a0 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72  so, don't bother
165b0 20 63 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f   creating this o
165c0 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70  ne. This only ap
165d0 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20  plies to.    ** 
165e0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72  automatically cr
165f0 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55  eated indices. U
16600 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74  sers can do as t
16610 68 65 79 20 77 69 73 68 20 77 69 74 68 0a 20 20  hey wish with.  
16620 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e    ** explicit in
16630 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20  dices..    **.  
16640 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45 20    ** Two UNIQUE 
16650 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
16660 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63  onstraints are c
16670 6f 6e 73 69 64 65 72 65 64 20 65 71 75 69 76 61  onsidered equiva
16680 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64  lent.    ** (and
16690 20 74 68 75 73 20 73 75 70 70 72 65 73 73 69 6e   thus suppressin
166a0 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65  g the second one
166b0 29 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 68  ) even if they h
166c0 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20  ave different.  
166d0 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 73    ** sort orders
166e0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
166f0 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66  If there are dif
16700 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67  ferent collating
16710 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20 69 66   sequences or if
16720 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a   the columns of.
16730 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74      ** the const
16740 72 61 69 6e 74 20 6f 63 63 75 72 20 69 6e 20 64  raint occur in d
16750 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 73 2c  ifferent orders,
16760 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72   then the constr
16770 61 69 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a  aints are.    **
16780 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69 73 74   considered dist
16790 69 6e 63 74 20 61 6e 64 20 62 6f 74 68 20 72 65  inct and both re
167a0 73 75 6c 74 20 69 6e 20 73 65 70 61 72 61 74 65  sult in separate
167b0 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f   indices..    */
167c0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
167d0 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
167e0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
167f0 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
16800 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
16810 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  k;.      assert(
16820 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
16830 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20  OE_None );.     
16840 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
16850 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20 20 20  utoIndex );.    
16860 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
16870 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
16880 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  ne );..      if(
16890 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d   pIdx->nColumn!=
168a0 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
168b0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
168c0 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64    for(k=0; k<pId
168d0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29  x->nColumn; k++)
168e0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
168f0 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20  char *z1;.      
16900 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32    const char *z2
16910 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
16920 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21  dx->aiColumn[k]!
16930 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  =pIndex->aiColum
16940 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  n[k] ) break;.  
16950 20 20 20 20 20 20 7a 31 20 3d 20 70 49 64 78 2d        z1 = pIdx-
16960 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20  >azColl[k];.    
16970 20 20 20 20 7a 32 20 3d 20 70 49 6e 64 65 78 2d      z2 = pIndex-
16980 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20  >azColl[k];.    
16990 20 20 20 20 69 66 28 20 7a 31 21 3d 7a 32 20 26      if( z1!=z2 &
169a0 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
169b0 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65 61 6b  (z1, z2) ) break
169c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
169d0 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f  if( k==pIdx->nCo
169e0 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
169f0 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
16a00 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  r!=pIndex->onErr
16a10 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
16a20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69  /* This constrai
16a30 6e 74 20 63 72 65 61 74 65 73 20 74 68 65 20 73  nt creates the s
16a40 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61 20 70  ame index as a p
16a50 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20  revious.        
16a60 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20    ** constraint 
16a70 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68  specified somewh
16a80 65 72 65 20 69 6e 20 74 68 65 20 43 52 45 41 54  ere in the CREAT
16a90 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
16aa0 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  t..          ** 
16ab0 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43  However the ON C
16ac0 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
16ad0 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49  are different. I
16ae0 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20  f both this .   
16af0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72         ** constr
16b00 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65  aint and the pre
16b10 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74  vious equivalent
16b20 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65   constraint have
16b30 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20   explicit.      
16b40 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49      ** ON CONFLI
16b50 43 54 20 63 6c 61 75 73 65 73 20 74 68 69 73 20  CT clauses this 
16b60 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68  is an error. Oth
16b70 65 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a  erwise, use the.
16b80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70            ** exp
16b90 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65  licitly specifie
16ba0 64 20 62 65 68 61 76 69 6f 75 72 20 66 6f 72 20  d behaviour for 
16bb0 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  the index..     
16bc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
16bd0 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e    if( !(pIdx->on
16be0 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
16bf0 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  t || pIndex->onE
16c00 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
16c10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
16c20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
16c30 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
16c40 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c            "confl
16c50 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49  icting ON CONFLI
16c60 43 54 20 63 6c 61 75 73 65 73 20 73 70 65 63 69  CT clauses speci
16c70 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20  fied", 0);.     
16c80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
16c90 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
16ca0 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29  or==OE_Default )
16cb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  {.            pI
16cc0 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49  dx->onError = pI
16cd0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20  ndex->onError;. 
16ce0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16cf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74     }.        got
16d00 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
16d10 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
16d20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e   }.  }..  /* Lin
16d30 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20  k the new Index 
16d40 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
16d50 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68   table and to th
16d60 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d  e other.  ** in-
16d70 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
16d80 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a  structures. .  *
16d90 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
16da0 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64  .busy ){.    Ind
16db0 65 78 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72  ex *p;.    asser
16dc0 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
16dd0 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
16de0 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
16df0 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  ) );.    p = sql
16e00 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
16e10 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d  pIndex->pSchema-
16e20 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20  >idxHash, .     
16e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e40 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
16e50 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  me, sqlite3Strle
16e60 6e 33 30 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  n30(pIndex->zNam
16e70 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e),.            
16e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
16e90 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70  ndex);.    if( p
16ea0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
16eb0 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20  ( p==pIndex );  
16ec0 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
16ed0 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ave failed */.  
16ee0 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
16ef0 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
16f00 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
16f10 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
16f20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
16f30 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
16f40 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62  ges;.    if( pTb
16f50 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  lName!=0 ){.    
16f60 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
16f70 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
16f80 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  m;.    }.  }..  
16f90 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
16fa0 69 74 2e 62 75 73 79 20 69 73 20 30 20 74 68 65  it.busy is 0 the
16fb0 6e 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 64  n create the ind
16fc0 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69  ex on disk.  Thi
16fd0 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20  s.  ** involves 
16fe0 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65  writing the inde
16ff0 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65  x into the maste
17000 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c  r table and fill
17010 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ing in the.  ** 
17020 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 63  index with the c
17030 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e  urrent table con
17040 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tents..  **.  **
17050 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   The db->init.bu
17060 73 79 20 69 73 20 30 20 77 68 65 6e 20 74 68 65  sy is 0 when the
17070 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65   user first ente
17080 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45  rs a CREATE INDE
17090 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e  X .  ** command.
170a0 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20    db->init.busy 
170b0 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61  is 1 when a data
170c0 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61  base is opened a
170d0 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20  nd .  ** CREATE 
170e0 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73  INDEX statements
170f0 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66   are read out of
17100 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
17110 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20  e.  In.  ** the 
17120 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20  latter case the 
17130 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
17140 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68  ists on disk, wh
17150 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20  ich is why.  ** 
17160 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  we don't want to
17170 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20   recreate it..  
17180 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e  **.  ** If pTblN
17190 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
171a0 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65  this index is ge
171b0 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72 69  nerated as a pri
171c0 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72  mary key.  ** or
171d0 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
171e0 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20 54  nt of a CREATE T
171f0 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
17200 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65   Since the table
17210 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62  .  ** has just b
17220 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20  een created, it 
17230 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61  contains no data
17240 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69   and the index i
17250 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
17260 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73  ** step can be s
17270 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65  kipped..  */.  e
17280 6c 73 65 7b 20 2f 2a 20 69 66 28 20 64 62 2d 3e  lse{ /* if( db->
17290 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 20 2a  init.busy==0 ) *
172a0 2f 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  /.    Vdbe *v;. 
172b0 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a     char *zStmt;.
172c0 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b      int iMem = +
172d0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a  +pParse->nMem;..
172e0 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
172f0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
17300 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67      if( v==0 ) g
17310 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
17320 69 6e 64 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a 20  index;...    /* 
17330 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70  Create the rootp
17340 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65  age for the inde
17350 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  x.    */.    sql
17360 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
17370 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
17380 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  1, iDb);.    sql
17390 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
173a0 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  , OP_CreateIndex
173b0 2c 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20  , iDb, iMem);.. 
173c0 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65     /* Gather the
173d0 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
173e0 66 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44  f the CREATE IND
173f0 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74  EX statement int
17400 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74  o.    ** the zSt
17410 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  mt variable.    
17420 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61 72  */.    if( pStar
17430 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
17440 74 28 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20  t( pEnd!=0 );.  
17450 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69      /* A named i
17460 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65 78 70  ndex with an exp
17470 6c 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44  licit CREATE IND
17480 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EX statement */.
17490 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71        zStmt = sq
174a0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
174b0 20 22 43 52 45 41 54 45 25 73 20 49 4e 44 45 58   "CREATE%s INDEX
174c0 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20   %.*s",.        
174d0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
174e0 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45   ? "" : " UNIQUE
174f0 22 2c 0a 20 20 20 20 20 20 20 20 28 69 6e 74 29  ",.        (int)
17500 28 70 45 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65  (pEnd->z - pName
17510 2d 3e 7a 29 20 2b 20 31 2c 0a 20 20 20 20 20 20  ->z) + 1,.      
17520 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20    pName->z);.   
17530 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
17540 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   An automatic in
17550 64 65 78 20 63 72 65 61 74 65 64 20 62 79 20 61  dex created by a
17560 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
17570 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
17580 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53  t */.      /* zS
17590 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
175a0 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20  intf(""); */.   
175b0 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20     zStmt = 0;.  
175c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
175d0 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69  an entry in sqli
175e0 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68  te_master for th
175f0 69 73 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a  is index.    */.
17600 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
17610 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
17620 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20          "INSERT 
17630 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45  INTO %Q.%s VALUE
17640 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c  S('index',%Q,%Q,
17650 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20  #%d,%Q);",.     
17660 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
17670 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
17680 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20  BLE(iDb),.      
17690 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c    pIndex->zName,
176a0 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
176b0 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 69 4d  Name,.        iM
176c0 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d  em,.        zStm
176d0 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  t.    );.    sql
176e0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
176f0 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  Stmt);..    /* F
17700 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69  ill the index wi
17710 74 68 20 64 61 74 61 20 61 6e 64 20 72 65 70 61  th data and repa
17720 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e 20  rse the schema. 
17730 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69 72  Code an OP_Expir
17740 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61  e.    ** to inva
17750 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63  lidate all pre-c
17760 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
17770 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ts..    */.    i
17780 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20  f( pTblName ){. 
17790 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69       sqlite3Refi
177a0 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
177b0 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20  pIndex, iMem);. 
177c0 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e       sqlite3Chan
177d0 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
177e0 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
177f0 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65  ite3VdbeAddParse
17800 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c  SchemaOp(v, iDb,
17810 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
17820 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61  3MPrintf(db, "na
17830 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65  me='%q' AND type
17840 3d 27 69 6e 64 65 78 27 22 2c 20 70 49 6e 64 65  ='index'", pInde
17850 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
17860 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17870 4f 70 31 28 76 2c 20 4f 50 5f 45 78 70 69 72 65  Op1(v, OP_Expire
17880 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
17890 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e  .  /* When addin
178a0 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68  g an index to th
178b0 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65  e list of indice
178c0 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d  s for a table, m
178d0 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c  ake.  ** sure al
178e0 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65  l indices labele
178f0 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d  d OE_Replace com
17900 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73  e after all thos
17910 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f  e labeled.  ** O
17920 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20  E_Ignore.  This 
17930 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72  is necessary for
17940 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6e   the correct con
17950 73 74 72 61 69 6e 74 20 63 68 65 63 6b 0a 20 20  straint check.  
17960 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 28 69  ** processing (i
17970 6e 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74  n sqlite3Generat
17980 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b  eConstraintCheck
17990 73 28 29 29 20 61 73 20 70 61 72 74 20 6f 66 0a  s()) as part of.
179a0 20 20 2a 2a 20 55 50 44 41 54 45 20 61 6e 64 20    ** UPDATE and 
179b0 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
179c0 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  s.  .  */.  if( 
179d0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c  db->init.busy ||
179e0 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a   pTblName==0 ){.
179f0 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21      if( onError!
17a00 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70  =OE_Replace || p
17a10 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20  Tab->pIndex==0. 
17a20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d          || pTab-
17a30 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  >pIndex->onError
17a40 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20  ==OE_Replace){. 
17a50 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
17a60 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  xt = pTab->pInde
17a70 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70  x;.      pTab->p
17a80 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
17a90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17aa0 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d   Index *pOther =
17ab0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
17ac0 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68       while( pOth
17ad0 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74  er->pNext && pOt
17ae0 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72  her->pNext->onEr
17af0 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
17b00 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65  ){.        pOthe
17b10 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  r = pOther->pNex
17b20 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
17b30 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
17b40 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
17b50 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e        pOther->pN
17b60 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  ext = pIndex;.  
17b70 20 20 7d 0a 20 20 20 20 70 52 65 74 20 3d 20 70    }.    pRet = p
17b80 49 6e 64 65 78 3b 0a 20 20 20 20 70 49 6e 64 65  Index;.    pInde
17b90 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  x = 0;.  }..  /*
17ba0 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65   Clean up before
17bb0 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74   exiting */.exit
17bc0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20  _create_index:. 
17bd0 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20   if( pIndex ){. 
17be0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
17bf0 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 7a 43 6f  (db, pIndex->zCo
17c00 6c 41 66 66 29 3b 0a 20 20 20 20 73 71 6c 69 74  lAff);.    sqlit
17c10 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 6e  e3DbFree(db, pIn
17c20 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  dex);.  }.  sqli
17c30 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
17c40 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
17c50 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
17c60 6c 65 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d  lete(db, pTblNam
17c70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
17c80 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
17c90 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
17ca0 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65  ../*.** Fill the
17cb0 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b   Index.aiRowEst[
17cc0 5d 20 61 72 72 61 79 20 77 69 74 68 20 64 65 66  ] array with def
17cd0 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ault information
17ce0 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a   - information.*
17cf0 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65  * to be used whe
17d00 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75  n we have not ru
17d10 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f  n the ANALYZE co
17d20 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52  mmand..**.** aiR
17d30 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70  owEst[0] is supp
17d40 6f 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ose to contain t
17d50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
17d60 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64  ments in the ind
17d70 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20  ex..** Since we 
17d80 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65  do not know, gue
17d90 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61  ss 1 million.  a
17da0 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e  iRowEst[1] is an
17db0 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
17dc0 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  .** number of ro
17dd0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
17de0 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70  that match any p
17df0 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20  articular value 
17e00 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  of the.** first 
17e10 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
17e20 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32  dex.  aiRowEst[2
17e30 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  ] is an estimate
17e40 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a   of the number.*
17e50 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d  * of rows that m
17e60 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75  atch any particu
17e70 6c 61 72 20 63 6f 6d 62 69 6e 69 61 74 69 6f 6e  lar combiniation
17e80 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 32 20   of the first 2 
17e90 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68  columns.** of th
17ea0 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f  e index.  And so
17eb0 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74   forth.  It must
17ec0 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 63   always be the c
17ed0 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20  ase that.*.**   
17ee0 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74          aiRowEst
17ef0 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d  [N]<=aiRowEst[N-
17f00 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  1].**           
17f10 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a  aiRowEst[N]>=1.*
17f20 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20  *.** Apart from 
17f30 74 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69  that, we have li
17f40 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65  ttle to go on be
17f50 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20  sides intuition 
17f60 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52  as to.** how aiR
17f70 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62  owEst[] should b
17f80 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20  e initialized.  
17f90 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65  The numbers gene
17fa0 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72  rated here.** ar
17fb0 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63  e based on typic
17fc0 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20  al values found 
17fd0 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65  in actual indice
17fe0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
17ff0 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28  e3DefaultRowEst(
18000 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
18010 74 52 6f 77 63 6e 74 20 2a 61 20 3d 20 70 49 64  tRowcnt *a = pId
18020 78 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20 69  x->aiRowEst;.  i
18030 6e 74 20 69 3b 0a 20 20 74 52 6f 77 63 6e 74 20  nt i;.  tRowcnt 
18040 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 61 21 3d  n;.  assert( a!=
18050 30 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 49  0 );.  a[0] = pI
18060 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f 77  dx->pTable->nRow
18070 45 73 74 3b 0a 20 20 69 66 28 20 61 5b 30 5d 3c  Est;.  if( a[0]<
18080 31 30 20 29 20 61 5b 30 5d 20 3d 20 31 30 3b 0a  10 ) a[0] = 10;.
18090 20 20 6e 20 3d 20 31 30 3b 0a 20 20 66 6f 72 28    n = 10;.  for(
180a0 69 3d 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 43  i=1; i<=pIdx->nC
180b0 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
180c0 20 61 5b 69 5d 20 3d 20 6e 3b 0a 20 20 20 20 69   a[i] = n;.    i
180d0 66 28 20 6e 3e 35 20 29 20 6e 2d 2d 3b 0a 20 20  f( n>5 ) n--;.  
180e0 7d 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e  }.  if( pIdx->on
180f0 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
18100 7b 0a 20 20 20 20 61 5b 70 49 64 78 2d 3e 6e 43  {.    a[pIdx->nC
18110 6f 6c 75 6d 6e 5d 20 3d 20 31 3b 0a 20 20 7d 0a  olumn] = 1;.  }.
18120 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
18130 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20  utine will drop 
18140 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65  an existing name
18150 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72  d index.  This r
18160 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d  outine.** implem
18170 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e  ents the DROP IN
18180 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  DEX statement..*
18190 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
181a0 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  opIndex(Parse *p
181b0 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
181c0 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78 69  pName, int ifExi
181d0 73 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  sts){.  Index *p
181e0 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76  Index;.  Vdbe *v
181f0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
18200 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
18210 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73 73 65  int iDb;..  asse
18220 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
18230 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e 65 76 65  ==0 );   /* Neve
18240 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 72  r called with pr
18250 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ior errors */.  
18260 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
18270 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
18280 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
18290 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
182a0 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
182b0 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
182c0 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
182d0 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
182e0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
182f0 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
18300 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
18310 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e  FindIndex(db, pN
18320 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
18330 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
18340 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
18350 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Index==0 ){.    
18360 69 66 28 20 21 69 66 45 78 69 73 74 73 20 29 7b  if( !ifExists ){
18370 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
18380 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
18390 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
183a0 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20  S", pName, 0);. 
183b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
183c0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
183d0 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61  yNamedSchema(pPa
183e0 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  rse, pName->a[0]
183f0 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
18400 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63   }.    pParse->c
18410 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
18420 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
18430 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
18440 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f  if( pIndex->auto
18450 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c  Index ){.    sql
18460 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
18470 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f  rse, "index asso
18480 63 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51  ciated with UNIQ
18490 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50  UE ".      "or P
184a0 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
184b0 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  raint cannot be 
184c0 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20  dropped", 0);.  
184d0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
184e0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44  _index;.  }.  iD
184f0 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
18500 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  aToIndex(db, pIn
18510 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23  dex->pSchema);.#
18520 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18530 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
18540 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
18550 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
18560 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65  INDEX;.    Table
18570 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
18580 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e  >pTable;.    con
18590 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
185a0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
185b0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
185c0 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
185d0 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
185e0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
185f0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
18600 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
18610 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  b, 0, zDb) ){.  
18620 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
18630 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
18640 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
18650 4d 50 44 42 20 26 26 20 69 44 62 20 29 20 63 6f  MPDB && iDb ) co
18660 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
18670 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
18680 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
18690 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
186a0 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  de, pIndex->zNam
186b0 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
186c0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
186d0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
186e0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
186f0 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
18700 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
18710 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  ve the index and
18720 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
18730 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20   table */.  v = 
18740 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
18750 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
18760 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
18770 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
18780 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
18790 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  );.    sqlite3Ne
187a0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
187b0 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  ,.       "DELETE
187c0 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
187d0 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74 79  E name=%Q AND ty
187e0 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20 20  pe='index'",.   
187f0 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
18800 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
18810 41 42 4c 45 28 69 44 62 29 2c 20 70 49 6e 64 65  ABLE(iDb), pInde
18820 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a  x->zName.    );.
18830 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
18840 53 74 61 74 54 61 62 6c 65 73 28 70 50 61 72 73  StatTables(pPars
18850 65 2c 20 69 44 62 2c 20 22 69 64 78 22 2c 20 70  e, iDb, "idx", p
18860 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Index->zName);. 
18870 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
18880 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
18890 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79  Db);.    destroy
188a0 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
188b0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69   pIndex->tnum, i
188c0 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
188d0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
188e0 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c  _DropIndex, iDb,
188f0 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a   0, 0, pIndex->z
18900 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65  Name, 0);.  }..e
18910 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a  xit_drop_index:.
18920 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
18930 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65  Delete(db, pName
18940 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72  );.}../*.** pArr
18950 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ay is a pointer 
18960 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f  to an array of o
18970 62 6a 65 63 74 73 2e 20 20 45 61 63 68 20 6f 62  bjects.  Each ob
18980 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61  ject in the.** a
18990 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79 20  rray is szEntry 
189a0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 20  bytes in size.  
189b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c  This routine all
189c0 6f 63 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20  ocates a new.** 
189d0 6f 62 6a 65 63 74 20 6f 6e 20 74 68 65 20 65 6e  object on the en
189e0 64 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e 0a  d of the array..
189f0 2a 2a 0a 2a 2a 20 2a 70 6e 45 6e 74 72 79 20 69  **.** *pnEntry i
18a00 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
18a10 65 6e 74 72 69 65 73 20 61 6c 72 65 61 64 79 20  entries already 
18a20 69 6e 20 75 73 65 2e 20 20 2a 70 6e 41 6c 6c 6f  in use.  *pnAllo
18a30 63 20 69 73 0a 2a 2a 20 74 68 65 20 70 72 65 76  c is.** the prev
18a40 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64  iously allocated
18a50 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
18a60 61 79 2e 20 20 69 6e 69 74 53 69 7a 65 20 69 73  ay.  initSize is
18a70 20 74 68 65 0a 2a 2a 20 73 75 67 67 65 73 74 65   the.** suggeste
18a80 64 20 69 6e 69 74 69 61 6c 20 61 72 72 61 79 20  d initial array 
18a90 73 69 7a 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  size allocation.
18aa0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78  .**.** The index
18ab0 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72   of the new entr
18ac0 79 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e  y is returned in
18ad0 20 2a 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54 68   *pIdx..**.** Th
18ae0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
18af0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
18b00 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 62 6a  the array of obj
18b10 65 63 74 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  ects.  This.** m
18b20 69 67 68 74 20 62 65 20 74 68 65 20 73 61 6d 65  ight be the same
18b30 20 61 73 20 74 68 65 20 70 41 72 72 61 79 20 70   as the pArray p
18b40 61 72 61 6d 65 74 65 72 20 6f 72 20 69 74 20 6d  arameter or it m
18b50 69 67 68 74 20 62 65 20 61 20 64 69 66 66 65 72  ight be a differ
18b60 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69  ent.** pointer i
18b70 66 20 74 68 65 20 61 72 72 61 79 20 77 61 73 20  f the array was 
18b80 72 65 73 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69 64  resized..*/.void
18b90 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c   *sqlite3ArrayAl
18ba0 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65  locate(.  sqlite
18bb0 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43  3 *db,      /* C
18bc0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74  onnection to not
18bd0 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61  ify of malloc fa
18be0 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64  ilures */.  void
18bf0 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a   *pArray,     /*
18c00 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   Array of object
18c10 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65 61  s.  Might be rea
18c20 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e  llocated */.  in
18c30 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20  t szEntry,      
18c40 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20  /* Size of each 
18c50 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72  object in the ar
18c60 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 69  ray */.  int ini
18c70 74 53 69 7a 65 2c 20 20 20 20 20 2f 2a 20 53 75  tSize,     /* Su
18c80 67 67 65 73 74 65 64 20 69 6e 69 74 69 61 6c 20  ggested initial 
18c90 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65  allocation, in e
18ca0 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  lements */.  int
18cb0 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f   *pnEntry,     /
18cc0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65  * Number of obje
18cd0 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  cts currently in
18ce0 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   use */.  int *p
18cf0 6e 41 6c 6c 6f 63 2c 20 20 20 20 20 2f 2a 20 43  nAlloc,     /* C
18d00 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
18d10 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69  he allocation, i
18d20 6e 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  n elements */.  
18d30 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20 20  int *pIdx       
18d40 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69    /* Write the i
18d50 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73 6c  ndex of a new sl
18d60 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ot here */.){.  
18d70 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 2a  char *z;.  if( *
18d80 70 6e 45 6e 74 72 79 20 3e 3d 20 2a 70 6e 41 6c  pnEntry >= *pnAl
18d90 6c 6f 63 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  loc ){.    void 
18da0 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e  *pNew;.    int n
18db0 65 77 53 69 7a 65 3b 0a 20 20 20 20 6e 65 77 53  ewSize;.    newS
18dc0 69 7a 65 20 3d 20 28 2a 70 6e 41 6c 6c 6f 63 29  ize = (*pnAlloc)
18dd0 2a 32 20 2b 20 69 6e 69 74 53 69 7a 65 3b 0a 20  *2 + initSize;. 
18de0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
18df0 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
18e00 41 72 72 61 79 2c 20 6e 65 77 53 69 7a 65 2a 73  Array, newSize*s
18e10 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66 28  zEntry);.    if(
18e20 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
18e30 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20    *pIdx = -1;.  
18e40 20 20 20 20 72 65 74 75 72 6e 20 70 41 72 72 61      return pArra
18e50 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e  y;.    }.    *pn
18e60 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44  Alloc = sqlite3D
18e70 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20  bMallocSize(db, 
18e80 70 4e 65 77 29 2f 73 7a 45 6e 74 72 79 3b 0a 20  pNew)/szEntry;. 
18e90 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65 77     pArray = pNew
18ea0 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61  ;.  }.  z = (cha
18eb0 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d  r*)pArray;.  mem
18ec0 73 65 74 28 26 7a 5b 2a 70 6e 45 6e 74 72 79 20  set(&z[*pnEntry 
18ed0 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73  * szEntry], 0, s
18ee0 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64 78  zEntry);.  *pIdx
18ef0 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 2b   = *pnEntry;.  +
18f00 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74  +*pnEntry;.  ret
18f10 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f  urn pArray;.}../
18f20 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
18f30 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
18f40 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20   given IdList.  
18f50 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c  Create a new IdL
18f60 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
18f70 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49  e..**.** A new I
18f80 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  dList is returne
18f90 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61  d, or NULL if ma
18fa0 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
18fb0 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
18fc0 49 64 4c 69 73 74 41 70 70 65 6e 64 28 73 71 6c  IdListAppend(sql
18fd0 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74  ite3 *db, IdList
18fe0 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
18ff0 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69  pToken){.  int i
19000 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
19010 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
19020 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
19030 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49  ero(db, sizeof(I
19040 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  dList) );.    if
19050 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
19060 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
19070 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  ->nAlloc = 0;.  
19080 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73  }.  pList->a = s
19090 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
190a0 61 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20  ate(.      db,. 
190b0 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20       pList->a,. 
190c0 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73       sizeof(pLis
190d0 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20  t->a[0]),.      
190e0 35 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d  5,.      &pList-
190f0 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 70 4c 69  >nId,.      &pLi
19100 73 74 2d 3e 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20  st->nAlloc,.    
19110 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20    &i.  );.  if( 
19120 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  i<0 ){.    sqlit
19130 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
19140 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72  b, pList);.    r
19150 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
19160 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
19170 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
19180 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b  omToken(db, pTok
19190 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  en);.  return pL
191a0 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ist;.}../*.** De
191b0 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a  lete an IdList..
191c0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49  */.void sqlite3I
191d0 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  dListDelete(sqli
191e0 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
191f0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
19200 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
19210 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
19220 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
19230 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Id; i++){.    sq
19240 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
19250 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
19260 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
19270 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
19280 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
19290 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
192a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
192b0 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  rn the index in 
192c0 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65  pList of the ide
192d0 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49  ntifier named zI
192e0 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a  d.  Return -1.**
192f0 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
19300 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c  /.int sqlite3IdL
19310 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20  istIndex(IdList 
19320 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68  *pList, const ch
19330 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
19340 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
19350 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ==0 ) return -1;
19360 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
19370 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
19380 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
19390 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
193a0 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  i].zName, zName)
193b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
193c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
193d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64  .}../*.** Expand
193e0 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63   the space alloc
193f0 61 74 65 64 20 66 6f 72 20 74 68 65 20 67 69 76  ated for the giv
19400 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63  en SrcList objec
19410 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67  t by.** creating
19420 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c 6f 74   nExtra new slot
19430 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 69  s beginning at i
19440 53 74 61 72 74 2e 20 20 69 53 74 61 72 74 20 69  Start.  iStart i
19450 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a  s zero based..**
19460 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65 20 7a   New slots are z
19470 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  eroed..**.** For
19480 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73   example, suppos
19490 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e 69 74  e a SrcList init
194a0 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74  ially contains t
194b0 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e  wo entries: A,B.
194c0 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20 33 20  .** To append 3 
194d0 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f  new entries onto
194e0 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74 68 69   the end, do thi
194f0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69  s:.**.**    sqli
19500 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
19510 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74 2c 20  e(db, pSrclist, 
19520 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74  3, 2);.**.** Aft
19530 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76  er the call abov
19540 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61  e it would conta
19550 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20  in:  A, B, nil, 
19560 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20  nil, nil..** If 
19570 74 68 65 20 69 53 74 61 72 74 20 61 72 67 75 6d  the iStart argum
19580 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31 20 69  ent had been 1 i
19590 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74 68 65  nstead of 2, the
195a0 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  n the result.** 
195b0 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 3a  would have been:
195c0 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e    A, nil, nil, n
195d0 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65 70 65  il, B.  To prepe
195e0 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f 74 73  nd the new slots
195f0 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72 74 20  ,.** the iStart 
19600 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20 30  value would be 0
19610 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 74 68  .  The result th
19620 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20  en would.** be: 
19630 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41  nil, nil, nil, A
19640 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  , B..**.** If a 
19650 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
19660 6e 20 66 61 69 6c 73 20 74 68 65 20 53 72 63 4c  n fails the SrcL
19670 69 73 74 20 69 73 20 75 6e 63 68 61 6e 67 65 64  ist is unchanged
19680 2e 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61  .  The.** db->ma
19690 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
196a0 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74  will be set to t
196b0 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  rue..*/.SrcList 
196c0 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45  *sqlite3SrcListE
196d0 6e 6c 61 72 67 65 28 0a 20 20 73 71 6c 69 74 65  nlarge(.  sqlite
196e0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a 20  3 *db,       /* 
196f0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
19700 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66  ion to notify of
19710 20 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20   OOM errors */. 
19720 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
19730 20 20 20 20 2f 2a 20 54 68 65 20 53 72 63 4c 69      /* The SrcLi
19740 73 74 20 74 6f 20 62 65 20 65 6e 6c 61 72 67 65  st to be enlarge
19750 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  d */.  int nExtr
19760 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  a,        /* Num
19770 62 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73  ber of new slots
19780 20 74 6f 20 61 64 64 20 74 6f 20 70 53 72 63 2d   to add to pSrc-
19790 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53  >a[] */.  int iS
197a0 74 61 72 74 20 20 20 20 20 20 20 20 20 2f 2a 20  tart         /* 
197b0 49 6e 64 65 78 20 69 6e 20 70 53 72 63 2d 3e 61  Index in pSrc->a
197c0 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e 65 77 20  [] of first new 
197d0 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  slot */.){.  int
197e0 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79   i;..  /* Sanity
197f0 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c   checking on cal
19800 6c 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  ling parameters 
19810 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  */.  assert( iSt
19820 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  art>=0 );.  asse
19830 72 74 28 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b  rt( nExtra>=1 );
19840 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21  .  assert( pSrc!
19850 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
19860 69 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53  iStart<=pSrc->nS
19870 72 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  rc );..  /* Allo
19880 63 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  cate additional 
19890 73 70 61 63 65 20 69 66 20 6e 65 65 64 65 64 20  space if needed 
198a0 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  */.  if( pSrc->n
198b0 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d  Src+nExtra>pSrc-
198c0 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53  >nAlloc ){.    S
198d0 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
198e0 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70    int nAlloc = p
198f0 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61  Src->nSrc+nExtra
19900 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a  ;.    int nGot;.
19910 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
19920 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
19930 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20  pSrc,.          
19940 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72       sizeof(*pSr
19950 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a  c) + (nAlloc-1)*
19960 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
19970 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ]) );.    if( pN
19980 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ew==0 ){.      a
19990 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
199a0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
199b0 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20 20   return pSrc;.  
199c0 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20 70    }.    pSrc = p
199d0 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20  New;.    nGot = 
199e0 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  (sqlite3DbMalloc
199f0 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20 2d  Size(db, pNew) -
19a00 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f   sizeof(*pSrc))/
19a10 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
19a20 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e  ])+1;.    pSrc->
19a30 6e 41 6c 6c 6f 63 20 3d 20 28 75 31 36 29 6e 47  nAlloc = (u16)nG
19a40 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f  ot;.  }..  /* Mo
19a50 76 65 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74  ve existing slot
19a60 73 20 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65  s that come afte
19a70 72 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65  r the newly inse
19a80 72 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20  rted slots.  ** 
19a90 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a  out of the way *
19aa0 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e  /.  for(i=pSrc->
19ab0 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72  nSrc-1; i>=iStar
19ac0 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72  t; i--){.    pSr
19ad0 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d  c->a[i+nExtra] =
19ae0 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d   pSrc->a[i];.  }
19af0 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d  .  pSrc->nSrc +=
19b00 20 28 69 31 36 29 6e 45 78 74 72 61 3b 0a 0a 20   (i16)nExtra;.. 
19b10 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65 77   /* Zero the new
19b20 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f  ly allocated slo
19b30 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ts */.  memset(&
19b40 70 53 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c  pSrc->a[iStart],
19b50 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 72 63 2d   0, sizeof(pSrc-
19b60 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a  >a[0])*nExtra);.
19b70 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 3b 20    for(i=iStart; 
19b80 69 3c 69 53 74 61 72 74 2b 6e 45 78 74 72 61 3b  i<iStart+nExtra;
19b90 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d   i++){.    pSrc-
19ba0 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20  >a[i].iCursor = 
19bb0 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  -1;.  }..  /* Re
19bc0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
19bd0 6f 20 74 68 65 20 65 6e 6c 61 72 67 65 64 20 53  o the enlarged S
19be0 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74 75  rcList */.  retu
19bf0 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  rn pSrc;.}.../*.
19c00 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
19c10 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
19c20 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e  e given SrcList.
19c30 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53    Create a new S
19c40 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  rcList if.** nee
19c50 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74  d be.  A new ent
19c60 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  ry is created in
19c70 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65   the SrcList eve
19c80 6e 20 69 66 20 70 54 61 62 6c 65 20 69 73 20 4e  n if pTable is N
19c90 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63  ULL..**.** A Src
19ca0 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
19cb0 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65  , or NULL if the
19cc0 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72  re is an OOM err
19cd0 6f 72 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65  or.  The returne
19ce0 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67  d.** SrcList mig
19cf0 68 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ht be the same a
19d00 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  s the SrcList th
19d10 61 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20  at was input or 
19d20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61  it might be.** a
19d30 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e   new one.  If an
19d40 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20   OOM error does 
19d50 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
19d60 20 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20   prior value of 
19d70 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73  pList.** that is
19d80 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72   input to this r
19d90 6f 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61  outine is automa
19da0 74 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a  tically freed..*
19db0 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73  *.** If pDatabas
19dc0 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69  e is not null, i
19dd0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
19de0 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70   table has an op
19df0 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61  tional.** databa
19e00 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20  se name prefix. 
19e10 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61   Like this:  "da
19e20 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20  tabase.table".  
19e30 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a  The pDatabase.**
19e40 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74   points to the t
19e50 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
19e60 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20  e pTable points 
19e70 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
19e80 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63  name..** The Src
19e90 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66  List.a[].zName f
19ea0 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77  ield is filled w
19eb0 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ith the table na
19ec0 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a  me which might.*
19ed0 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62  * come from pTab
19ee0 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65  le (if pDatabase
19ef0 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f   is NULL) or fro
19f00 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a  m pDatabase.  .*
19f10 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44  * SrcList.a[].zD
19f20 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65  atabase is fille
19f30 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
19f40 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54  ase name from pT
19f50 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68  able,.** or with
19f60 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61   NULL if no data
19f70 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65  base is specifie
19f80 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65  d..**.** In othe
19f90 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c  r words, if call
19fa0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
19fb0 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
19fc0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44  3SrcListAppend(D
19fd0 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54  ,A,B,0);.**.** T
19fe0 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65  hen B is a table
19ff0 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61   name and the da
1a000 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75  tabase name is u
1a010 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20  nspecified.  If 
1a020 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74  called.** like t
1a030 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
1a040 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1a050 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29  tAppend(D,A,B,C)
1a060 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69  ;.**.** Then C i
1a070 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  s the table name
1a080 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61   and B is the da
1a090 74 61 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66  tabase name.  If
1a0a0 20 43 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a   C is defined.**
1a0b0 20 74 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20   then so is B.  
1a0c0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1a0d0 77 65 20 6e 65 76 65 72 20 68 61 76 65 20 61 20  we never have a 
1a0e0 63 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a  case where:.**.*
1a0f0 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
1a100 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44  3SrcListAppend(D
1a110 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42  ,A,0,C);.**.** B
1a120 6f 74 68 20 70 54 61 62 6c 65 20 61 6e 64 20 70  oth pTable and p
1a130 44 61 74 61 62 61 73 65 20 61 72 65 20 61 73 73  Database are ass
1a140 75 6d 65 64 20 74 6f 20 62 65 20 71 75 6f 74 65  umed to be quote
1a150 64 2e 20 20 54 68 65 79 20 61 72 65 20 64 65 71  d.  They are deq
1a160 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20  uoted.** before 
1a170 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74  being added to t
1a180 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53  he SrcList..*/.S
1a190 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
1a1a0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20  rcListAppend(.  
1a1b0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1a1c0 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1a1d0 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d  n to notify of m
1a1e0 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a  alloc failures *
1a1f0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  /.  SrcList *pLi
1a200 73 74 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e  st,     /* Appen
1a210 64 20 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73  d to this SrcLis
1a220 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20  t. NULL creates 
1a230 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f  a new SrcList */
1a240 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
1a250 2c 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  ,      /* Table 
1a260 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54  to append */.  T
1a270 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20  oken *pDatabase 
1a280 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f     /* Database o
1a290 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29  f the table */.)
1a2a0 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  {.  struct SrcLi
1a2b0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1a2c0 20 20 61 73 73 65 72 74 28 20 70 44 61 74 61 62    assert( pDatab
1a2d0 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65  ase==0 || pTable
1a2e0 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f  !=0 );  /* Canno
1a2f0 74 20 68 61 76 65 20 43 20 77 69 74 68 6f 75 74  t have C without
1a300 20 42 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73   B */.  if( pLis
1a310 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
1a320 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
1a330 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
1a340 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20  of(SrcList) );. 
1a350 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
1a360 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1a370 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
1a380 31 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d  1;.  }.  pList =
1a390 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
1a3a0 6e 6c 61 72 67 65 28 64 62 2c 20 70 4c 69 73 74  nlarge(db, pList
1a3b0 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63  , 1, pList->nSrc
1a3c0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
1a3d0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1a3e0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
1a3f0 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
1a400 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1a410 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70    }.  pItem = &p
1a420 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
1a430 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44  Src-1];.  if( pD
1a440 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74 61  atabase && pData
1a450 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  base->z==0 ){.  
1a460 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b    pDatabase = 0;
1a470 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61  .  }.  if( pData
1a480 62 61 73 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65  base ){.    Toke
1a490 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61  n *pTemp = pData
1a4a0 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62  base;.    pDatab
1a4b0 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  ase = pTable;.  
1a4c0 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70    pTable = pTemp
1a4d0 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a  ;.  }.  pItem->z
1a4e0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
1a4f0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
1a500 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d  pTable);.  pItem
1a510 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ->zDatabase = sq
1a520 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1a530 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61 73 65  en(db, pDatabase
1a540 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  );.  return pLis
1a550 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  t;.}../*.** Assi
1a560 67 6e 20 56 64 62 65 43 75 72 73 6f 72 20 69 6e  gn VdbeCursor in
1a570 64 65 78 20 6e 75 6d 62 65 72 73 20 74 6f 20 61  dex numbers to a
1a580 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53  ll tables in a S
1a590 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73  rcList.*/.void s
1a5a0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
1a5b0 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65  ignCursors(Parse
1a5c0 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
1a5d0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
1a5e0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   i;.  struct Src
1a5f0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1a600 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 73 74  ;.  assert(pList
1a610 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
1a620 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1a630 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
1a640 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
1a650 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c  m=pList->a; i<pL
1a660 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
1a670 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
1a680 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  if( pItem->iCurs
1a690 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  or>=0 ) break;. 
1a6a0 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72       pItem->iCur
1a6b0 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
1a6c0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ab++;.      if( 
1a6d0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
1a6e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1a6f0 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
1a700 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49  rsors(pParse, pI
1a710 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53  tem->pSelect->pS
1a720 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc);.      }.   
1a730 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1a740 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
1a750 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69   SrcList includi
1a760 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74  ng all its subst
1a770 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64  ructure..*/.void
1a780 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
1a790 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
1a7a0 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  b, SrcList *pLis
1a7b0 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
1a7c0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1a7d0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
1a7e0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1a7f0 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  rn;.  for(pItem=
1a800 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
1a810 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
1a820 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
1a830 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1a840 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  b, pItem->zDatab
1a850 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ase);.    sqlite
1a860 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
1a870 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
1a880 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1a890 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
1a8a0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1a8b0 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 49  ee(db, pItem->zI
1a8c0 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74  ndex);.    sqlit
1a8d0 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
1a8e0 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a  , pItem->pTab);.
1a8f0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
1a900 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  tDelete(db, pIte
1a910 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
1a920 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1a930 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f  te(db, pItem->pO
1a940 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49  n);.    sqlite3I
1a950 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
1a960 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a  pItem->pUsing);.
1a970 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
1a980 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ree(db, pList);.
1a990 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1a9a0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1a9b0 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f  by the parser to
1a9c0 20 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20   add a new term 
1a9d0 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
1a9e0 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20   a growing FROM 
1a9f0 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70 22  clause.  The "p"
1aa00 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
1aa10 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  e part of.** the
1aa20 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61   FROM clause tha
1aa30 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
1aa40 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20  en constructed. 
1aa50 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20   "p" is NULL.** 
1aa60 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
1aa70 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65  irst term of the
1aa80 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70   FROM clause.  p
1aa90 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62  Table and pDatab
1aaa0 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e  ase.** are the n
1aab0 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
1aac0 20 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61   and database na
1aad0 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  med in the FROM 
1aae0 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20  clause term..** 
1aaf0 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
1ab00 4c 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  L if the databas
1ab10 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72  e name qualifier
1ab20 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68   is missing - th
1ab30 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e  e.** usual case.
1ab40 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 68 61    If the term ha
1ab50 73 20 61 20 61 6c 69 61 73 2c 20 74 68 65 6e 20  s a alias, then 
1ab60 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f  pAlias points to
1ab70 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f   the.** alias to
1ab80 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72  ken.  If the ter
1ab90 6d 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c  m is a subquery,
1aba0 20 74 68 65 6e 20 70 53 75 62 71 75 65 72 79 20   then pSubquery 
1abb0 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54  is the.** SELECT
1abc0 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
1abd0 74 68 65 20 73 75 62 71 75 65 72 79 20 65 6e 63  the subquery enc
1abe0 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c  odes.  The pTabl
1abf0 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61  e and.** pDataba
1ac00 73 65 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  se parameters ar
1ac10 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75  e NULL for subqu
1ac20 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20  eries.  The pOn 
1ac30 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61  and pUsing.** pa
1ac40 72 61 6d 65 74 65 72 73 20 61 72 65 20 74 68 65  rameters are the
1ac50 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
1ac60 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
1ac70 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  uses..**.** Retu
1ac80 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  rn a new SrcList
1ac90 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69   which encodes i
1aca0 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20  s the FROM with 
1acb0 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20  the new.** term 
1acc0 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73  added..*/.SrcLis
1acd0 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
1ace0 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
1acf0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1ad00 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
1ad10 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1ad20 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20  .  SrcList *p,  
1ad30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1ad40 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74  e left part of t
1ad50 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61  he FROM clause a
1ad60 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20  lready seen */. 
1ad70 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
1ad80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1ad90 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
1ada0 20 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d   add to the FROM
1adb0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b   clause */.  Tok
1adc0 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20  en *pDatabase,  
1add0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1ade0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
1adf0 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a  taining pTable *
1ae00 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61  /.  Token *pAlia
1ae10 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  s,          /* T
1ae20 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
1ae30 64 65 20 6f 66 20 74 68 65 20 41 53 20 73 75 62  de of the AS sub
1ae40 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
1ae50 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72  Select *pSubquer
1ae60 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  y,      /* A sub
1ae70 71 75 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c  query used in pl
1ae80 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e  ace of a table n
1ae90 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ame */.  Expr *p
1aea0 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  On,             
1aeb0 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73   /* The ON claus
1aec0 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20  e of a join */. 
1aed0 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20   IdList *pUsing 
1aee0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1aef0 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
1af00 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73  a join */.){.  s
1af10 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1af20 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c  em *pItem;.  sql
1af30 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1af40 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21 70 20  e->db;.  if( !p 
1af50 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e  && (pOn || pUsin
1af60 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  g) ){.    sqlite
1af70 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1af80 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65  , "a JOIN clause
1af90 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66   is required bef
1afa0 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20  ore %s", .      
1afb0 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55  (pOn ? "ON" : "U
1afc0 53 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20 20  SING").    );.  
1afd0 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72    goto append_fr
1afe0 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  om_error;.  }.  
1aff0 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  p = sqlite3SrcLi
1b000 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70 2c 20  stAppend(db, p, 
1b010 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73  pTable, pDatabas
1b020 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  e);.  if( p==0 |
1b030 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 53 72 63 3d  | NEVER(p->nSrc=
1b040 3d 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =0) ){.    goto 
1b050 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f  append_from_erro
1b060 72 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d  r;.  }.  pItem =
1b070 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31   &p->a[p->nSrc-1
1b080 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 41 6c  ];.  assert( pAl
1b090 69 61 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ias!=0 );.  if( 
1b0a0 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20  pAlias->n ){.   
1b0b0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d   pItem->zAlias =
1b0c0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1b0d0 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61 73  Token(db, pAlias
1b0e0 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e  );.  }.  pItem->
1b0f0 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75  pSelect = pSubqu
1b100 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f  ery;.  pItem->pO
1b110 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d  n = pOn;.  pItem
1b120 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e  ->pUsing = pUsin
1b130 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a  g;.  return p;..
1b140 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72   append_from_err
1b150 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20 70 3d  or:.  assert( p=
1b160 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  =0 );.  sqlite3E
1b170 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4f  xprDelete(db, pO
1b180 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c  n);.  sqlite3IdL
1b190 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55  istDelete(db, pU
1b1a0 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  sing);.  sqlite3
1b1b0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
1b1c0 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20 72   pSubquery);.  r
1b1d0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1b1e0 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44  * Add an INDEXED
1b1f0 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58   BY or NOT INDEX
1b200 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  ED clause to the
1b210 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
1b220 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74  dded .** element
1b230 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c   of the source-l
1b240 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ist passed as th
1b250 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1b260 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1b270 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64  e3SrcListIndexed
1b280 42 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  By(Parse *pParse
1b290 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f  , SrcList *p, To
1b2a0 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29  ken *pIndexedBy)
1b2b0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 64  {.  assert( pInd
1b2c0 65 78 65 64 42 79 21 3d 30 20 29 3b 0a 20 20 69  exedBy!=0 );.  i
1b2d0 66 28 20 70 20 26 26 20 41 4c 57 41 59 53 28 70  f( p && ALWAYS(p
1b2e0 2d 3e 6e 53 72 63 3e 30 29 20 29 7b 0a 20 20 20  ->nSrc>0) ){.   
1b2f0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1b300 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
1b310 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a  ->a[p->nSrc-1];.
1b320 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
1b330 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30  m->notIndexed==0
1b340 20 26 26 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65   && pItem->zInde
1b350 78 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  x==0 );.    if( 
1b360 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31  pIndexedBy->n==1
1b370 20 26 26 20 21 70 49 6e 64 65 78 65 64 42 79 2d   && !pIndexedBy-
1b380 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  >z ){.      /* A
1b390 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 63   "NOT INDEXED" c
1b3a0 6c 61 75 73 65 20 77 61 73 20 73 75 70 70 6c 69  lause was suppli
1b3b0 65 64 2e 20 53 65 65 20 70 61 72 73 65 2e 79 20  ed. See parse.y 
1b3c0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72  .      ** constr
1b3d0 75 63 74 20 22 69 6e 64 65 78 65 64 5f 6f 70 74  uct "indexed_opt
1b3e0 22 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a  " for details. *
1b3f0 2f 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 6e  /.      pItem->n
1b400 6f 74 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20  otIndexed = 1;. 
1b410 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b420 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20  pItem->zIndex = 
1b430 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1b440 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
1b450 20 70 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20   pIndexedBy);.  
1b460 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1b470 20 57 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 75   When building u
1b480 70 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  p a FROM clause 
1b490 69 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20 74  in the parser, t
1b4a0 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
1b4b0 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  .** is initially
1b4c0 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
1b4d0 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e 20 20   left operand.  
1b4e0 42 75 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e  But the code gen
1b4f0 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74  erator.** expect
1b500 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  s the join opera
1b510 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74 68 65  tor to be on the
1b520 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 20   right operand. 
1b530 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
1b540 20 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e   Shifts all join
1b550 20 6f 70 65 72 61 74 6f 72 73 20 66 72 6f 6d 20   operators from 
1b560 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 66 6f  left to right fo
1b570 72 20 61 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d  r an entire FROM
1b580 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  .** clause..**.*
1b590 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f  * Example: Suppo
1b5a0 73 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c  se the join is l
1b5b0 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1b5c0 20 20 20 20 20 20 20 20 20 20 41 20 6e 61 74 75            A natu
1b5d0 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42  ral cross join B
1b5e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61  .**.** The opera
1b5f0 74 6f 72 20 69 73 20 22 6e 61 74 75 72 61 6c 20  tor is "natural 
1b600 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68  cross join".  Th
1b610 65 20 41 20 61 6e 64 20 42 20 6f 70 65 72 61 6e  e A and B operan
1b620 64 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a  ds are stored.**
1b630 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20   in p->a[0] and 
1b640 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63 74  p->a[1], respect
1b650 69 76 65 6c 79 2e 20 20 54 68 65 20 70 61 72 73  ively.  The pars
1b660 65 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f  er initially sto
1b670 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61  res the.** opera
1b680 74 6f 72 20 77 69 74 68 20 41 2e 20 20 54 68 69  tor with A.  Thi
1b690 73 20 72 6f 75 74 69 6e 65 20 73 68 69 66 74 73  s routine shifts
1b6a0 20 74 68 61 74 20 6f 70 65 72 61 74 6f 72 20 6f   that operator o
1b6b0 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69  ver to B..*/.voi
1b6c0 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
1b6d0 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 53 72  ShiftJoinType(Sr
1b6e0 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 66 28  cList *p){.  if(
1b6f0 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
1b700 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
1b710 61 20 7c 7c 20 70 2d 3e 6e 53 72 63 3d 3d 30 20  a || p->nSrc==0 
1b720 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e  );.    for(i=p->
1b730 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  nSrc-1; i>0; i--
1b740 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d  ){.      p->a[i]
1b750 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61  .jointype = p->a
1b760 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a  [i-1].jointype;.
1b770 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30      }.    p->a[0
1b780 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  ].jointype = 0;.
1b790 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67    }.}../*.** Beg
1b7a0 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
1b7b0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1b7c0 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  BeginTransaction
1b7d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1b7e0 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c  int type){.  sql
1b7f0 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
1b800 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20   *v;.  int i;.. 
1b810 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
1b820 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61  =0 );.  db = pPa
1b830 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
1b840 74 28 20 64 62 21 3d 30 20 29 3b 0a 2f 2a 20 20  t( db!=0 );./*  
1b850 69 66 28 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  if( db->aDb[0].p
1b860 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20  Bt==0 ) return; 
1b870 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
1b880 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1b890 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
1b8a0 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30  TION, "BEGIN", 0
1b8b0 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
1b8c0 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71  rn;.  }.  v = sq
1b8d0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1b8e0 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29  rse);.  if( !v )
1b8f0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74   return;.  if( t
1b900 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44  ype!=TK_DEFERRED
1b910 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
1b920 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
1b930 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1b940 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b950 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20  Transaction, i, 
1b960 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53  (type==TK_EXCLUS
1b970 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 20 20 73  IVE)+1);.      s
1b980 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
1b990 72 65 65 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d  ree(v, i);.    }
1b9a0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
1b9b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
1b9c0 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29  utoCommit, 0, 0)
1b9d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
1b9e0 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  t a transaction.
1b9f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
1ba00 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e  ommitTransaction
1ba10 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
1ba20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1ba30 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73    Vdbe *v;..  as
1ba40 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
1ba50 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  );.  db = pParse
1ba60 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
1ba70 64 62 21 3d 30 20 29 3b 0a 2f 2a 20 20 69 66 28  db!=0 );./*  if(
1ba80 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
1ba90 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 2a 2f 0a  =0 ) return; */.
1baa0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
1bab0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1bac0 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
1bad0 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20  N, "COMMIT", 0, 
1bae0 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1baf0 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69  ;.  }.  v = sqli
1bb00 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1bb10 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
1bb20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bb30 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp2(v, OP_AutoC
1bb40 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20  ommit, 1, 0);.  
1bb50 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  }.}../*.** Rollb
1bb60 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
1bb70 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
1bb80 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63  3RollbackTransac
1bb90 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
1bba0 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se){.  sqlite3 *
1bbb0 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  db;.  Vdbe *v;..
1bbc0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1bbd0 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50  !=0 );.  db = pP
1bbe0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
1bbf0 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 2f 2a 20  rt( db!=0 );./* 
1bc00 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 30 5d 2e   if( db->aDb[0].
1bc10 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBt==0 ) return;
1bc20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
1bc30 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1bc40 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
1bc50 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b  CTION, "ROLLBACK
1bc60 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  ", 0, 0) ){.    
1bc70 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20  return;.  }.  v 
1bc80 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1bc90 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
1bca0 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
1bcb0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1bcc0 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20  _AutoCommit, 1, 
1bcd0 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  1);.  }.}../*.**
1bce0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1bcf0 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
1bd00 70 61 72 73 65 72 20 77 68 65 6e 20 69 74 20 70  parser when it p
1bd10 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20  arses a command 
1bd20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65  to create,.** re
1bd30 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
1bd40 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70 6f 69  k an SQL savepoi
1bd50 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nt. .*/.void sql
1bd60 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50 61  ite3Savepoint(Pa
1bd70 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1bd80 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d   op, Token *pNam
1bd90 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  e){.  char *zNam
1bda0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
1bdb0 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
1bdc0 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  >db, pName);.  i
1bdd0 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
1bde0 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
1bdf0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1be00 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1be10 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
1be20 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63 20 63  ION.    static c
1be30 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73  onst char * cons
1be40 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49  t az[] = { "BEGI
1be50 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22  N", "RELEASE", "
1be60 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20  ROLLBACK" };.   
1be70 20 61 73 73 65 72 74 28 20 21 53 41 56 45 50 4f   assert( !SAVEPO
1be80 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53 41 56  INT_BEGIN && SAV
1be90 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d  EPOINT_RELEASE==
1bea0 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52  1 && SAVEPOINT_R
1beb0 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65  OLLBACK==2 );.#e
1bec0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21 76 20  ndif.    if( !v 
1bed0 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  || sqlite3AuthCh
1bee0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1bef0 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a  TE_SAVEPOINT, az
1bf00 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20  [op], zName, 0) 
1bf10 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1bf20 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
1bf30 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b, zName);.     
1bf40 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
1bf50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bf60 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76 65 70  dOp4(v, OP_Savep
1bf70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  oint, op, 0, 0, 
1bf80 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49  zName, P4_DYNAMI
1bf90 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  C);.  }.}../*.**
1bfa0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54   Make sure the T
1bfb0 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20  EMP database is 
1bfc0 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62  open and availab
1bfd0 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74  le for use.  Ret
1bfe0 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
1bff0 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65  r of errors.  Le
1c000 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ave any error me
1c010 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50  ssages in the pP
1c020 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
1c030 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70  */.int sqlite3Op
1c040 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50  enTempDatabase(P
1c050 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
1c060 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1c070 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
1c080 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d   db->aDb[1].pBt=
1c090 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65  =0 && !pParse->e
1c0a0 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e  xplain ){.    in
1c0b0 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65 65 20  t rc;.    Btree 
1c0c0 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 74 69 63  *pBt;.    static
1c0d0 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
1c0e0 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53 51   = .          SQ
1c0f0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1c100 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ITE |.          
1c110 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1c120 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  TE |.          S
1c130 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
1c140 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20  SIVE |.         
1c150 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
1c160 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20  ETEONCLOSE |.   
1c170 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1c180 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20  EN_TEMP_DB;..   
1c190 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1c1a0 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c  eeOpen(db->pVfs,
1c1b0 20 30 2c 20 64 62 2c 20 26 70 42 74 2c 20 30 2c   0, db, &pBt, 0,
1c1c0 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
1c1d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c1e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1c1f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1c200 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
1c210 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  a temporary data
1c220 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22  base ".        "
1c230 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67  file for storing
1c240 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1c250 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  s");.      pPars
1c260 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  e->rc = rc;.    
1c270 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1c280 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d  }.    db->aDb[1]
1c290 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  .pBt = pBt;.    
1c2a0 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
1c2b0 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  1].pSchema );.  
1c2c0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d    if( SQLITE_NOM
1c2d0 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  EM==sqlite3Btree
1c2e0 53 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c  SetPageSize(pBt,
1c2f0 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a   db->nextPagesiz
1c300 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20  e, -1, 0) ){.   
1c310 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
1c320 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  led = 1;.      r
1c330 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1c340 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1c350 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1c360 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
1c370 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20  will verify the 
1c380 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e  schema cookie an
1c390 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72 65 61  d start.** a rea
1c3a0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  d-transaction fo
1c3b0 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61  r all named data
1c3c0 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  base files..**.*
1c3d0 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  * It is importan
1c3e0 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68 65 6d  t that all schem
1c3f0 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76 65 72  a cookies be ver
1c400 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a  ified and all.**
1c410 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1c420 6e 73 20 62 65 20 73 74 61 72 74 65 64 20 62 65  ns be started be
1c430 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20 65 6c  fore anything el
1c440 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a  se happens in.**
1c450 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61   the VDBE progra
1c460 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75  m.  But this rou
1c470 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c  tine can be call
1c480 65 64 20 61 66 74 65 72 20 6d 75 63 68 20 6f 74  ed after much ot
1c490 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20  her.** code has 
1c4a0 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e 20  been generated. 
1c4b0 20 53 6f 20 68 65 72 65 20 69 73 20 77 68 61 74   So here is what
1c4c0 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68   we do:.**.** Th
1c4d0 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
1c4e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1c4f0 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61 6e 20  led, we code an 
1c500 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20  OP_Goto that.** 
1c510 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73  will jump to a s
1c520 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74 68 65  ubroutine at the
1c530 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 67   end of the prog
1c540 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a  ram.  Then we.**
1c550 20 72 65 63 6f 72 64 20 65 76 65 72 79 20 64 61   record every da
1c560 74 61 62 61 73 65 20 74 68 61 74 20 6e 65 65 64  tabase that need
1c570 73 20 69 74 73 20 73 63 68 65 6d 61 20 76 65 72  s its schema ver
1c580 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  ified in the.** 
1c590 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1c5a0 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74 65 72  sk field.  Later
1c5b0 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74 68 65  , after all othe
1c5c0 72 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 0a  r code has been.
1c5d0 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20 74 68  ** generated, th
1c5e0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  e subroutine tha
1c5f0 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69  t does the cooki
1c600 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20  e verifications 
1c610 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20 74 68  and.** starts th
1c620 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 77  e transactions w
1c630 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61 6e 64  ill be coded and
1c640 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20   the OP_Goto P2 
1c650 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  value.** will be
1c660 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74   made to point t
1c670 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74 69 6e  o that subroutin
1c680 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61 74 69  e.  The generati
1c690 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f  on of the.** coo
1c6a0 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  kie verification
1c6b0 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f 64 65   subroutine code
1c6c0 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71 6c 69   happens in sqli
1c6d0 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28  te3FinishCoding(
1c6e0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c  )..**.** If iDb<
1c6f0 30 20 74 68 65 6e 20 63 6f 64 65 20 74 68 65 20  0 then code the 
1c700 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64  OP_Goto only - d
1c710 6f 6e 27 74 20 73 65 74 20 66 6c 61 67 20 74 6f  on't set flag to
1c720 20 76 65 72 69 66 79 20 74 68 65 0a 2a 2a 20 73   verify the.** s
1c730 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74  chema on any dat
1c740 61 62 61 73 65 73 2e 20 20 54 68 69 73 20 63 61  abases.  This ca
1c750 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70 6f 73  n be used to pos
1c760 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74  ition the OP_Got
1c770 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74 68  o.** early in th
1c780 65 20 63 6f 64 65 2c 20 62 65 66 6f 72 65 20 77  e code, before w
1c790 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64 61  e know if any da
1c7a0 74 61 62 61 73 65 20 74 61 62 6c 65 73 20 77 69  tabase tables wi
1c7b0 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76  ll be used..*/.v
1c7c0 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56  oid sqlite3CodeV
1c7d0 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73  erifySchema(Pars
1c7e0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1c7f0 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54  Db){.  Parse *pT
1c800 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
1c810 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
1c820 50 61 72 73 65 29 3b 0a 0a 20 20 69 66 28 20 70  Parse);..  if( p
1c830 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
1c840 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 56  Goto==0 ){.    V
1c850 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
1c860 47 65 74 56 64 62 65 28 70 54 6f 70 6c 65 76 65  GetVdbe(pTopleve
1c870 6c 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  l);.    if( v==0
1c880 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54   ) return;  /* T
1c890 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
1c8a0 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61 20   if there was a 
1c8b0 70 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20  prior error */. 
1c8c0 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f     pToplevel->co
1c8d0 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74  okieGoto = sqlit
1c8e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1c8f0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 2b 31  OP_Goto, 0, 0)+1
1c900 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3e  ;.  }.  if( iDb>
1c910 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1c920 33 20 2a 64 62 20 3d 20 70 54 6f 70 6c 65 76 65  3 *db = pTopleve
1c930 6c 2d 3e 64 62 3b 0a 20 20 20 20 79 44 62 4d 61  l->db;.    yDbMa
1c940 73 6b 20 6d 61 73 6b 3b 0a 0a 20 20 20 20 61 73  sk mask;..    as
1c950 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44  sert( iDb<db->nD
1c960 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  b );.    assert(
1c970 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
1c980 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29  t!=0 || iDb==1 )
1c990 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  ;.    assert( iD
1c9a0 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  b<SQLITE_MAX_ATT
1c9b0 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 20 20 61  ACHED+2 );.    a
1c9c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
1c9d0 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
1c9e0 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
1c9f0 20 6d 61 73 6b 20 3d 20 28 28 79 44 62 4d 61 73   mask = ((yDbMas
1ca00 6b 29 31 29 3c 3c 69 44 62 3b 0a 20 20 20 20 69  k)1)<<iDb;.    i
1ca10 66 28 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63  f( (pToplevel->c
1ca20 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b  ookieMask & mask
1ca30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 54  )==0 ){.      pT
1ca40 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d  oplevel->cookieM
1ca50 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
1ca60 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f     pToplevel->co
1ca70 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d  okieValue[iDb] =
1ca80 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
1ca90 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f  chema->schema_co
1caa0 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69 66 28 20  okie;.      if( 
1cab0 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
1cac0 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
1cad0 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d    sqlite3OpenTem
1cae0 70 44 61 74 61 62 61 73 65 28 70 54 6f 70 6c 65  pDatabase(pTople
1caf0 76 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  vel);.      }.  
1cb00 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1cb10 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 44 62   If argument zDb
1cb20 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63   is NULL, then c
1cb30 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 64 65 56  all sqlite3CodeV
1cb40 65 72 69 66 79 53 63 68 65 6d 61 28 29 20 66 6f  erifySchema() fo
1cb50 72 20 65 61 63 68 20 0a 2a 2a 20 61 74 74 61 63  r each .** attac
1cb60 68 65 64 20 64 61 74 61 62 61 73 65 2e 20 4f 74  hed database. Ot
1cb70 68 65 72 77 69 73 65 2c 20 69 6e 76 6f 6b 65 20  herwise, invoke 
1cb80 69 74 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  it for the datab
1cb90 61 73 65 20 6e 61 6d 65 64 20 7a 44 62 20 6f 6e  ase named zDb on
1cba0 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
1cbb0 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d  te3CodeVerifyNam
1cbc0 65 64 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a  edSchema(Parse *
1cbd0 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
1cbe0 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73 71 6c 69  ar *zDb){.  sqli
1cbf0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1cc00 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
1cc10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
1cc20 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44  nDb; i++){.    D
1cc30 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
1cc40 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
1cc50 62 2d 3e 70 42 74 20 26 26 20 28 21 7a 44 62 20  b->pBt && (!zDb 
1cc60 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  || 0==sqlite3Str
1cc70 49 43 6d 70 28 7a 44 62 2c 20 70 44 62 2d 3e 7a  ICmp(zDb, pDb->z
1cc80 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20 20 20 20  Name)) ){.      
1cc90 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
1cca0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
1ccb0 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  i);.    }.  }.}.
1ccc0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1ccd0 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70  VDBE code that p
1cce0 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e  repares for doin
1ccf0 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74  g an operation t
1cd00 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61  hat.** might cha
1cd10 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  nge the database
1cd20 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1cd30 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65  tine starts a ne
1cd40 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  w transaction if
1cd50 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
1cd60 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20  ady within.** a 
1cd70 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
1cd80 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
1cd90 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
1cda0 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65  tion, then a che
1cdb0 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65  ckpoint.** is se
1cdc0 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74  t if the setStat
1cdd0 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20  ement parameter 
1cde0 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63  is true.  A chec
1cdf0 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a  kpoint should.**
1ce00 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72   be set for oper
1ce10 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68  ations that migh
1ce20 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61  t fail (due to a
1ce30 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72   constraint) par
1ce40 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20  t of.** the way 
1ce50 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63  through and whic
1ce60 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75  h will need to u
1ce70 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20  ndo some writes 
1ce80 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
1ce90 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68  o.** rollback th
1cea0 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74  e whole transact
1ceb0 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74  ion.  For operat
1cec0 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63  ions where all c
1ced0 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61  onstraints.** ca
1cee0 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66  n be checked bef
1cef0 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ore any changes 
1cf00 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
1cf10 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20  database, it is 
1cf20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61  never.** necessa
1cf30 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69  ry to undo a wri
1cf40 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  te and the check
1cf50 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74  point should not
1cf60 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   be set..*/.void
1cf70 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1cf80 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73  teOperation(Pars
1cf90 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73  e *pParse, int s
1cfa0 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74  etStatement, int
1cfb0 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a   iDb){.  Parse *
1cfc0 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
1cfd0 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
1cfe0 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
1cff0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
1d000 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
1d010 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 77  ;.  pToplevel->w
1d020 72 69 74 65 4d 61 73 6b 20 7c 3d 20 28 28 79 44  riteMask |= ((yD
1d030 62 4d 61 73 6b 29 31 29 3c 3c 69 44 62 3b 0a 20  bMask)1)<<iDb;. 
1d040 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75   pToplevel->isMu
1d050 6c 74 69 57 72 69 74 65 20 7c 3d 20 73 65 74 53  ltiWrite |= setS
1d060 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a  tatement;.}../*.
1d070 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  ** Indicate that
1d080 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63   the statement c
1d090 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
1d0a0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d 69 67 68  onstruction migh
1d0b0 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20  t write.** more 
1d0c0 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28  than one entry (
1d0d0 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e  example: deletin
1d0e0 67 20 6f 6e 65 20 72 6f 77 20 74 68 65 6e 20 69  g one row then i
1d0f0 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74 68 65 72  nserting another
1d100 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d  ,.** inserting m
1d110 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 69 6e 20  ultiple rows in 
1d120 61 20 74 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65  a table, or inse
1d130 72 74 69 6e 67 20 61 20 72 6f 77 20 61 6e 64 20  rting a row and 
1d140 69 6e 64 65 78 20 65 6e 74 72 69 65 73 2e 29 0a  index entries.).
1d150 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72 74 20 6f  ** If an abort o
1d160 63 63 75 72 73 20 61 66 74 65 72 20 73 6f 6d 65  ccurs after some
1d170 20 6f 66 20 74 68 65 73 65 20 77 72 69 74 65 73   of these writes
1d180 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c   have completed,
1d190 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a   then it will.**
1d1a0 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
1d1b0 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65   undo the comple
1d1c0 74 65 64 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76  ted writes..*/.v
1d1d0 6f 69 64 20 73 71 6c 69 74 65 33 4d 75 6c 74 69  oid sqlite3Multi
1d1e0 57 72 69 74 65 28 50 61 72 73 65 20 2a 70 50 61  Write(Parse *pPa
1d1f0 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  rse){.  Parse *p
1d200 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
1d210 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
1d220 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c  pParse);.  pTopl
1d230 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69  evel->isMultiWri
1d240 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  te = 1;.}../* .*
1d250 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
1d260 61 74 6f 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ator calls this 
1d270 72 6f 75 74 69 6e 65 20 69 66 20 69 73 20 64 69  routine if is di
1d280 73 63 6f 76 65 72 73 20 74 68 61 74 20 69 74 20  scovers that it 
1d290 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74  is.** possible t
1d2a0 6f 20 61 62 6f 72 74 20 61 20 73 74 61 74 65 6d  o abort a statem
1d2b0 65 6e 74 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d  ent prior to com
1d2c0 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64  pletion.  In ord
1d2d0 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72  er to .** perfor
1d2e0 6d 20 74 68 69 73 20 61 62 6f 72 74 20 77 69 74  m this abort wit
1d2f0 68 6f 75 74 20 63 6f 72 72 75 70 74 69 6e 67 20  hout corrupting 
1d300 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 77 65  the database, we
1d310 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a   need to make.**
1d320 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73   sure that the s
1d330 74 61 74 65 6d 65 6e 74 20 69 73 20 70 72 6f 74  tatement is prot
1d340 65 63 74 65 64 20 62 79 20 61 20 73 74 61 74 65  ected by a state
1d350 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
1d360 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61  ..**.** Technica
1d370 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65  lly, we only nee
1d380 64 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 79  d to set the may
1d390 41 62 6f 72 74 20 66 6c 61 67 20 69 66 20 74 68  Abort flag if th
1d3a0 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57 72 69 74  e.** isMultiWrit
1d3b0 65 20 66 6c 61 67 20 77 61 73 20 70 72 65 76 69  e flag was previ
1d3c0 6f 75 73 6c 79 20 73 65 74 2e 20 20 54 68 65 72  ously set.  Ther
1d3d0 65 20 69 73 20 61 20 74 69 6d 65 20 64 65 70 65  e is a time depe
1d3e0 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74  ndency.** such t
1d3f0 68 61 74 20 74 68 65 20 61 62 6f 72 74 20 6d 75  hat the abort mu
1d400 73 74 20 6f 63 63 75 72 20 61 66 74 65 72 20 74  st occur after t
1d410 68 65 20 6d 75 6c 74 69 77 72 69 74 65 2e 20 20  he multiwrite.  
1d420 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f  This makes.** so
1d430 6d 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  me statements in
1d440 76 6f 6c 76 69 6e 67 20 74 68 65 20 52 45 50 4c  volving the REPL
1d450 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  ACE conflict res
1d460 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
1d470 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65  m.** go a little
1d480 20 66 61 73 74 65 72 2e 20 20 42 75 74 20 74 61   faster.  But ta
1d490 6b 69 6e 67 20 61 64 76 61 6e 74 61 67 65 20 6f  king advantage o
1d4a0 66 20 74 68 69 73 20 74 69 6d 65 20 64 65 70 65  f this time depe
1d4b0 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20  ndency.** makes 
1d4c0 69 74 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c  it more difficul
1d4d0 74 20 74 6f 20 70 72 6f 76 65 20 74 68 61 74 20  t to prove that 
1d4e0 74 68 65 20 63 6f 64 65 20 69 73 20 63 6f 72 72  the code is corr
1d4f0 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74  ect (in .** part
1d500 69 63 75 6c 61 72 2c 20 69 74 20 70 72 65 76 65  icular, it preve
1d510 6e 74 73 20 75 73 20 66 72 6f 6d 20 77 72 69 74  nts us from writ
1d520 69 6e 67 20 61 6e 20 65 66 66 65 63 74 69 76 65  ing an effective
1d530 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
1d540 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 41 73 73  on of sqlite3Ass
1d550 65 72 74 4d 61 79 41 62 6f 72 74 28 29 29 20 61  ertMayAbort()) a
1d560 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20 63 68  nd so we have ch
1d570 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20  osen.** to take 
1d580 74 68 65 20 73 61 66 65 20 72 6f 75 74 65 20 61  the safe route a
1d590 6e 64 20 73 6b 69 70 20 74 68 65 20 6f 70 74 69  nd skip the opti
1d5a0 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  mization..*/.voi
1d5b0 64 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72  d sqlite3MayAbor
1d5c0 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  t(Parse *pParse)
1d5d0 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
1d5e0 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
1d5f0 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
1d600 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c  se);.  pToplevel
1d610 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a  ->mayAbort = 1;.
1d620 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
1d630 20 4f 50 5f 48 61 6c 74 20 74 68 61 74 20 63 61   OP_Halt that ca
1d640 75 73 65 73 20 74 68 65 20 76 64 62 65 20 74 6f  uses the vdbe to
1d650 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54   return an SQLIT
1d660 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20  E_CONSTRAINT.** 
1d670 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72  error. The onErr
1d680 6f 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 74  or parameter det
1d690 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 28 69  ermines which (i
1d6a0 66 20 61 6e 79 29 20 6f 66 20 74 68 65 20 73 74  f any) of the st
1d6b0 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f  atement.** and/o
1d6c0 72 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  r current transa
1d6d0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
1d6e0 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  back..*/.void sq
1d6f0 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
1d700 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  int(Parse *pPars
1d710 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  e, int onError, 
1d720 63 68 61 72 20 2a 70 34 2c 20 69 6e 74 20 70 34  char *p4, int p4
1d730 74 79 70 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  type){.  Vdbe *v
1d740 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1d750 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1d760 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f   onError==OE_Abo
1d770 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rt ){.    sqlite
1d780 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
1d790 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1d7a0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1d7b0 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f  _Halt, SQLITE_CO
1d7c0 4e 53 54 52 41 49 4e 54 2c 20 6f 6e 45 72 72 6f  NSTRAINT, onErro
1d7d0 72 2c 20 30 2c 20 70 34 2c 20 70 34 74 79 70 65  r, 0, p4, p4type
1d7e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  );.}../*.** Chec
1d7f0 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64  k to see if pInd
1d800 65 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c  ex uses the coll
1d810 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
1d820 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  Coll.  Return.**
1d830 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73   true if it does
1d840 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74   and false if it
1d850 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69   does not..*/.#i
1d860 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d870 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
1d880 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61   int collationMa
1d890 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  tch(const char *
1d8a0 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49  zColl, Index *pI
1d8b0 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  ndex){.  int i;.
1d8c0 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21    assert( zColl!
1d8d0 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  =0 );.  for(i=0;
1d8e0 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75   i<pIndex->nColu
1d8f0 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  mn; i++){.    co
1d900 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49  nst char *z = pI
1d910 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b  ndex->azColl[i];
1d920 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d  .    assert( z!=
1d930 30 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  0 );.    if( 0==
1d940 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
1d950 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  , zColl) ){.    
1d960 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1d970 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1d980 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1d990 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  * Recompute all 
1d9a0 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20  indices of pTab 
1d9b0 74 68 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c  that use the col
1d9c0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1d9d0 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f  pColl..** If pCo
1d9e0 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d  ll==0 then recom
1d9f0 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
1da00 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66   of pTab..*/.#if
1da10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1da20 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
1da30 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c  void reindexTabl
1da40 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1da50 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68   Table *pTab, ch
1da60 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29  ar const *zColl)
1da70 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
1da80 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
1da90 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f  /* An index asso
1daa0 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62  ciated with pTab
1dab0 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65   */..  for(pInde
1dac0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
1dad0 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70  pIndex; pIndex=p
1dae0 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  Index->pNext){. 
1daf0 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20     if( zColl==0 
1db00 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63  || collationMatc
1db10 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29  h(zColl, pIndex)
1db20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44   ){.      int iD
1db30 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
1db40 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
1db50 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
1db60 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ma);.      sqlit
1db70 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
1db80 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
1db90 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
1dba0 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
1dbb0 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
1dbc0 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  -1);.    }.  }.}
1dbd0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
1dbe0 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
1dbf0 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c  ices of all tabl
1dc00 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61  es in all databa
1dc10 73 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a  ses where the.**
1dc20 20 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65   indices use the
1dc30 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1dc40 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70  nce pColl.  If p
1dc50 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63  Coll==0 then rec
1dc60 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e  ompute.** all in
1dc70 64 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65  dices everywhere
1dc80 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
1dc90 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
1dca0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69  .static void rei
1dcb0 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61  ndexDatabases(Pa
1dcc0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61  rse *pParse, cha
1dcd0 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b  r const *zColl){
1dce0 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20  .  Db *pDb;     
1dcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dd00 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62  * A single datab
1dd10 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ase */.  int iDb
1dd20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dd30 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
1dd40 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65  base index numbe
1dd50 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
1dd60 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1dd70 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
1dd80 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
1dd90 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20  .  HashElem *k; 
1dda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ddb0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
1ddc0 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62  er tables in pDb
1ddd0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1dde0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1ddf0 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20    /* A table in 
1de00 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
1de10 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1de20 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d  e3BtreeHoldsAllM
1de30 75 74 65 78 65 73 28 64 62 29 20 29 3b 20 20 2f  utexes(db) );  /
1de40 2a 20 4e 65 65 64 65 64 20 66 6f 72 20 73 63 68  * Needed for sch
1de50 65 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a 20 20  ema access */.  
1de60 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64  for(iDb=0, pDb=d
1de70 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e  b->aDb; iDb<db->
1de80 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b  nDb; iDb++, pDb+
1de90 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
1dea0 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f  pDb!=0 );.    fo
1deb0 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(k=sqliteHashFi
1dec0 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  rst(&pDb->pSchem
1ded0 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b  a->tblHash);  k;
1dee0 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   k=sqliteHashNex
1def0 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61  t(k)){.      pTa
1df00 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69  b = (Table*)sqli
1df10 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20  teHashData(k);. 
1df20 20 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c       reindexTabl
1df30 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
1df40 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  zColl);.    }.  
1df50 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
1df60 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1df70 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58 20  for the REINDEX 
1df80 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20  command..**.**  
1df90 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 20        REINDEX   
1dfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfb0 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a           -- 1.**
1dfc0 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
1dfd0 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20   <collation>    
1dfe0 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a             -- 2.
1dff0 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
1e000 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f  X  ?<database>.?
1e010 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20  <tablename>  -- 
1e020 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  3.**        REIN
1e030 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
1e040 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d  .?<indexname>  -
1e050 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31  - 4.**.** Form 1
1e060 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69   causes all indi
1e070 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63  ces in all attac
1e080 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f  hed databases to
1e090 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20   be rebuilt..** 
1e0a0 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20  Form 2 rebuilds 
1e0b0 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61  all indices in a
1e0c0 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74 68 61  ll databases tha
1e0d0 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a  t use the named.
1e0e0 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  ** collating fun
1e0f0 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20  ction.  Forms 3 
1e100 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74 68  and 4 rebuild th
1e110 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72  e named index or
1e120 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20   all.** indices 
1e130 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1e140 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e  the named table.
1e150 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1e160 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
1e170 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e  void sqlite3Rein
1e180 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
1e190 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  e, Token *pName1
1e1a0 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29  , Token *pName2)
1e1b0 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
1e1c0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1e1d0 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
1e1e0 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e  uence to be rein
1e1f0 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a  dexed, or NULL *
1e200 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
1e210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e220 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62  /* Name of a tab
1e230 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20  le or index */. 
1e240 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1e250 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1e260 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
1e270 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  base */.  Table 
1e280 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
1e290 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
1e2a0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1e2b0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
1e2c0 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
1e2d0 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
1e2e0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
1e2f0 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  ab */.  int iDb;
1e300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e310 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1e320 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
1e330 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1e340 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
1e350 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1e360 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
1e370 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d    Token *pObjNam
1e380 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1e390 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
1e3a0 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62  le or index to b
1e3b0 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a  e reindexed */..
1e3c0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
1e3d0 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
1e3e0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1e3f0 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
1e400 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61  r message.  ** a
1e410 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  nd code in pPars
1e420 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
1e430 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  L. */.  if( SQLI
1e440 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
1e450 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
1e460 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
1e470 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65    }..  if( pName
1e480 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e  1==0 ){.    rein
1e490 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61  dexDatabases(pPa
1e4a0 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rse, 0);.    ret
1e4b0 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  urn;.  }else if(
1e4c0 20 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30   NEVER(pName2==0
1e4d0 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d  ) || pName2->z==
1e4e0 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
1e4f0 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74  Coll;.    assert
1e500 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20  ( pName1->z );. 
1e510 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     zColl = sqlit
1e520 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1e530 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
1e540 65 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43  e1);.    if( !zC
1e550 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  oll ) return;.  
1e560 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1e570 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
1e580 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c   ENC(db), zColl,
1e590 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   0);.    if( pCo
1e5a0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e  ll ){.      rein
1e5b0 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61  dexDatabases(pPa
1e5c0 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  rse, zColl);.   
1e5d0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1e5e0 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  (db, zColl);.   
1e5f0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
1e600 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1e610 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  ee(db, zColl);. 
1e620 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
1e630 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
1e640 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
1e650 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29  ame2, &pObjName)
1e660 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20  ;.  if( iDb<0 ) 
1e670 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71  return;.  z = sq
1e680 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1e690 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29  en(db, pObjName)
1e6a0 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
1e6b0 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64  eturn;.  zDb = d
1e6c0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
1e6d0 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  e;.  pTab = sqli
1e6e0 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
1e6f0 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20   z, zDb);.  if( 
1e700 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e  pTab ){.    rein
1e710 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c  dexTable(pParse,
1e720 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73   pTab, 0);.    s
1e730 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1e740 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   z);.    return;
1e750 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20  .  }.  pIndex = 
1e760 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
1e770 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20  (db, z, zDb);.  
1e780 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1e790 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  , z);.  if( pInd
1e7a0 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ex ){.    sqlite
1e7b0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
1e7c0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
1e7d0 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
1e7e0 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
1e7f0 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29  rse, pIndex, -1)
1e800 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1e810 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  }.  sqlite3Error
1e820 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
1e830 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20  ble to identify 
1e840 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65  the object to be
1e850 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a   reindexed");.}.
1e860 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
1e870 74 75 72 6e 20 61 20 64 79 6e 61 6d 69 63 6c 79  turn a dynamicly
1e880 20 61 6c 6c 6f 63 61 74 65 64 20 4b 65 79 49 6e   allocated KeyIn
1e890 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
1e8a0 74 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a  t can be used.**
1e8b0 20 77 69 74 68 20 4f 50 5f 4f 70 65 6e 52 65 61   with OP_OpenRea
1e8c0 64 20 6f 72 20 4f 50 5f 4f 70 65 6e 57 72 69 74  d or OP_OpenWrit
1e8d0 65 20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61  e to access data
1e8e0 62 61 73 65 20 69 6e 64 65 78 20 70 49 64 78 2e  base index pIdx.
1e8f0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
1e900 73 66 75 6c 2c 20 61 20 70 6f 69 6e 74 65 72 20  sful, a pointer 
1e910 74 6f 20 74 68 65 20 6e 65 77 20 73 74 72 75 63  to the new struc
1e920 74 75 72 65 20 69 73 20 72 65 74 75 72 6e 65 64  ture is returned
1e930 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  . In this case.*
1e940 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  * the caller is 
1e950 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
1e960 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 44  calling sqlite3D
1e970 62 46 72 65 65 28 64 62 2c 20 29 20 6f 6e 20 74  bFree(db, ) on t
1e980 68 65 20 72 65 74 75 72 6e 65 64 20 0a 2a 2a 20  he returned .** 
1e990 70 6f 69 6e 74 65 72 2e 20 49 66 20 61 6e 20 65  pointer. If an e
1e9a0 72 72 6f 72 20 6f 63 63 75 72 73 20 28 6f 75 74  rror occurs (out
1e9b0 20 6f 66 20 6d 65 6d 6f 72 79 20 6f 72 20 6d 69   of memory or mi
1e9c0 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20  ssing collation 
1e9d0 0a 2a 2a 20 73 65 71 75 65 6e 63 65 29 2c 20 4e  .** sequence), N
1e9e0 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
1e9f0 61 6e 64 20 74 68 65 20 73 74 61 74 65 20 6f 66  and the state of
1ea00 20 70 50 61 72 73 65 20 75 70 64 61 74 65 64 20   pParse updated 
1ea10 74 6f 20 72 65 66 6c 65 63 74 0a 2a 2a 20 74 68  to reflect.** th
1ea20 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 4b 65 79 49  e error..*/.KeyI
1ea30 6e 66 6f 20 2a 73 71 6c 69 74 65 33 49 6e 64 65  nfo *sqlite3Inde
1ea40 78 4b 65 79 69 6e 66 6f 28 50 61 72 73 65 20 2a  xKeyinfo(Parse *
1ea50 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
1ea60 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Idx){.  int i;. 
1ea70 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78   int nCol = pIdx
1ea80 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74  ->nColumn;.  int
1ea90 20 6e 42 79 74 65 73 20 3d 20 73 69 7a 65 6f 66   nBytes = sizeof
1eaa0 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 43 6f  (KeyInfo) + (nCo
1eab0 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c  l-1)*sizeof(Coll
1eac0 53 65 71 2a 29 20 2b 20 6e 43 6f 6c 3b 0a 20 20  Seq*) + nCol;.  
1ead0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1eae0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49  arse->db;.  KeyI
1eaf0 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 28 4b 65 79  nfo *pKey = (Key
1eb00 49 6e 66 6f 20 2a 29 73 71 6c 69 74 65 33 44 62  Info *)sqlite3Db
1eb10 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
1eb20 42 79 74 65 73 29 3b 0a 0a 20 20 69 66 28 20 70  Bytes);..  if( p
1eb30 4b 65 79 20 29 7b 0a 20 20 20 20 70 4b 65 79 2d  Key ){.    pKey-
1eb40 3e 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  >db = pParse->db
1eb50 3b 0a 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72  ;.    pKey->aSor
1eb60 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a 29 26  tOrder = (u8 *)&
1eb70 28 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f  (pKey->aColl[nCo
1eb80 6c 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l]);.    assert(
1eb90 20 26 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64   &pKey->aSortOrd
1eba0 65 72 5b 6e 43 6f 6c 5d 3d 3d 26 28 28 28 75 38  er[nCol]==&(((u8
1ebb0 20 2a 29 70 4b 65 79 29 5b 6e 42 79 74 65 73 5d   *)pKey)[nBytes]
1ebc0 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ) );.    for(i=0
1ebd0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
1ebe0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
1ebf0 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  l = pIdx->azColl
1ec00 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  [i];.      asser
1ec10 74 28 20 7a 43 6f 6c 6c 20 29 3b 0a 20 20 20 20  t( zColl );.    
1ec20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d    pKey->aColl[i]
1ec30 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
1ec40 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1ec50 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 70 4b  zColl);.      pK
1ec60 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ey->aSortOrder[i
1ec70 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ] = pIdx->aSortO
1ec80 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  rder[i];.    }. 
1ec90 20 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c 64 20     pKey->nField 
1eca0 3d 20 28 75 31 36 29 6e 43 6f 6c 3b 0a 20 20 7d  = (u16)nCol;.  }
1ecb0 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
1ecc0 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  nErr ){.    sqli
1ecd0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4b  te3DbFree(db, pK
1ece0 65 79 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20  ey);.    pKey = 
1ecf0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1ed00 70 4b 65 79 3b 0a 7d 0a                          pKey;.}.