/ Hex Artifact Content
Login

Artifact d58d314c5837737e15f94959cb55115347725182:


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 4c  K.  sqlite3ExprL
4390: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  istDelete(db, pT
43a0: 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23  able->pCheck);.#
43b0: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
43c0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
43d0: 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33  LTABLE.  sqlite3
43e0: 56 74 61 62 43 6c 65 61 72 28 64 62 2c 20 70 54  VtabClear(db, pT
43f0: 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  able);.#endif.  
4400: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4410: 2c 20 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a  , pTable);.}../*
4420: 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67  .** Unlink the g
4430: 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20  iven table from 
4440: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73 20  the hash tables 
4450: 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65 20 74  and the delete t
4460: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75  he.** table stru
4470: 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69  cture with all i
4480: 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66  ts indices and f
4490: 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a  oreign keys..*/.
44a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69  void sqlite3Unli
44b0: 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65  nkAndDeleteTable
44c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
44d0: 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61  t iDb, const cha
44e0: 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20  r *zTabName){.  
44f0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a  Table *p;.  Db *
4500: 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pDb;..  assert( 
4510: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
4520: 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
4530: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
4540: 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 29  sert( zTabName )
4550: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
4560: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
4570: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
4580: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 7a 54  ;.  testcase( zT
4590: 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20  abName[0]==0 ); 
45a0: 20 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20   /* Zero-length 
45b0: 74 61 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20  table names are 
45c0: 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62  allowed */.  pDb
45d0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
45e0: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48  ;.  p = sqlite3H
45f0: 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e  ashInsert(&pDb->
4600: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
4610: 2c 20 7a 54 61 62 4e 61 6d 65 2c 0a 20 20 20 20  , zTabName,.    
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 6c 65      sqlite3Strle
4640: 6e 33 30 28 7a 54 61 62 4e 61 6d 65 29 2c 30 29  n30(zTabName),0)
4650: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74  ;.  sqlite3Delet
4660: 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20  eTable(db, p);. 
4670: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
4680: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
4690: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  es;.}../*.** Giv
46a0: 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75  en a token, retu
46b0: 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  rn a string that
46c0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65   consists of the
46d0: 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a   text of that.**
46e0: 20 74 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20 74   token.  Space t
46f0: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
4700: 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  ned string.** is
4710: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
4720: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
4730: 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
4740: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  by the calling.*
4750: 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  * function..**.*
4760: 2a 20 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20  * Any quotation 
4770: 6d 61 72 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d  marks (ex:  "nam
4780: 65 22 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d  e", 'name', [nam
4790: 65 5d 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20 74  e], or `name`) t
47a0: 68 61 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20  hat.** surround 
47b0: 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20  the body of the 
47c0: 74 6f 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76 65  token are remove
47d0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20  d..**.** Tokens 
47e0: 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70  are often just p
47f0: 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65  ointers into the
4800: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65   original SQL te
4810: 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65  xt and so.** are
4820: 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e   not \000 termin
4830: 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74  ated and are not
4840: 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68   persistent.  Th
4850: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
4860: 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72  g.** is \000 ter
4870: 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70  minated and is p
4880: 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68  ersistent..*/.ch
4890: 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46  ar *sqlite3NameF
48a0: 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33  romToken(sqlite3
48b0: 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61   *db, Token *pNa
48c0: 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  me){.  char *zNa
48d0: 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20  me;.  if( pName 
48e0: 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  ){.    zName = s
48f0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
4900: 64 62 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65  db, (char*)pName
4910: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a  ->z, pName->n);.
4920: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
4930: 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c  te(zName);.  }el
4940: 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  se{.    zName = 
4950: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
4960: 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zName;.}../*.** 
4970: 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  Open the sqlite_
4980: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f  master table sto
4990: 72 65 64 20 69 6e 20 64 61 74 61 62 61 73 65 20  red in database 
49a0: 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a  number iDb for.*
49b0: 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74  * writing. The t
49c0: 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75  able is opened u
49d0: 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a  sing cursor 0..*
49e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70  /.void sqlite3Op
49f0: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 50 61  enMasterTable(Pa
4a00: 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 29  rse *p, int iDb)
4a10: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
4a20: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 29 3b  lite3GetVdbe(p);
4a30: 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c  .  sqlite3TableL
4a40: 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53 54  ock(p, iDb, MAST
4a50: 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 53 43 48 45  ER_ROOT, 1, SCHE
4a60: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29 3b 0a  MA_TABLE(iDb));.
4a70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4a80: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Op3(v, OP_OpenWr
4a90: 69 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52  ite, 0, MASTER_R
4aa0: 4f 4f 54 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c  OOT, iDb);.  sql
4ab0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
4ac0: 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29  (v, -1, (char *)
4ad0: 35 2c 20 50 34 5f 49 4e 54 33 32 29 3b 20 20 2f  5, P4_INT32);  /
4ae0: 2a 20 35 20 63 6f 6c 75 6d 6e 20 74 61 62 6c 65  * 5 column table
4af0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 54 61   */.  if( p->nTa
4b00: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  b==0 ){.    p->n
4b10: 54 61 62 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  Tab = 1;.  }.}..
4b20: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
4b30: 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20 74 6f 20  zName points to 
4b40: 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
4b50: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
4b60: 6e 67 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  ng the name.** o
4b70: 66 20 61 20 64 61 74 61 62 61 73 65 20 28 22 6d  f a database ("m
4b80: 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 6f 72 20  ain", "temp" or 
4b90: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61  the name of an a
4ba0: 74 74 61 63 68 65 64 20 64 62 29 2e 20 54 68 69  ttached db). Thi
4bb0: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65  s.** function re
4bc0: 74 75 72 6e 73 20 74 68 65 20 69 6e 64 65 78 20  turns the index 
4bd0: 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74  of the named dat
4be0: 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62  abase in db->aDb
4bf0: 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31 20 69 66 20  [], or.** -1 if 
4c00: 74 68 65 20 6e 61 6d 65 64 20 64 62 20 63 61 6e  the named db can
4c10: 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
4c20: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64  .int sqlite3Find
4c30: 44 62 4e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a  DbName(sqlite3 *
4c40: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
4c50: 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20  zName){.  int i 
4c60: 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  = -1;         /*
4c70: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
4c80: 20 2a 2f 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20   */.  if( zName 
4c90: 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 3b 0a  ){.    Db *pDb;.
4ca0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69      int n = sqli
4cb0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
4cc0: 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64  e);.    for(i=(d
4cd0: 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26  b->nDb-1), pDb=&
4ce0: 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30  db->aDb[i]; i>=0
4cf0: 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20  ; i--, pDb--){. 
4d00: 20 20 20 20 20 69 66 28 20 28 21 4f 4d 49 54 5f       if( (!OMIT_
4d10: 54 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31 20 29  TEMPDB || i!=1 )
4d20: 20 26 26 20 6e 3d 3d 73 71 6c 69 74 65 33 53 74   && n==sqlite3St
4d30: 72 6c 65 6e 33 30 28 70 44 62 2d 3e 7a 4e 61 6d  rlen30(pDb->zNam
4d40: 65 29 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  e) && .         
4d50: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
4d60: 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  mp(pDb->zName, z
4d70: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
4d80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4d90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4da0: 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn i;.}../*.** T
4db0: 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  he token *pName 
4dc0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d  contains the nam
4dd0: 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  e of a database 
4de0: 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f  (either "main" o
4df0: 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74  r.** "temp" or t
4e00: 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74  he name of an at
4e10: 74 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73  tached db). This
4e20: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
4e30: 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66   the.** index of
4e40: 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62   the named datab
4e50: 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d  ase in db->aDb[]
4e60: 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e  , or -1 if the n
4e70: 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73  amed db .** does
4e80: 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69   not exist..*/.i
4e90: 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62  nt sqlite3FindDb
4ea0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f  (sqlite3 *db, To
4eb0: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69  ken *pName){.  i
4ec0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
4ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ee0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
4ef0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72  number */.  char
4f00: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
4f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f20: 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72 65 20   /* Name we are 
4f30: 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f  searching for */
4f40: 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
4f50: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
4f60: 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20  db, pName);.  i 
4f70: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  = sqlite3FindDbN
4f80: 61 6d 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ame(db, zName);.
4f90: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4fa0: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  db, zName);.  re
4fb0: 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68  turn i;.}../* Th
4fc0: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
4fd0: 6f 72 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20  or trigger name 
4fe0: 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  is passed to thi
4ff0: 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f  s routine via to
5000: 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61  kens.** pName1 a
5010: 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68  nd pName2. If th
5020: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73  e table name was
5030: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
5040: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a  , for example:.*
5050: 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c  *.** CREATE TABL
5060: 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b  E xxx.yyy (...);
5070: 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61  .** .** Then pNa
5080: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78  me1 is set to "x
5090: 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22  xx" and pName2 "
50a0: 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68  yyy". On the oth
50b0: 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68  er hand if.** th
50c0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20  e table name is 
50d0: 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  not fully qualif
50e0: 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a  ied, i.e.:.**.**
50f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79 79   CREATE TABLE yy
5100: 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  y(...);.**.** Th
5110: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
5120: 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e   to "yyy" and pN
5130: 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a  ame2 is ""..**.*
5140: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
5150: 65 74 73 20 74 68 65 20 2a 70 70 55 6e 71 75 61  ets the *ppUnqua
5160: 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69  l pointer to poi
5170: 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20  nt at the token 
5180: 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e  (pName1 or.** pN
5190: 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65  ame2) that store
51a0: 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  s the unqualifie
51b0: 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54  d table name.  T
51c0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
51d0: 2a 2a 20 64 61 74 61 62 61 73 65 20 22 78 78 78  ** database "xxx
51e0: 22 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  " is returned..*
51f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f  /.int sqlite3Two
5200: 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73  PartName(.  Pars
5210: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
5220: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
5230: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
5240: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
5250: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20  n *pName1,      
5260: 2f 2a 20 54 68 65 20 22 78 78 78 22 20 69 6e 20  /* The "xxx" in 
5270: 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79  the name "xxx.yy
5280: 79 22 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20  y" or "xxx" */. 
5290: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
52a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79       /* The "yyy
52b0: 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78  " in the name "x
52c0: 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b  xx.yyy" */.  Tok
52d0: 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20  en **pUnqual    
52e0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e   /* Write the un
52f0: 71 75 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74  qualified object
5300: 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b   name here */.){
5310: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
5320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5330: 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
5340: 6e 67 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f  ng the object */
5350: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
5360: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
5370: 69 66 28 20 41 4c 57 41 59 53 28 70 4e 61 6d 65  if( ALWAYS(pName
5380: 32 21 3d 30 29 20 26 26 20 70 4e 61 6d 65 32 2d  2!=0) && pName2-
5390: 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  >n>0 ){.    if( 
53a0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 20  db->init.busy ) 
53b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
53c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
53d0: 22 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73  "corrupt databas
53e0: 65 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  e");.      pPars
53f0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
5400: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5410: 7d 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d  }.    *pUnqual =
5420: 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44 62   pName2;.    iDb
5430: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
5440: 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  (db, pName1);.  
5450: 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20    if( iDb<0 ){. 
5460: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
5470: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
5480: 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25  known database %
5490: 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  T", pName1);.   
54a0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
54b0: 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  +;.      return 
54c0: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  -1;.    }.  }els
54d0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
54e0: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c  b->init.iDb==0 |
54f0: 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  | db->init.busy 
5500: 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d  );.    iDb = db-
5510: 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a  >init.iDb;.    *
5520: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31  pUnqual = pName1
5530: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
5540: 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  Db;.}../*.** Thi
5550: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
5560: 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  d to check if th
5570: 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 7a  e UTF-8 string z
5580: 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c 0a  Name is a legal.
5590: 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e  ** unqualified n
55a0: 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73 63  ame for a new sc
55b0: 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61 62  hema object (tab
55c0: 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77 20  le, index, view 
55d0: 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e 20  or.** trigger). 
55e0: 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c 65  All names are le
55f0: 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73 65  gal except those
5600: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
5610: 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22   the string.** "
5620: 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70 70  sqlite_" (in upp
5630: 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78  er, lower or mix
5640: 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20 70  ed case). This p
5650: 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61  ortion of the na
5660: 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72 65  mespace.** is re
5670: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
5680: 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20  nal use..*/.int 
5690: 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
56a0: 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70 50  ctName(Parse *pP
56b0: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
56c0: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20   *zName){.  if( 
56d0: 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69  !pParse->db->ini
56e0: 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65  t.busy && pParse
56f0: 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20 20  ->nested==0 .   
5700: 20 20 20 20 20 20 20 26 26 20 28 70 50 61 72 73         && (pPars
5710: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
5720: 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d  QLITE_WriteSchem
5730: 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  a)==0.          
5740: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
5750: 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  NICmp(zName, "sq
5760: 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20  lite_", 7) ){.  
5770: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
5780: 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65 63  g(pParse, "objec
5790: 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64 20  t name reserved 
57a0: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65  for internal use
57b0: 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  : %s", zName);. 
57c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
57d0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
57e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
57f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63  }../*.** Begin c
5800: 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65  onstructing a ne
5810: 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e  w table represen
5820: 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79  tation in memory
5830: 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68  .  This is.** th
5840: 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65 72  e first of sever
5850: 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  al action routin
5860: 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c  es that get call
5870: 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a  ed in response.*
5880: 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54 41  * to a CREATE TA
5890: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
58a0: 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74  In particular, t
58b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
58c0: 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73  alled.** after s
58d0: 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52  eeing tokens "CR
58e0: 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45  EATE" and "TABLE
58f0: 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  " and the table 
5900: 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65 6d 70  name. The isTemp
5910: 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65  .** flag is true
5920: 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73 68   if the table sh
5930: 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69  ould be stored i
5940: 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  n the auxiliary 
5950: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
5960: 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20 74   instead of in t
5970: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
5980: 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20   file.  This is 
5990: 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61 73  normally the cas
59a0: 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22 54  e.** when the "T
59b0: 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52 41  EMP" or "TEMPORA
59c0: 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63 75  RY" keyword occu
59d0: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a  rs in between.**
59e0: 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42 4c   CREATE and TABL
59f0: 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  E..**.** The new
5a00: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 73   table record is
5a10: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64   initialized and
5a20: 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d 3e   put in pParse->
5a30: 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73  pNewTable..** As
5a40: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45   more of the CRE
5a50: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
5a60: 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20 61  ent is parsed, a
5a70: 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e  dditional action
5a80: 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  .** routines wil
5a90: 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61  l be called to a
5aa0: 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74  dd more informat
5ab0: 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63 6f  ion to this reco
5ac0: 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  rd..** At the en
5ad0: 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  d of the CREATE 
5ae0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c  TABLE statement,
5af0: 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64 54   the sqlite3EndT
5b00: 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a  able() routine.*
5b10: 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  * is called to c
5b20: 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e 73  omplete the cons
5b30: 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  truction of the 
5b40: 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64  new table record
5b50: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5b60: 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20 50  3StartTable(.  P
5b70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5b80: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
5b90: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
5ba0: 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74  ame1,   /* First
5bb0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d   part of the nam
5bc0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
5bd0: 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65  r view */.  Toke
5be0: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20  n *pName2,   /* 
5bf0: 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 74  Second part of t
5c00: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
5c10: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a  able or view */.
5c20: 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20    int isTemp,   
5c30: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
5c40: 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61 62  is is a TEMP tab
5c50: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  le */.  int isVi
5c60: 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ew,      /* True
5c70: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49   if this is a VI
5c80: 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  EW */.  int isVi
5c90: 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75 65  rtual,   /* True
5ca0: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49   if this is a VI
5cb0: 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a 20  RTUAL table */. 
5cc0: 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20   int noErr      
5cd0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
5ce0: 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  if table already
5cf0: 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20   exists */.){.  
5d00: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
5d10: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
5d20: 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66  ; /* The name of
5d30: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a   the new table *
5d40: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
5d50: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
5d60: 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
5d70: 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  Db;         /* D
5d80: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 74  atabase number t
5d90: 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62  o create the tab
5da0: 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  le in */.  Token
5db0: 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55   *pName;    /* U
5dc0: 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
5dd0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
5de0: 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20  create */..  /* 
5df0: 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  The table or vie
5e00: 77 20 6e 61 6d 65 20 74 6f 20 63 72 65 61 74 65  w name to create
5e10: 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68   is passed to th
5e20: 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74  is routine via t
5e30: 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65  okens.  ** pName
5e40: 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66  1 and pName2. If
5e50: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
5e60: 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  was fully qualif
5e70: 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ied, for example
5e80: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41  :.  **.  ** CREA
5e90: 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79  TE TABLE xxx.yyy
5ea0: 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20   (...);.  ** .  
5eb0: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
5ec0: 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61  s set to "xxx" a
5ed0: 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e  nd pName2 "yyy".
5ee0: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
5ef0: 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 74  nd if.  ** the t
5f00: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
5f10: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
5f20: 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a  , i.e.:.  **.  *
5f30: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79  * CREATE TABLE y
5f40: 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20  yy(...);.  **.  
5f50: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
5f60: 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61  s set to "yyy" a
5f70: 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e  nd pName2 is "".
5f80: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
5f90: 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73 20 74  all below sets t
5fa0: 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72  he pName pointer
5fb0: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
5fc0: 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f   token (pName1 o
5fd0: 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74  r.  ** pName2) t
5fe0: 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75  hat stores the u
5ff0: 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65  nqualified table
6000: 20 6e 61 6d 65 2e 20 54 68 65 20 76 61 72 69 61   name. The varia
6010: 62 6c 65 20 69 44 62 20 69 73 0a 20 20 2a 2a 20  ble iDb is.  ** 
6020: 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
6030: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
6040: 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
6050: 6f 72 20 76 69 65 77 20 69 73 20 74 6f 20 62 65  or view is to be
6060: 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e  .  ** created in
6070: 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73  ..  */.  iDb = s
6080: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
6090: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
60a0: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
60b0: 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29  );.  if( iDb<0 )
60c0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21   return;.  if( !
60d0: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
60e0: 73 54 65 6d 70 20 26 26 20 70 4e 61 6d 65 32 2d  sTemp && pName2-
60f0: 3e 6e 3e 30 20 26 26 20 69 44 62 21 3d 31 20 29  >n>0 && iDb!=1 )
6100: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61  {.    /* If crea
6110: 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c  ting a temp tabl
6120: 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20  e, the name may 
6130: 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65 64  not be qualified
6140: 2e 20 55 6e 6c 65 73 73 20 0a 20 20 20 20 2a 2a  . Unless .    **
6150: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
6160: 6d 65 20 69 73 20 22 74 65 6d 70 22 20 61 6e 79  me is "temp" any
6170: 77 61 79 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c  way.  */.    sql
6180: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
6190: 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20  rse, "temporary 
61a0: 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20  table name must 
61b0: 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64 22 29  be unqualified")
61c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
61d0: 7d 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45  }.  if( !OMIT_TE
61e0: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29  MPDB && isTemp )
61f0: 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61   iDb = 1;..  pPa
6200: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20  rse->sNameToken 
6210: 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d  = *pName;.  zNam
6220: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
6230: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
6240: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
6250: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
6260: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
6270: 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
6280: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e  tName(pParse, zN
6290: 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ame) ){.    goto
62a0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
62b0: 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  or;.  }.  if( db
62c0: 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20  ->init.iDb==1 ) 
62d0: 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e  isTemp = 1;.#ifn
62e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
62f0: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
6300: 61 73 73 65 72 74 28 20 28 69 73 54 65 6d 70 20  assert( (isTemp 
6310: 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a  & 1)==isTemp );.
6320: 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
6330: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20  ;.    char *zDb 
6340: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
6350: 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71  Name;.    if( sq
6360: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
6370: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
6380: 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
6390: 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a  LE(isTemp), 0, z
63a0: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
63b0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
63c0: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ror;.    }.    i
63d0: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
63e0: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
63f0: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b  PDB && isTemp ){
6400: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
6410: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
6420: 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  MP_VIEW;.      }
6430: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
6440: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
6450: 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  TE_VIEW;.      }
6460: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6470: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
6480: 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a  DB && isTemp ){.
6490: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
64a0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
64b0: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
64c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
64d0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
64e0: 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  TE_TABLE;.      
64f0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
6500: 21 69 73 56 69 72 74 75 61 6c 20 26 26 20 73 71  !isVirtual && sq
6510: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
6520: 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61  Parse, code, zNa
6530: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
6540: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
6550: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
6560: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
6570: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
6580: 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65  e new table name
6590: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64   does not collid
65a0: 65 20 77 69 74 68 20 61 6e 20 65 78 69 73 74 69  e with an existi
65b0: 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72  ng.  ** index or
65c0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74   table name in t
65d0: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
65e0: 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f  .  Issue an erro
65f0: 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a  r message if.  *
6600: 2a 20 69 74 20 64 6f 65 73 2e 20 54 68 65 20 65  * it does. The e
6610: 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74  xception is if t
6620: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  he statement bei
6630: 6e 67 20 70 61 72 73 65 64 20 77 61 73 20 70 61  ng parsed was pa
6640: 73 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20  ssed.  ** to an 
6650: 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f  sqlite3_declare_
6660: 76 74 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20  vtab() call. In 
6670: 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 74  that case only t
6680: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a  he column names.
6690: 20 20 2a 2a 20 61 6e 64 20 74 79 70 65 73 20 77    ** and types w
66a0: 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 73 6f 20  ill be used, so 
66b0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
66c0: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6e 61 6d   to test for nam
66d0: 65 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c  espace.  ** coll
66e0: 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  isions..  */.  i
66f0: 66 28 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56  f( !IN_DECLARE_V
6700: 54 41 42 20 29 7b 0a 20 20 20 20 63 68 61 72 20  TAB ){.    char 
6710: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
6720: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  Db].zName;.    i
6730: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
6740: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
6750: 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20  pParse) ){.     
6760: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
6770: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
6780: 20 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69     pTable = sqli
6790: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
67a0: 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20   zName, zDb);.  
67b0: 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a    if( pTable ){.
67c0: 20 20 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72        if( !noErr
67d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
67e0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
67f0: 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c  se, "table %T al
6800: 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 70  ready exists", p
6810: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Name);.      }el
6820: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
6830: 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
6840: 73 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  sy );.        sq
6850: 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
6860: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
6870: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
6880: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
6890: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
68a0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
68b0: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
68c0: 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20  me, zDb)!=0 ){. 
68d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
68e0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68  rMsg(pParse, "th
68f0: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
6900: 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73  n index named %s
6910: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
6920: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
6930: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
6940: 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20 73   }..  pTable = s
6950: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
6960: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
6970: 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 70 54 61  ble));.  if( pTa
6980: 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62  ble==0 ){.    db
6990: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
69a0: 20 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   1;.    pParse->
69b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
69c0: 4d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  M;.    pParse->n
69d0: 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  Err++;.    goto 
69e0: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
69f0: 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d  r;.  }.  pTable-
6a00: 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  >zName = zName;.
6a10: 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20    pTable->iPKey 
6a20: 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  = -1;.  pTable->
6a30: 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
6a40: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a  b[iDb].pSchema;.
6a50: 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 20 3d    pTable->nRef =
6a60: 20 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52   1;.  pTable->nR
6a70: 6f 77 45 73 74 20 3d 20 31 30 30 30 30 30 30 3b  owEst = 1000000;
6a80: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
6a90: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20  e->pNewTable==0 
6aa0: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  );.  pParse->pNe
6ab0: 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b  wTable = pTable;
6ac0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
6ad0: 73 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69  s the magic sqli
6ae0: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
6af0: 65 20 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e  e used by autoin
6b00: 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68  crement,.  ** th
6b10: 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e  en record a poin
6b20: 74 65 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ter to this tabl
6b30: 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  e in the main da
6b40: 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
6b50: 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e  .  ** so that IN
6b60: 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68  SERT can find th
6b70: 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a  e table easily..
6b80: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
6b90: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
6ba0: 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50  REMENT.  if( !pP
6bb0: 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20  arse->nested && 
6bc0: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  strcmp(zName, "s
6bd0: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29  qlite_sequence")
6be0: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
6bf0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
6c00: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
6c10: 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 54 61  b, 0) );.    pTa
6c20: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53  ble->pSchema->pS
6c30: 65 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a  eqTab = pTable;.
6c40: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
6c50: 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e   Begin generatin
6c60: 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  g the code that 
6c70: 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20  will insert the 
6c80: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74  table record int
6c90: 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54  o.  ** the SQLIT
6ca0: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20  E_MASTER table. 
6cb0: 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75   Note in particu
6cc0: 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74  lar that we must
6cd0: 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61   go ahead.  ** a
6ce0: 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  nd allocate the 
6cf0: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f  record number fo
6d00: 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72  r the table entr
6d10: 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61  y now.  Before a
6d20: 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20  ny.  ** PRIMARY 
6d30: 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65  KEY or UNIQUE ke
6d40: 79 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65  ywords are parse
6d50: 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72  d.  Those keywor
6d60: 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20  ds will cause.  
6d70: 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65  ** indices to be
6d80: 20 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65   created and the
6d90: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75   table record mu
6da0: 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74  st come before t
6db0: 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  he .  ** indices
6dc0: 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65  .  Hence, the re
6dd0: 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20  cord number for 
6de0: 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62  the table must b
6df0: 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a  e allocated.  **
6e00: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
6e10: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
6e20: 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47  && (v = sqlite3G
6e30: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21  etVdbe(pParse))!
6e40: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31  =0 ){.    int j1
6e50: 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46 6f  ;.    int fileFo
6e60: 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20 72 65  rmat;.    int re
6e70: 67 31 2c 20 72 65 67 32 2c 20 72 65 67 33 3b 0a  g1, reg2, reg3;.
6e80: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
6e90: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
6ea0: 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
6eb0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6ec0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
6ed0: 45 0a 20 20 20 20 69 66 28 20 69 73 56 69 72 74  E.    if( isVirt
6ee0: 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ual ){.      sql
6ef0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
6f00: 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20  , OP_VBegin);.  
6f10: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
6f20: 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 66  /* If the file f
6f30: 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69  ormat and encodi
6f40: 6e 67 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ng in the databa
6f50: 73 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e  se have not been
6f60: 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65   set, .    ** se
6f70: 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20  t them now..    
6f80: 2a 2f 0a 20 20 20 20 72 65 67 31 20 3d 20 70 50  */.    reg1 = pP
6f90: 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d  arse->regRowid =
6fa0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
6fb0: 0a 20 20 20 20 72 65 67 32 20 3d 20 70 50 61 72  .    reg2 = pPar
6fc0: 73 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b  se->regRoot = ++
6fd0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
6fe0: 20 20 72 65 67 33 20 3d 20 2b 2b 70 50 61 72 73    reg3 = ++pPars
6ff0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
7000: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7010: 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c  , OP_ReadCookie,
7020: 20 69 44 62 2c 20 72 65 67 33 2c 20 42 54 52 45   iDb, reg3, BTRE
7030: 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a  E_FILE_FORMAT);.
7040: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
7050: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
7060: 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74  ;.    j1 = sqlit
7070: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
7080: 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 0a 20 20  OP_If, reg3);.  
7090: 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28    fileFormat = (
70a0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
70b0: 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74  TE_LegacyFileFmt
70c0: 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20  )!=0 ?.         
70d0: 20 20 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c           1 : SQL
70e0: 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52  ITE_MAX_FILE_FOR
70f0: 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  MAT;.    sqlite3
7100: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7110: 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c 65 46 6f  _Integer, fileFo
7120: 72 6d 61 74 2c 20 72 65 67 33 29 3b 0a 20 20 20  rmat, reg3);.   
7130: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7140: 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  p3(v, OP_SetCook
7150: 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 46  ie, iDb, BTREE_F
7160: 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 72 65 67 33  ILE_FORMAT, reg3
7170: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7180: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
7190: 6e 74 65 67 65 72 2c 20 45 4e 43 28 64 62 29 2c  nteger, ENC(db),
71a0: 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69   reg3);.    sqli
71b0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
71c0: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
71d0: 44 62 2c 20 42 54 52 45 45 5f 54 45 58 54 5f 45  Db, BTREE_TEXT_E
71e0: 4e 43 4f 44 49 4e 47 2c 20 72 65 67 33 29 3b 0a  NCODING, reg3);.
71f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
7200: 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
7210: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73  .    /* This jus
7220: 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61 63  t creates a plac
7230: 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20  e-holder record 
7240: 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  in the sqlite_ma
7250: 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20  ster table..    
7260: 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63 72  ** The record cr
7270: 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63  eated does not c
7280: 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20  ontain anything 
7290: 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  yet.  It will be
72a0: 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a   replaced.    **
72b0: 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74   by the real ent
72c0: 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72  ry in code gener
72d0: 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33 45  ated at sqlite3E
72e0: 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a  ndTable()..    *
72f0: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77  *.    ** The row
7300: 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65  id for the new e
7310: 6e 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e 20  ntry is left in 
7320: 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d  register pParse-
7330: 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a  >regRowid..    *
7340: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
7350: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
7360: 77 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74 20  w table is left 
7370: 69 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e 72  in reg pParse->r
7380: 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54  egRoot..    ** T
7390: 68 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f  he rowid and roo
73a0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76 61  t page number va
73b0: 6c 75 65 73 20 61 72 65 20 6e 65 65 64 65 64 20  lues are needed 
73c0: 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  by the code that
73d0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45  .    ** sqlite3E
73e0: 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e  ndTable will gen
73f0: 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69  erate..    */.#i
7400: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
7410: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
7420: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
7430: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
7440: 45 29 0a 20 20 20 20 69 66 28 20 69 73 56 69 65  E).    if( isVie
7450: 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29  w || isVirtual )
7460: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7470: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7480: 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 32  Integer, 0, reg2
7490: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
74a0: 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dif.    {.      
74b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
74c0: 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61  2(v, OP_CreateTa
74d0: 62 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29 3b  ble, iDb, reg2);
74e0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
74f0: 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
7500: 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
7510: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7520: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
7530: 6f 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a  owid, 0, reg1);.
7540: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7550: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
7560: 2c 20 30 2c 20 72 65 67 33 29 3b 0a 20 20 20 20  , 0, reg3);.    
7570: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7580: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
7590: 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b 0a  0, reg3, reg1);.
75a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
75b0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
75c0: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73  G_APPEND);.    s
75d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
75e0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20  (v, OP_Close);. 
75f0: 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20   }..  /* Normal 
7600: 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75  (non-error) retu
7610: 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b  rn. */.  return;
7620: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
7630: 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75  or occurs, we ju
7640: 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e  mp here */.begin
7650: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20  _table_error:.  
7660: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
7670: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  , zName);.  retu
7680: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rn;.}../*.** Thi
7690: 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20  s macro is used 
76a0: 74 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20 73  to compare two s
76b0: 74 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73 65  trings in a case
76c0: 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61 6e  -insensitive man
76d0: 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c  ner..** It is sl
76e0: 69 67 68 74 6c 79 20 66 61 73 74 65 72 20 74 68  ightly faster th
76f0: 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  an calling sqlit
7700: 65 33 53 74 72 49 43 6d 70 28 29 20 64 69 72 65  e3StrICmp() dire
7710: 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f  ctly, but.** pro
7720: 64 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f 64  duces larger cod
7730: 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47  e..**.** WARNING
7740: 3a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20  : This macro is 
7750: 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77  not compatible w
7760: 69 74 68 20 74 68 65 20 73 74 72 63 6d 70 28 29  ith the strcmp()
7770: 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72   family. It.** r
7780: 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 74  eturns true if t
7790: 68 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 61  he two strings a
77a0: 72 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72 77  re equal, otherw
77b0: 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64  ise false..*/.#d
77c0: 65 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78 2c  efine STRICMP(x,
77d0: 20 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55 70   y) (\.sqlite3Up
77e0: 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73  perToLower[*(uns
77f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78 29  igned char *)(x)
7800: 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33 55  ]==   \.sqlite3U
7810: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e  pperToLower[*(un
7820: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 79  signed char *)(y
7830: 29 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c 69  )]     \.&& sqli
7840: 74 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b 31  te3StrICmp((x)+1
7850: 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a  ,(y)+1)==0 )../*
7860: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f  .** Add a new co
7870: 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c  lumn to the tabl
7880: 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  e currently bein
7890: 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a  g constructed..*
78a0: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20  *.** The parser 
78b0: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
78c0: 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ne once for each
78d0: 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74   column declarat
78e0: 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41  ion.** in a CREA
78f0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
7900: 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72  nt.  sqlite3Star
7910: 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61  tTable() gets ca
7920: 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f  lled.** first to
7930: 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e   get things goin
7940: 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f  g.  Then this ro
7950: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
7960: 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75  for each.** colu
7970: 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  mn..*/.void sqli
7980: 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72  te3AddColumn(Par
7990: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
79a0: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62  n *pName){.  Tab
79b0: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
79c0: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c    char *z;.  Col
79d0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c  umn *pCol;.  sql
79e0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
79f0: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 20  e->db;.  if( (p 
7a00: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
7a10: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
7a20: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
7a30: 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d  _COLUMN.  if( p-
7a40: 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d  >nCol+1>db->aLim
7a50: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
7a60: 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73  COLUMN] ){.    s
7a70: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7a80: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
7a90: 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c   columns on %s",
7aa0: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20   p->zName);.    
7ab0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
7ac0: 69 66 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  if.  z = sqlite3
7ad0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
7ae0: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
7af0: 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  z==0 ) return;. 
7b00: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
7b10: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
7b20: 66 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d  f( STRICMP(z, p-
7b30: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20  >aCol[i].zName) 
7b40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7b50: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
7b60: 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75   "duplicate colu
7b70: 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29  mn name: %s", z)
7b80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
7b90: 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
7ba0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
7bb0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  }.  }.  if( (p->
7bc0: 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29  nCol & 0x7)==0 )
7bd0: 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e  {.    Column *aN
7be0: 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73  ew;.    aNew = s
7bf0: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
7c00: 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e  db,p->aCol,(p->n
7c10: 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d  Col+8)*sizeof(p-
7c20: 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20  >aCol[0]));.    
7c30: 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
7c40: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
7c50: 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20  ee(db, z);.     
7c60: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
7c70: 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65     p->aCol = aNe
7c80: 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20  w;.  }.  pCol = 
7c90: 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c  &p->aCol[p->nCol
7ca0: 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c  ];.  memset(pCol
7cb0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61  , 0, sizeof(p->a
7cc0: 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c  Col[0]));.  pCol
7cd0: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20  ->zName = z;. . 
7ce0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
7cf0: 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65  no type specifie
7d00: 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20  d, columns have 
7d10: 74 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69  the default affi
7d20: 6e 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27  nity.  ** 'NONE'
7d30: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
7d40: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
7d50: 74 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43  then sqlite3AddC
7d60: 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c  olumnType() will
7d70: 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  .  ** be called 
7d80: 6e 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c  next to set pCol
7d90: 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65  ->affinity corre
7da0: 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f  ctly..  */.  pCo
7db0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  l->affinity = SQ
7dc0: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
7dd0: 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f   p->nCol++;.}../
7de0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7df0: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
7e00: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
7e10: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
7e20: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
7e30: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
7e40: 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55  ment.  A "NOT NU
7e50: 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68  LL" constraint h
7e60: 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20  as.** been seen 
7e70: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68  on a column.  Th
7e80: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
7e90: 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67  the notNull flag
7ea0: 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   on.** the colum
7eb0: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
7ec0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
7ed0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
7ee0: 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20  ddNotNull(Parse 
7ef0: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45  *pParse, int onE
7f00: 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a  rror){.  Table *
7f10: 70 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  p;.  p = pParse-
7f20: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
7f30: 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28  ( p==0 || NEVER(
7f40: 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74  p->nCol<1) ) ret
7f50: 75 72 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 70  urn;.  p->aCol[p
7f60: 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c  ->nCol-1].notNul
7f70: 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b  l = (u8)onError;
7f80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  .}../*.** Scan t
7f90: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e  he column type n
7fa0: 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74  ame zType (lengt
7fb0: 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74  h nType) and ret
7fc0: 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63  urn the.** assoc
7fd0: 69 61 74 65 64 20 61 66 66 69 6e 69 74 79 20 74  iated affinity t
7fe0: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ype..**.** This 
7ff0: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63  routine does a c
8000: 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20  ase-independent 
8010: 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65 20  search of zType 
8020: 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62 73  for the .** subs
8030: 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66 6f  trings in the fo
8040: 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20 49  llowing table. I
8050: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62  f one of the sub
8060: 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f  strings is.** fo
8070: 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70  und, the corresp
8080: 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79 20  onding affinity 
8090: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
80a0: 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a  zType contains.*
80b0: 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  * more than one 
80c0: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
80d0: 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61 72  s, entries towar
80e0: 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a  d the top of .**
80f0: 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65 20   the table take 
8100: 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65 78  priority. For ex
8110: 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65 20  ample, if zType 
8120: 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a  is 'BLOBINT', .*
8130: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  * SQLITE_AFF_INT
8140: 45 47 45 52 20 69 73 20 72 65 74 75 72 6e 65 64  EGER is returned
8150: 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e  ..**.** Substrin
8160: 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74 79  g     | Affinity
8170: 0a 2a 2a 20 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: 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20  ----.** 'INT'   
81a0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
81b0: 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43  FF_INTEGER.** 'C
81c0: 48 41 52 27 20 20 20 20 20 20 20 20 7c 20 53 51  HAR'        | SQ
81d0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
81e0: 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20 7c   'CLOB'        |
81f0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
8200: 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20 20  .** 'TEXT'      
8210: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54    | SQLITE_AFF_T
8220: 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20  EXT.** 'BLOB'   
8230: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
8240: 46 5f 4e 4f 4e 45 0a 2a 2a 20 27 52 45 41 4c 27  F_NONE.** 'REAL'
8250: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
8260: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c  _AFF_REAL.** 'FL
8270: 4f 41 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OA'        | SQL
8280: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20  ITE_AFF_REAL.** 
8290: 27 44 4f 55 42 27 20 20 20 20 20 20 20 20 7c 20  'DOUB'        | 
82a0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
82b0: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66  **.** If none of
82c0: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20   the substrings 
82d0: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61 62  in the above tab
82e0: 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a  le are found,.**
82f0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
8300: 52 49 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e  RIC is returned.
8310: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
8320: 41 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e  AffinityType(con
8330: 73 74 20 63 68 61 72 20 2a 7a 49 6e 29 7b 0a 20  st char *zIn){. 
8340: 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68   u32 h = 0;.  ch
8350: 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f  ar aff = SQLITE_
8360: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 0a 20 20  AFF_NUMERIC;..  
8370: 69 66 28 20 7a 49 6e 20 29 20 77 68 69 6c 65 28  if( zIn ) while(
8380: 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68   zIn[0] ){.    h
8390: 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69   = (h<<8) + sqli
83a0: 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  te3UpperToLower[
83b0: 28 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20  (*zIn)&0xff];.  
83c0: 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28    zIn++;.    if(
83d0: 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28   h==(('c'<<24)+(
83e0: 27 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38  'h'<<16)+('a'<<8
83f0: 29 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20 20  )+'r') ){       
8400: 20 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f        /* CHAR */
8410: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
8420: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 20 0a 20  ITE_AFF_TEXT; . 
8430: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
8440: 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('c'<<24)+('l'<
8450: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62  <16)+('o'<<8)+'b
8460: 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43  ') ){       /* C
8470: 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  LOB */.      aff
8480: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
8490: 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  XT;.    }else if
84a0: 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b  ( h==(('t'<<24)+
84b0: 28 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c  ('e'<<16)+('x'<<
84c0: 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20  8)+'t') ){      
84d0: 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20   /* TEXT */.    
84e0: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
84f0: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c  FF_TEXT;.    }el
8500: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c  se if( h==(('b'<
8510: 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28  <24)+('l'<<16)+(
8520: 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20  'o'<<8)+'b')    
8530: 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f        /* BLOB */
8540: 0a 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66  .        && (aff
8550: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
8560: 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  ERIC || aff==SQL
8570: 49 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b  ITE_AFF_REAL) ){
8580: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
8590: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 23 69  ITE_AFF_NONE;.#i
85a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
85b0: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
85c0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
85d0: 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65  ==(('r'<<24)+('e
85e0: 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b  '<<16)+('a'<<8)+
85f0: 27 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'l')          /*
8600: 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20   REAL */.       
8610: 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   && aff==SQLITE_
8620: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
8630: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
8640: 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20  E_AFF_REAL;.    
8650: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
8660: 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  f'<<24)+('l'<<16
8670: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20  )+('o'<<8)+'a') 
8680: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41           /* FLOA
8690: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
86a0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
86b0: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
86c0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
86d0: 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _REAL;.    }else
86e0: 20 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32   if( h==(('d'<<2
86f0: 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75  4)+('o'<<16)+('u
8700: 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20  '<<8)+'b')      
8710: 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20      /* DOUB */. 
8720: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
8730: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
8740: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
8750: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
8760: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
8770: 73 65 20 69 66 28 20 28 68 26 30 78 30 30 46 46  se if( (h&0x00FF
8780: 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36  FFFF)==(('i'<<16
8790: 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20  )+('n'<<8)+'t') 
87a0: 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a  ){    /* INT */.
87b0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
87c0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
87d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
87e0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
87f0: 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   aff;.}../*.** T
8800: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
8810: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
8820: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
8830: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
8840: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
8850: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
8860: 20 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65   The pFirst toke
8870: 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a  n is the first.*
8880: 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73  * token in the s
8890: 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e  equence of token
88a0: 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20  s that describe 
88b0: 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a  the type of the.
88c0: 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e  ** column curren
88d0: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
88e0: 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20  uction.   pLast 
88f0: 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65  is the last toke
8900: 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75  n.** in the sequ
8910: 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73 20  ence.  Use this 
8920: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63  information to c
8930: 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72 69 6e  onstruct a strin
8940: 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69  g.** that contai
8950: 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20  ns the typename 
8960: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e  of the column an
8970: 64 20 73 74 6f 72 65 20 74 68 61 74 20 73 74 72  d store that str
8980: 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e  ing.** in zType.
8990: 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  .*/ .void sqlite
89a0: 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50  3AddColumnType(P
89b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
89c0: 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 54  ken *pType){.  T
89d0: 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d  able *p;.  Colum
89e0: 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20 70 20 3d 20  n *pCol;..  p = 
89f0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
8a00: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  e;.  if( p==0 ||
8a10: 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31   NEVER(p->nCol<1
8a20: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43  ) ) return;.  pC
8a30: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d  ol = &p->aCol[p-
8a40: 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 61 73 73 65  >nCol-1];.  asse
8a50: 72 74 28 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d  rt( pCol->zType=
8a60: 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54  =0 );.  pCol->zT
8a70: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ype = sqlite3Nam
8a80: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
8a90: 65 2d 3e 64 62 2c 20 70 54 79 70 65 29 3b 0a 20  e->db, pType);. 
8aa0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
8ab0: 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  = sqlite3Affinit
8ac0: 79 54 79 70 65 28 70 43 6f 6c 2d 3e 7a 54 79 70  yType(pCol->zTyp
8ad0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e);.}../*.** The
8ae0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
8af0: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
8b00: 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65   for the most re
8b10: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
8b20: 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61  umn.** of the ta
8b30: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
8b40: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
8b50: 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20  ..**.** Default 
8b60: 76 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e  value expression
8b70: 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61  s must be consta
8b80: 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78  nt.  Raise an ex
8b90: 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a  ception if this.
8ba0: 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  ** is not the ca
8bb0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
8bc0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8bd0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
8be0: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
8bf0: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
8c00: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
8c10: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
8c20: 69 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66  id sqlite3AddDef
8c30: 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20  aultValue(Parse 
8c40: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 53 70 61  *pParse, ExprSpa
8c50: 6e 20 2a 70 53 70 61 6e 29 7b 0a 20 20 54 61 62  n *pSpan){.  Tab
8c60: 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20  le *p;.  Column 
8c70: 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33  *pCol;.  sqlite3
8c80: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
8c90: 62 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  b;.  p = pParse-
8ca0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
8cb0: 28 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 70 43  ( p!=0 ){.    pC
8cc0: 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70  ol = &(p->aCol[p
8cd0: 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20  ->nCol-1]);.    
8ce0: 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
8cf0: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
8d00: 74 69 6f 6e 28 70 53 70 61 6e 2d 3e 70 45 78 70  tion(pSpan->pExp
8d10: 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  r) ){.      sqli
8d20: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8d30: 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c  se, "default val
8d40: 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73  ue of column [%s
8d50: 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  ] is not constan
8d60: 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43  t",.          pC
8d70: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
8d80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
8d90: 41 20 63 6f 70 79 20 6f 66 20 70 45 78 70 72 20  A copy of pExpr 
8da0: 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  is used instead 
8db0: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c  of the original,
8dc0: 20 61 73 20 70 45 78 70 72 20 63 6f 6e 74 61 69   as pExpr contai
8dd0: 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65  ns.      ** toke
8de0: 6e 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ns that point to
8df0: 20 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79   volatile memory
8e00: 2e 20 54 68 65 20 27 73 70 61 6e 27 20 6f 66 20  . The 'span' of 
8e10: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  the expression. 
8e20: 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69       ** is requi
8e30: 72 65 64 20 62 79 20 70 72 61 67 6d 61 20 74 61  red by pragma ta
8e40: 62 6c 65 5f 69 6e 66 6f 2e 0a 20 20 20 20 20 20  ble_info..      
8e50: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
8e60: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
8e70: 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20  Col->pDflt);.   
8e80: 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d     pCol->pDflt =
8e90: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
8ea0: 64 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78 70 72  db, pSpan->pExpr
8eb0: 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
8ec0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8ed0: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
8ee0: 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 70  >zDflt);.      p
8ef0: 43 6f 6c 2d 3e 7a 44 66 6c 74 20 3d 20 73 71 6c  Col->zDflt = sql
8f00: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
8f10: 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e  , (char*)pSpan->
8f20: 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20  zStart,.        
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 20 20 20 20 28 69 6e               (in
8f50: 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d  t)(pSpan->zEnd -
8f60: 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29   pSpan->zStart))
8f70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
8f80: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
8f90: 64 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78 70 72  db, pSpan->pExpr
8fa0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69  );.}../*.** Desi
8fb0: 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41 52  gnate the PRIMAR
8fc0: 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61  Y KEY for the ta
8fd0: 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61  ble.  pList is a
8fe0: 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a   list of names .
8ff0: 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68  ** of columns th
9000: 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d  at form the prim
9010: 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69  ary key.  If pLi
9020: 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  st is NULL, then
9030: 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63   the.** most rec
9040: 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75  ently added colu
9050: 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  mn of the table 
9060: 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  is the primary k
9070: 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c  ey..**.** A tabl
9080: 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f  e can have at mo
9090: 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b  st one primary k
90a0: 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c  ey.  If the tabl
90b0: 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a  e already has.**
90c0: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28   a primary key (
90d0: 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
90e0: 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b  second primary k
90f0: 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65 20  ey) then create 
9100: 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a  an.** error..**.
9110: 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52  ** If the PRIMAR
9120: 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69  Y KEY is on a si
9130: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73  ngle column whos
9140: 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49 4e  e datatype is IN
9150: 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77  TEGER,.** then w
9160: 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73  e will try to us
9170: 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73  e that column as
9180: 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74   the rowid.  Set
9190: 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79   the Table.iPKey
91a0: 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65  .** field of the
91b0: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
91c0: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
91d0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
91e0: 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d  .** INTEGER PRIM
91f0: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20  ARY KEY column. 
9200: 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20   Table.iPKey is 
9210: 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65  set to -1 if the
9220: 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45  re is.** no INTE
9230: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
9240: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65  .**.** If the ke
9250: 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45  y is not an INTE
9260: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
9270: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75   then create a u
9280: 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66  nique.** index f
9290: 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20  or the key.  No 
92a0: 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64  index is created
92b0: 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49   for INTEGER PRI
92c0: 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f  MARY KEYs..*/.vo
92d0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69  id sqlite3AddPri
92e0: 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65  maryKey(.  Parse
92f0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
9300: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
9310: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
9320: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
9330: 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f  f field names to
9340: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
9350: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
9360: 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
9370: 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65   with a uniquene
9380: 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  ss conflict */. 
9390: 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20 20   int autoInc,   
93a0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
93b0: 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  e AUTOINCREMENT 
93c0: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
93d0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  nt */.  int sort
93e0: 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51 4c  Order     /* SQL
93f0: 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51  ITE_SO_ASC or SQ
9400: 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a  LITE_SO_DESC */.
9410: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
9420: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
9430: 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54  able;.  char *zT
9440: 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ype = 0;.  int i
9450: 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69  Col = -1, i;.  i
9460: 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 49 4e  f( pTab==0 || IN
9470: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20  _DECLARE_VTAB ) 
9480: 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79  goto primary_key
9490: 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61  _exit;.  if( pTa
94a0: 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
94b0: 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 20 29  _HasPrimaryKey )
94c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
94d0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
94e0: 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73       "table \"%s
94f0: 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e  \" has more than
9500: 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79   one primary key
9510: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
9520: 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72  .    goto primar
9530: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a  y_key_exit;.  }.
9540: 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
9550: 20 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d 61 72   |= TF_HasPrimar
9560: 79 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c 69 73  yKey;.  if( pLis
9570: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c  t==0 ){.    iCol
9580: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20   = pTab->nCol - 
9590: 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  1;.    pTab->aCo
95a0: 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65  l[iCol].isPrimKe
95b0: 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 1;.  }else{.
95c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
95d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
95e0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f  ){.      for(iCo
95f0: 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
9600: 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
9610: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
9620: 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  e3StrICmp(pList-
9630: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61  >a[i].zName, pTa
9640: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
9650: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
9660: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9670: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
9680: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54 61      if( iCol<pTa
9690: 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
96a0: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43     pTab->aCol[iC
96b0: 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20  ol].isPrimKey = 
96c0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
96d0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
96e0: 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d  nExpr>1 ) iCol =
96f0: 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69   -1;.  }.  if( i
9700: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
9710: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
9720: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
9730: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
9740: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65  .  }.  if( zType
9750: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
9760: 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47  mp(zType, "INTEG
9770: 45 52 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ER")==0.        
9780: 26 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51  && sortOrder==SQ
9790: 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a 20  LITE_SO_ASC ){. 
97a0: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
97b0: 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d   iCol;.    pTab-
97c0: 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f  >keyConf = (u8)o
97d0: 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61 73 73 65  nError;.    asse
97e0: 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c  rt( autoInc==0 |
97f0: 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a  | autoInc==1 );.
9800: 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
9810: 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46  gs |= autoInc*TF
9820: 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a  _Autoincrement;.
9830: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f    }else if( auto
9840: 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  Inc ){.#ifndef S
9850: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
9860: 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c  NCREMENT.    sql
9870: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
9880: 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d  rse, "AUTOINCREM
9890: 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f  ENT is only allo
98a0: 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20  wed on an ".    
98b0: 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d     "INTEGER PRIM
98c0: 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69  ARY KEY");.#endi
98d0: 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49  f.  }else{.    I
98e0: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d  ndex *p;.    p =
98f0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
9900: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30  dex(pParse, 0, 0
9910: 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72  , 0, pList, onEr
9920: 72 6f 72 2c 20 30 2c 20 30 2c 20 73 6f 72 74 4f  ror, 0, 0, sortO
9930: 72 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66  rder, 0);.    if
9940: 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ( p ){.      p->
9950: 61 75 74 6f 49 6e 64 65 78 20 3d 20 32 3b 0a 20  autoIndex = 2;. 
9960: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d     }.    pList =
9970: 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79   0;.  }..primary
9980: 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c  _key_exit:.  sql
9990: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
99a0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
99b0: 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b  List);.  return;
99c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
99d0: 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  new CHECK constr
99e0: 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c  aint to the tabl
99f0: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
9a00: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
9a10: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
9a20: 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e  ddCheckConstrain
9a30: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
9a40: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
9a50: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
9a60: 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20  xpr *pCheckExpr 
9a70: 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78   /* The check ex
9a80: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23  pression */.){.#
9a90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9aa0: 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65  IT_CHECK.  Table
9ab0: 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   *pTab = pParse-
9ac0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
9ad0: 28 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45  ( pTab && !IN_DE
9ae0: 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20  CLARE_VTAB ){.  
9af0: 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d    pTab->pCheck =
9b00: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9b10: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
9b20: 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68  Tab->pCheck, pCh
9b30: 65 63 6b 45 78 70 72 29 3b 0a 20 20 20 20 69 66  eckExpr);.    if
9b40: 28 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72  ( pParse->constr
9b50: 61 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20  aintName.n ){.  
9b60: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
9b70: 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73  istSetName(pPars
9b80: 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c  e, pTab->pCheck,
9b90: 20 26 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72   &pParse->constr
9ba0: 61 69 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a 20 20  aintName, 1);.  
9bb0: 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64    }.  }else.#end
9bc0: 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74  if.  {.    sqlit
9bd0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
9be0: 72 73 65 2d 3e 64 62 2c 20 70 43 68 65 63 6b 45  rse->db, pCheckE
9bf0: 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  xpr);.  }.}../*.
9c00: 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61  ** Set the colla
9c10: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66  tion function of
9c20: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
9c30: 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c 65 20  ly parsed table 
9c40: 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65  column.** to the
9c50: 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a   CollSeq given..
9c60: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
9c70: 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61  ddCollateType(Pa
9c80: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
9c90: 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54  en *pToken){.  T
9ca0: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
9cb0: 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b  ;.  char *zColl;
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9cd0: 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f   Dequoted name o
9ce0: 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  f collation sequ
9cf0: 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ence */.  sqlite
9d00: 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70  3 *db;..  if( (p
9d10: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
9d20: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
9d30: 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c  n;.  i = p->nCol
9d40: 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  -1;.  db = pPars
9d50: 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d  e->db;.  zColl =
9d60: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
9d70: 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e  Token(db, pToken
9d80: 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20  );.  if( !zColl 
9d90: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28  ) return;..  if(
9da0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
9db0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
9dc0: 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65  oll) ){.    Inde
9dd0: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 70 2d 3e  x *pIdx;.    p->
9de0: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20  aCol[i].zColl = 
9df0: 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a  zColl;.  .    /*
9e00: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   If the column i
9e10: 73 20 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c  s declared as "<
9e20: 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45  name> PRIMARY KE
9e30: 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e  Y COLLATE <type>
9e40: 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61  ",.    ** then a
9e50: 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65  n index may have
9e60: 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e   been created on
9e70: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66   this column bef
9e80: 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  ore the.    ** c
9e90: 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61  ollation type wa
9ea0: 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74  s added. Correct
9eb0: 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20 74   this if it is t
9ec0: 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  he case..    */.
9ed0: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e      for(pIdx=p->
9ee0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
9ef0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
9f00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9f10: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  Idx->nColumn==1 
9f20: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  );.      if( pId
9f30: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
9f40: 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64  i ){.        pId
9f50: 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70  x->azColl[0] = p
9f60: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b  ->aCol[i].zColl;
9f70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9f80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
9f90: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
9fa0: 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  oll);.  }.}../*.
9fb0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
9fc0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c   returns the col
9fd0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
9fe0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61 74  for database nat
9ff0: 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f  ive text.** enco
a000: 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20  ding identified 
a010: 62 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e  by the string zN
a020: 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d  ame, length nNam
a030: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
a040: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74  requested collat
a050: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20  ion sequence is 
a060: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  not available, o
a070: 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a  r not available.
a080: 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
a090: 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69  se native encodi
a0a0: 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ng, the collatio
a0b0: 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76  n factory is inv
a0c0: 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65  oked to.** reque
a0d0: 73 74 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f  st it. If the co
a0e0: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
a0f0: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20  does not supply 
a100: 73 75 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c  such a sequence,
a110: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75  .** and the sequ
a120: 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  ence is availabl
a130: 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78  e in another tex
a140: 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e  t encoding, then
a150: 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75   that is.** retu
a160: 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  rned instead..**
a170: 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f  .** If no versio
a180: 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75 65 73  ns of the reques
a190: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73  ted collations s
a1a0: 65 71 75 65 6e 63 65 20 61 72 65 20 61 76 61 69  equence are avai
a1b0: 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f  lable, or.** ano
a1c0: 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72  ther error occur
a1d0: 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
a1e0: 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ned and an error
a1f0: 20 6d 65 73 73 61 67 65 20 77 72 69 74 74 65 6e   message written
a200: 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e   into.** pParse.
a210: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
a220: 69 6e 65 20 69 73 20 61 20 77 72 61 70 70 65 72  ine is a wrapper
a230: 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46   around sqlite3F
a240: 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54  indCollSeq().  T
a250: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
a260: 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61  nvokes the colla
a270: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20  tion factory if 
a280: 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74  the named collat
a290: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ion cannot be fo
a2a0: 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  und.** and gener
a2b0: 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  ates an error me
a2c0: 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  ssage..**.** See
a2d0: 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46 69   also: sqlite3Fi
a2e0: 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71 6c  ndCollSeq(), sql
a2f0: 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 29  ite3GetCollSeq()
a300: 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c  .*/.CollSeq *sql
a310: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
a320: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
a330: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
a340: 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  me){.  sqlite3 *
a350: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
a360: 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28  .  u8 enc = ENC(
a370: 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75  db);.  u8 initbu
a380: 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75  sy = db->init.bu
a390: 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  sy;.  CollSeq *p
a3a0: 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d  Coll;..  pColl =
a3b0: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
a3c0: 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61  Seq(db, enc, zNa
a3d0: 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20  me, initbusy);. 
a3e0: 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26   if( !initbusy &
a3f0: 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43  & (!pColl || !pC
a400: 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20  oll->xCmp) ){.  
a410: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
a420: 33 47 65 74 43 6f 6c 6c 53 65 71 28 64 62 2c 20  3GetCollSeq(db, 
a430: 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d  enc, pColl, zNam
a440: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f  e);.    if( !pCo
a450: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ll ){.      sqli
a460: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
a470: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c  se, "no such col
a480: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a  lation sequence:
a490: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
a4a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
a4b0: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a  n pColl;.}.../*.
a4c0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
a4d0: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65   that will incre
a4e0: 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20  ment the schema 
a4f0: 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  cookie..**.** Th
a500: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
a510: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
a520: 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63  mine when the sc
a530: 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20  hema for the.** 
a540: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
a550: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63  .  After each sc
a560: 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65  hema change, the
a570: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a   cookie value.**
a580: 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20   changes.  When 
a590: 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20  a process first 
a5a0: 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61  reads the schema
a5b0: 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a   it records the.
a5c0: 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72  ** cookie.  Ther
a5d0: 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72  eafter, whenever
a5e0: 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65   it goes to acce
a5f0: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ss the database,
a600: 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68  .** it checks th
a610: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65  e cookie to make
a620: 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61   sure the schema
a630: 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64   has not changed
a640: 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73  .** since it was
a650: 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a   last read..**.*
a660: 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e  * This plan is n
a670: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75  ot completely bu
a680: 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20  llet-proof.  It 
a690: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a  is possible for.
a6a0: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
a6b0: 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65   change multiple
a6c0: 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74   times and for t
a6d0: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a  he cookie to be.
a6e0: 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70  ** set back to p
a6f0: 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74  rior value.  But
a700: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
a710: 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a  are infrequent.*
a720: 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62  * and the probab
a730: 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67  ility of hitting
a740: 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65   the same cookie
a750: 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a   value is only.*
a760: 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e  * 1 chance in 2^
a770: 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61  32.  So we're sa
a780: 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f  fe enough..*/.vo
a790: 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  id sqlite3Change
a7a0: 43 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50  Cookie(Parse *pP
a7b0: 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
a7c0: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
a7d0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
a7e0: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20  rse);.  sqlite3 
a7f0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
a800: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
a810: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
a820: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
a830: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
a840: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 73  , iDb, 0) );.  s
a850: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a860: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
a870: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
a880: 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  hema->schema_coo
a890: 6b 69 65 2b 31 2c 20 72 31 29 3b 0a 20 20 73 71  kie+1, r1);.  sq
a8a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
a8b0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
a8c0: 20 69 44 62 2c 20 42 54 52 45 45 5f 53 43 48 45   iDb, BTREE_SCHE
a8d0: 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 72 31 29 3b  MA_VERSION, r1);
a8e0: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
a8f0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
a900: 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   r1);.}../*.** M
a910: 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65  easure the numbe
a920: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
a930: 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74  needed to output
a940: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64   the given.** id
a950: 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e  entifier.  The n
a960: 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69  umber returned i
a970: 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74  ncludes any quot
a980: 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64  es used.** but d
a990: 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20  oes not include 
a9a0: 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61  the null termina
a9b0: 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  tor..**.** The e
a9c0: 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65  stimate is conse
a9d0: 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67  rvative.  It mig
a9e0: 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ht be larger tha
a9f0: 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61  t what is.** rea
aa00: 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73  lly needed..*/.s
aa10: 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c  tatic int identL
aa20: 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72  ength(const char
aa30: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *z){.  int n;. 
aa40: 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b   for(n=0; *z; n+
aa50: 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, z++){.    if(
aa60: 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b   *z=='"' ){ n++;
aa70: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
aa80: 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n + 2;.}../*.** 
aa90: 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65  The first parame
aaa0: 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
aab0: 20 74 6f 20 61 6e 20 6f 75 74 70 75 74 20 62 75   to an output bu
aac0: 66 66 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64  ffer. The second
aad0: 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69   .** parameter i
aae0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
aaf0: 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 63  n integer that c
ab00: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6f 66 66 73  ontains the offs
ab10: 65 74 20 61 74 0a 2a 2a 20 77 68 69 63 68 20 74  et at.** which t
ab20: 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65  o write into the
ab30: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 20   output buffer. 
ab40: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
ab50: 70 69 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d  pies the.** nul-
ab60: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
ab70: 67 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  g pointed to by 
ab80: 74 68 65 20 74 68 69 72 64 20 70 61 72 61 6d 65  the third parame
ab90: 74 65 72 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e  ter, zSignedIden
aba0: 74 2c 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70 65  t,.** to the spe
abb0: 63 69 66 69 65 64 20 6f 66 66 73 65 74 20 69 6e  cified offset in
abc0: 20 74 68 65 20 62 75 66 66 65 72 20 61 6e 64 20   the buffer and 
abd0: 75 70 64 61 74 65 73 20 2a 70 49 64 78 20 74 6f  updates *pIdx to
abe0: 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65   refer.** to the
abf0: 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65   first byte afte
ac00: 72 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  r the last byte 
ac10: 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20 72  written before r
ac20: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a  eturning..** .**
ac30: 20 49 66 20 74 68 65 20 73 74 72 69 6e 67 20 7a   If the string z
ac40: 53 69 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73  SignedIdent cons
ac50: 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66  ists entirely of
ac60: 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a   alpha-numeric.*
ac70: 2a 20 63 68 61 72 61 63 74 65 72 73 2c 20 64 6f  * characters, do
ac80: 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  es not begin wit
ac90: 68 20 61 20 64 69 67 69 74 20 61 6e 64 20 69 73  h a digit and is
aca0: 20 6e 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79 77   not an SQL keyw
acb0: 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20  ord,.** then it 
acc0: 69 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65  is copied to the
acd0: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 65   output buffer e
ace0: 78 61 63 74 6c 79 20 61 73 20 69 74 20 69 73 2e  xactly as it is.
acf0: 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69   Otherwise,.** i
ad00: 74 20 69 73 20 71 75 6f 74 65 64 20 75 73 69 6e  t is quoted usin
ad10: 67 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e  g double-quotes.
ad20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ad30: 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a  identPut(char *z
ad40: 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61  , int *pIdx, cha
ad50: 72 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29  r *zSignedIdent)
ad60: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
ad70: 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73  r *zIdent = (uns
ad80: 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67  igned char*)zSig
ad90: 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20  nedIdent;.  int 
ada0: 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b  i, j, needQuote;
adb0: 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20  .  i = *pIdx;.. 
adc0: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
add0: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  [j]; j++){.    i
ade0: 66 28 20 21 73 71 6c 69 74 65 33 49 73 61 6c 6e  f( !sqlite3Isaln
adf0: 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26  um(zIdent[j]) &&
ae00: 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20   zIdent[j]!='_' 
ae10: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e  ) break;.  }.  n
ae20: 65 65 64 51 75 6f 74 65 20 3d 20 73 71 6c 69 74  eedQuote = sqlit
ae30: 65 33 49 73 64 69 67 69 74 28 7a 49 64 65 6e 74  e3Isdigit(zIdent
ae40: 5b 30 5d 29 20 7c 7c 20 73 71 6c 69 74 65 33 4b  [0]) || sqlite3K
ae50: 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e  eywordCode(zIden
ae60: 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20  t, j)!=TK_ID;.  
ae70: 69 66 28 20 21 6e 65 65 64 51 75 6f 74 65 20 29  if( !needQuote )
ae80: 7b 0a 20 20 20 20 6e 65 65 64 51 75 6f 74 65 20  {.    needQuote 
ae90: 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 7d  = zIdent[j];.  }
aea0: 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  ..  if( needQuot
aeb0: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
aec0: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
aed0: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
aee0: 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e    z[i++] = zIden
aef0: 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49  t[j];.    if( zI
af00: 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a  dent[j]=='"' ) z
af10: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d  [i++] = '"';.  }
af20: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
af30: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
af40: 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a  .  z[i] = 0;.  *
af50: 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a  pIdx = i;.}../*.
af60: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52  ** Generate a CR
af70: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
af80: 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65  ment appropriate
af90: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
afa0: 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79  * table.  Memory
afb0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78   to hold the tex
afc0: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
afd0: 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  nt is obtained.*
afe0: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  * from sqliteMal
aff0: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
b000: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
b010: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
b020: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
b030: 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74  *createTableStmt
b040: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
b050: 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ble *p){.  int i
b060: 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , k, n;.  char *
b070: 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  zStmt;.  char *z
b080: 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45  Sep, *zSep2, *zE
b090: 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  nd;.  Column *pC
b0a0: 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66  ol;.  n = 0;.  f
b0b0: 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f  or(pCol = p->aCo
b0c0: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
b0d0: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
b0e0: 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c  .    n += identL
b0f0: 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  ength(pCol->zNam
b100: 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20  e) + 5;.  }.  n 
b110: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
b120: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
b130: 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65  n<50 ){ .    zSe
b140: 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70  p = "";.    zSep
b150: 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e  2 = ",";.    zEn
b160: 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65  d = ")";.  }else
b170: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e  {.    zSep = "\n
b180: 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d    ";.    zSep2 =
b190: 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45   ",\n  ";.    zE
b1a0: 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a  nd = "\n)";.  }.
b1b0: 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d    n += 35 + 6*p-
b1c0: 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d  >nCol;.  zStmt =
b1d0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
b1e0: 52 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28  Raw(0, n);.  if(
b1f0: 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20   zStmt==0 ){.   
b200: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
b210: 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  d = 1;.    retur
b220: 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
b230: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a  e3_snprintf(n, z
b240: 53 74 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41  Stmt, "CREATE TA
b250: 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71  BLE ");.  k = sq
b260: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53  lite3Strlen30(zS
b270: 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74  tmt);.  identPut
b280: 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a  (zStmt, &k, p->z
b290: 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b  Name);.  zStmt[k
b2a0: 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72  ++] = '(';.  for
b2b0: 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69  (pCol=p->aCol, i
b2c0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
b2d0: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
b2e0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
b2f0: 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70  ar * const azTyp
b300: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  e[] = {.        
b310: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  /* SQLITE_AFF_TE
b320: 58 54 20 20 20 20 2a 2f 20 22 20 54 45 58 54 22  XT    */ " TEXT"
b330: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
b340: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20  ITE_AFF_NONE    
b350: 2a 2f 20 22 22 2c 0a 20 20 20 20 20 20 20 20 2f  */ "",.        /
b360: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  * SQLITE_AFF_NUM
b370: 45 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a  ERIC */ " NUM",.
b380: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
b390: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f  E_AFF_INTEGER */
b3a0: 20 22 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20   " INT",.       
b3b0: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52   /* SQLITE_AFF_R
b3c0: 45 41 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c  EAL    */ " REAL
b3d0: 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  ".    };.    int
b3e0: 20 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20   len;.    const 
b3f0: 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20  char *zType;..  
b400: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
b410: 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b  tf(n-k, &zStmt[k
b420: 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20  ], zSep);.    k 
b430: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
b440: 33 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20  30(&zStmt[k]);. 
b450: 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b     zSep = zSep2;
b460: 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53  .    identPut(zS
b470: 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a  tmt, &k, pCol->z
b480: 4e 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Name);.    asser
b490: 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  t( pCol->affinit
b4a0: 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  y-SQLITE_AFF_TEX
b4b0: 54 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73  T >= 0 );.    as
b4c0: 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69  sert( pCol->affi
b4d0: 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f  nity-SQLITE_AFF_
b4e0: 54 45 58 54 20 3c 20 41 72 72 61 79 53 69 7a 65  TEXT < ArraySize
b4f0: 28 61 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20  (azType) );.    
b500: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
b510: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
b520: 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20  _AFF_TEXT );.   
b530: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
b540: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
b550: 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 3b 0a 20 20  E_AFF_NONE );.  
b560: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
b570: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
b580: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
b590: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
b5a0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
b5b0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
b5c0: 45 52 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ER );.    testca
b5d0: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
b5e0: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ty==SQLITE_AFF_R
b5f0: 45 41 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20  EAL );.    .    
b600: 7a 54 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70  zType = azType[p
b610: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20  Col->affinity - 
b620: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 5d  SQLITE_AFF_TEXT]
b630: 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69  ;.    len = sqli
b640: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70  te3Strlen30(zTyp
b650: 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
b660: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
b670: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
b680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
b690: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
b6a0: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
b6b0: 79 70 65 28 7a 54 79 70 65 29 20 29 3b 0a 20 20  ype(zType) );.  
b6c0: 20 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74 5b    memcpy(&zStmt[
b6d0: 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29 3b  k], zType, len);
b6e0: 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20  .    k += len;. 
b6f0: 20 20 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e 20     assert( k<=n 
b700: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
b710: 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26  _snprintf(n-k, &
b720: 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20  zStmt[k], "%s", 
b730: 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  zEnd);.  return 
b740: 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zStmt;.}../*.** 
b750: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
b760: 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74  called to report
b770: 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74   the final ")" t
b780: 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a  hat terminates.*
b790: 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  * a CREATE TABLE
b7a0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
b7b0: 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75  * The table stru
b7c0: 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72  cture that other
b7d0: 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73   action routines
b7e0: 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64   have been build
b7f0: 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  ing.** is added 
b800: 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  to the internal 
b810: 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73  hash tables, ass
b820: 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20  uming no errors 
b830: 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64  have.** occurred
b840: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79  ..**.** An entry
b850: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69   for the table i
b860: 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61  s made in the ma
b870: 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69  ster table on di
b880: 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68  sk, unless.** th
b890: 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
b8a0: 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69  y table or db->i
b8b0: 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68  nit.busy==1.  Wh
b8c0: 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  en db->init.busy
b8d0: 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20  ==1.** it means 
b8e0: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
b8f0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
b900: 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77   table because w
b910: 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63  e just.** connec
b920: 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ted to the datab
b930: 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74  ase or because t
b940: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
b950: 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65   table has.** re
b960: 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20  cently changed, 
b970: 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  so the entry for
b980: 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65   this table alre
b990: 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a  ady exists in.**
b9a0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
b9b0: 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f  er table.  We do
b9c0: 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65   not want to cre
b9d0: 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a  ate it again..**
b9e0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65  .** If the pSele
b9f0: 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ct argument is n
ba00: 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e  ot NULL, it mean
ba10: 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  s that this rout
ba20: 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65  ine.** was calle
ba30: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61  d to create a ta
ba40: 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72  ble generated fr
ba50: 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45  om a .** "CREATE
ba60: 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45   TABLE ... AS SE
ba70: 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d  LECT ..." statem
ba80: 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ent.  The column
ba90: 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
baa0: 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20   new table will 
bab0: 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74  match the result
bac0: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
bad0: 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
bae0: 74 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50  te3EndTable(.  P
baf0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
bb00: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
bb10: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
bb20: 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20  en *pCons,      
bb30: 20 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20       /* The ',' 
bb40: 74 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20  token after the 
bb50: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e  last column defn
bb60: 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45  . */.  Token *pE
bb70: 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  nd,            /
bb80: 2a 20 54 68 65 20 66 69 6e 61 6c 20 27 29 27 20  * The final ')' 
bb90: 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 43 52 45  token in the CRE
bba0: 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 53  ATE TABLE */.  S
bbb0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20  elect *pSelect  
bbc0: 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
bbd0: 20 66 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20   from a "CREATE 
bbe0: 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a  ... AS SELECT" *
bbf0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
bc00: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
bc10: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
bc20: 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 28  nt iDb;..  if( (
bc30: 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65  pEnd==0 && pSele
bc40: 63 74 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61  ct==0) || db->ma
bc50: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
bc60: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
bc70: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
bc80: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
bc90: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  0 ) return;..  a
bca0: 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
bcb0: 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63  .busy || !pSelec
bcc0: 74 20 29 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71  t );..  iDb = sq
bcd0: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
bce0: 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d  ex(db, p->pSchem
bcf0: 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  a);..#ifndef SQL
bd00: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
bd10: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65   /* Resolve name
bd20: 73 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63  s in all CHECK c
bd30: 6f 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65 73  onstraint expres
bd40: 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  sions..  */.  if
bd50: 28 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20  ( p->pCheck ){. 
bd60: 20 20 20 53 72 63 4c 69 73 74 20 73 53 72 63 3b     SrcList sSrc;
bd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd80: 20 20 20 2f 2a 20 46 61 6b 65 20 53 72 63 4c 69     /* Fake SrcLi
bd90: 73 74 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 70  st for pParse->p
bda0: 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 20 20 20 20  NewTable */.    
bdb0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdd0: 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
bde0: 66 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  for pParse->pNew
bdf0: 54 61 62 6c 65 20 2a 2f 0a 20 20 20 20 45 78 70  Table */.    Exp
be00: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
be20: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 43 48 45 43  List of all CHEC
be30: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  K constraints */
be40: 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
be50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be60: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
be70: 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d  nter */..    mem
be80: 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
be90: 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 6d  eof(sNC));.    m
bea0: 65 6d 73 65 74 28 26 73 53 72 63 2c 20 30 2c 20  emset(&sSrc, 0, 
beb0: 73 69 7a 65 6f 66 28 73 53 72 63 29 29 3b 0a 20  sizeof(sSrc));. 
bec0: 20 20 20 73 53 72 63 2e 6e 53 72 63 20 3d 20 31     sSrc.nSrc = 1
bed0: 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e  ;.    sSrc.a[0].
bee0: 7a 4e 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65  zName = p->zName
bef0: 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e  ;.    sSrc.a[0].
bf00: 70 54 61 62 20 3d 20 70 3b 0a 20 20 20 20 73 53  pTab = p;.    sS
bf10: 72 63 2e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20  rc.a[0].iCursor 
bf20: 3d 20 2d 31 3b 0a 20 20 20 20 73 4e 43 2e 70 50  = -1;.    sNC.pP
bf30: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
bf40: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
bf50: 3d 20 26 73 53 72 63 3b 0a 20 20 20 20 73 4e 43  = &sSrc;.    sNC
bf60: 2e 69 73 43 68 65 63 6b 20 3d 20 31 3b 0a 20 20  .isCheck = 1;.  
bf70: 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70 43 68    pList = p->pCh
bf80: 65 63 6b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  eck;.    for(i=0
bf90: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
bfa0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
bfb0: 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  ( sqlite3Resolve
bfc0: 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20  ExprNames(&sNC, 
bfd0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
bfe0: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  r) ){.        re
bff0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
c000: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
c010: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
c020: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f  E_OMIT_CHECK) */
c030: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
c040: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31  ->init.busy is 1
c050: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
c060: 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c   reading the SQL
c070: 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73   off the.  ** "s
c080: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72  qlite_master" or
c090: 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61   "sqlite_temp_ma
c0a0: 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74  ster" table on t
c0b0: 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f  he disk..  ** So
c0c0: 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f   do not write to
c0d0: 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e   the disk again.
c0e0: 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f    Extract the ro
c0f0: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  ot page number. 
c100: 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c   ** for the tabl
c110: 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69  e from the db->i
c120: 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c  nit.newTnum fiel
c130: 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75  d.  (The page nu
c140: 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  mber.  ** should
c150: 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74   have been put t
c160: 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69  here by the sqli
c170: 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65  teOpenCb routine
c180: 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  .).  */.  if( db
c190: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
c1a0: 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d     p->tnum = db-
c1b0: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
c1c0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20   }..  /* If not 
c1d0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68  initializing, th
c1e0: 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f  en create a reco
c1f0: 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  rd for the new t
c200: 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  able.  ** in the
c210: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
c220: 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61  able of the data
c230: 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  base..  **.  ** 
c240: 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  If this is a TEM
c250: 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72  PORARY table, wr
c260: 69 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e  ite the entry in
c270: 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  to the auxiliary
c280: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65  .  ** file inste
c290: 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d  ad of into the m
c2a0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
c2b0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  e..  */.  if( !d
c2c0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
c2d0: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56      int n;.    V
c2e0: 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72  dbe *v;.    char
c2f0: 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22   *zType;    /* "
c300: 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22  view" or "table"
c310: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54   */.    char *zT
c320: 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57  ype2;   /* "VIEW
c330: 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a  " or "TABLE" */.
c340: 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b      char *zStmt;
c350: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74      /* Text of t
c360: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
c370: 6f 72 20 43 52 45 41 54 45 20 56 49 45 57 20 73  or CREATE VIEW s
c380: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20  tatement */..   
c390: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
c3a0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
c3b0: 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
c3c0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20   ) return;..    
c3d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c3e0: 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  1(v, OP_Close, 0
c3f0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20  );..    /* .    
c400: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54  ** Initialize zT
c410: 79 70 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ype for the new 
c420: 76 69 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20  view or table.. 
c430: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
c440: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
c450: 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61       /* A regula
c460: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  r table */.     
c470: 20 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22   zType = "table"
c480: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d  ;.      zType2 =
c490: 20 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65   "TABLE";.#ifnde
c4a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
c4b0: 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  EW.    }else{.  
c4c0: 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f      /* A view */
c4d0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
c4e0: 76 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79  view";.      zTy
c4f0: 70 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65  pe2 = "VIEW";.#e
c500: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
c510: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
c520: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 20  CREATE TABLE xx 
c530: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65  AS SELECT ..., e
c540: 78 65 63 75 74 65 20 74 68 65 20 53 45 4c 45 43  xecute the SELEC
c550: 54 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65  T.    ** stateme
c560: 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  nt to populate t
c570: 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68  he new table. Th
c580: 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  e root-page numb
c590: 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a  er for the.    *
c5a0: 2a 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 69  * new table is i
c5b0: 6e 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73  n register pPars
c5c0: 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20  e->regRoot..    
c5d0: 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74  **.    ** Once t
c5e0: 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65  he SELECT has be
c5f0: 65 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69  en coded by sqli
c600: 74 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20  te3Select(), it 
c610: 69 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73  is in a.    ** s
c620: 75 69 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f  uitable state to
c630: 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 20 63   query for the c
c640: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20  olumn names and 
c650: 74 79 70 65 73 20 74 6f 20 62 65 20 75 73 65 64  types to be used
c660: 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e  .    ** by the n
c670: 65 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  ew table..    **
c680: 0a 20 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64  .    ** A shared
c690: 2d 63 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63  -cache write-loc
c6a0: 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  k is not require
c6b0: 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  d to write to th
c6c0: 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20  e new table,.   
c6d0: 20 2a 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d   ** as a schema-
c6e0: 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61  lock must have a
c6f0: 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61  lready been obta
c700: 69 6e 65 64 20 74 6f 20 63 72 65 61 74 65 20 69  ined to create i
c710: 74 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20  t. Since.    ** 
c720: 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78  a schema-lock ex
c730: 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72  cludes all other
c740: 20 64 61 74 61 62 61 73 65 20 75 73 65 72 73 2c   database users,
c750: 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20   the write-lock 
c760: 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20  would.    ** be 
c770: 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a  redundant..    *
c780: 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  /.    if( pSelec
c790: 74 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63  t ){.      Selec
c7a0: 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
c7b0: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
c7c0: 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
c7d0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29  pParse->nTab==1)
c7e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c7f0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
c800: 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50  OpenWrite, 1, pP
c810: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69  arse->regRoot, i
c820: 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
c830: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
c840: 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 1);.      pPar
c850: 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20  se->nTab = 2;.  
c860: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
c870: 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
c880: 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 29 3b 0a   SRT_Table, 1);.
c890: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
c8a0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
c8b0: 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ect, &dest);.   
c8c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c8d0: 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
c8e0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
c8f0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
c900: 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54  ){.        pSelT
c910: 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
c920: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
c930: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a  arse, pSelect);.
c940: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65 6c          if( pSel
c950: 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Tab==0 ) return;
c960: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c970: 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20   p->aCol==0 );. 
c980: 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d         p->nCol =
c990: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
c9a0: 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20          p->aCol 
c9b0: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
c9c0: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
c9d0: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
c9e0: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
c9f0: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  l = 0;.        s
ca00: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
ca10: 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a  e(db, pSelTab);.
ca20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
ca30: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
ca40: 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
ca50: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73 74  of the CREATE st
ca60: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
ca70: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
ca80: 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61      zStmt = crea
ca90: 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20  teTableStmt(db, 
caa0: 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
cab0: 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70       n = (int)(p
cac0: 45 6e 64 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d  End->z - pParse-
cad0: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b  >sNameToken.z) +
cae0: 20 31 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   1;.      zStmt 
caf0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
cb00: 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  (db, .          
cb10: 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22  "CREATE %s %.*s"
cb20: 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61  , zType2, n, pPa
cb30: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
cb40: 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  z.      );.    }
cb50: 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20  ..    /* A slot 
cb60: 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68  for the record h
cb70: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
cb80: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  allocated in the
cb90: 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f   .    ** SQLITE_
cba0: 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57  MASTER table.  W
cbb0: 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75  e just need to u
cbc0: 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20  pdate that slot 
cbd0: 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20  with all.    ** 
cbe0: 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
cbf0: 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e  we've collected.
cc00: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
cc10: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
cc20: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50  Parse,.      "UP
cc30: 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20  DATE %Q.%s ".   
cc40: 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d        "SET type=
cc50: 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74  '%s', name=%Q, t
cc60: 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74  bl_name=%Q, root
cc70: 70 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51  page=#%d, sql=%Q
cc80: 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45   ".       "WHERE
cc90: 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20   rowid=#%d",.   
cca0: 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
ccb0: 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
ccc0: 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20  BLE(iDb),.      
ccd0: 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zType,.      p->
cce0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zName,.      p->
ccf0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50 61  zName,.      pPa
cd00: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20  rse->regRoot,.  
cd10: 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20      zStmt,.     
cd20: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69   pParse->regRowi
cd30: 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  d.    );.    sql
cd40: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
cd50: 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
cd60: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
cd70: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69  Parse, iDb);..#i
cd80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cd90: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
cda0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
cdb0: 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  see if we need t
cdc0: 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69  o create an sqli
cdd0: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
cde0: 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65  e for.    ** kee
cdf0: 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75  ping track of au
ce00: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73  toincrement keys
ce10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
ce20: 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54   p->tabFlags & T
ce30: 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  F_Autoincrement 
ce40: 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62  ){.      Db *pDb
ce50: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
ce60: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ce70: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
ce80: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
ce90: 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  0) );.      if( 
cea0: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53  pDb->pSchema->pS
ceb0: 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20  eqTab==0 ){.    
cec0: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
ced0: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
cee0: 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
cef0: 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65   TABLE %Q.sqlite
cf00: 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73  _sequence(name,s
cf10: 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  eq)",.          
cf20: 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  pDb->zName.     
cf30: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
cf40: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
cf50: 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65 72 79  /* Reparse every
cf60: 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20  thing to update 
cf70: 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74  our internal dat
cf80: 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a  a structures */.
cf90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
cfa0: 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28  ddParseSchemaOp(
cfb0: 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20  v, iDb,.        
cfc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
cfd0: 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e  rintf(db, "tbl_n
cfe0: 61 6d 65 3d 27 25 71 27 22 2c 20 70 2d 3e 7a 4e  ame='%q'", p->zN
cff0: 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  ame));.  }...  /
d000: 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20  * Add the table 
d010: 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  to the in-memory
d020: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
d030: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
d040: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
d050: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
d060: 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20   Table *pOld;.  
d070: 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
d080: 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a  a = p->pSchema;.
d090: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
d0a0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
d0b0: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
d0c0: 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
d0d0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
d0e0: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
d0f0: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  , p->zName,.    
d100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d110: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d120: 53 74 72 6c 65 6e 33 30 28 70 2d 3e 7a 4e 61 6d  Strlen30(p->zNam
d130: 65 29 2c 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e),p);.    if( p
d140: 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Old ){.      ass
d150: 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20  ert( p==pOld ); 
d160: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
d170: 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69  have failed insi
d180: 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20  de HashInsert() 
d190: 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  */.      db->mal
d1a0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
d1b0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
d1c0: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70   }.    pParse->p
d1d0: 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  NewTable = 0;.  
d1e0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
d1f0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
d200: 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ges;..#ifndef SQ
d210: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54  LITE_OMIT_ALTERT
d220: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d  ABLE.    if( !p-
d230: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
d240: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
d250: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
d260: 72 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d  r *)pParse->sNam
d270: 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20  eToken.z;.      
d280: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20  int nName;.     
d290: 20 61 73 73 65 72 74 28 20 21 70 53 65 6c 65 63   assert( !pSelec
d2a0: 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45  t && pCons && pE
d2b0: 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nd );.      if( 
d2c0: 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  pCons->z==0 ){. 
d2d0: 20 20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70         pCons = p
d2e0: 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  End;.      }.   
d2f0: 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29     nName = (int)
d300: 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70  ((const char *)p
d310: 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29  Cons->z - zName)
d320: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f  ;.      p->addCo
d330: 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73  lOffset = 13 + s
d340: 71 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65  qlite3Utf8CharLe
d350: 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  n(zName, nName);
d360: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
d370: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
d380: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
d390: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
d3a0: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
d3b0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72  e in order to cr
d3c0: 65 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a  eate a new VIEW.
d3d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
d3e0: 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72  reateView(.  Par
d3f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d400: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
d410: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
d420: 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f  n *pBegin,     /
d430: 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
d440: 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74  en that begins t
d450: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
d460: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
d470: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
d480: 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
d490: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
d4a0: 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
d4b0: 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame2,     /* The
d4c0: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
d4d0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
d4e0: 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65  e view */.  Sele
d4f0: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f  ct *pSelect,   /
d500: 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65  * A SELECT state
d510: 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62  ment that will b
d520: 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69  ecome the new vi
d530: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
d540: 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 52  mp,        /* TR
d550: 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41  UE for a TEMPORA
d560: 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  RY view */.  int
d570: 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20 20   noErr          
d580: 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72 72 6f  /* Suppress erro
d590: 72 20 6d 65 73 73 61 67 65 73 20 69 66 20 56 49  r messages if VI
d5a0: 45 57 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  EW already exist
d5b0: 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  s */.){.  Table 
d5c0: 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63  *p;.  int n;.  c
d5d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
d5e0: 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62  Token sEnd;.  Db
d5f0: 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f  Fixer sFix;.  To
d600: 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a  ken *pName = 0;.
d610: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c    int iDb;.  sql
d620: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
d630: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50  e->db;..  if( pP
d640: 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a  arse->nVar>0 ){.
d650: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
d660: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70 61 72  Msg(pParse, "par
d670: 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20  ameters are not 
d680: 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73  allowed in views
d690: 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  ");.    sqlite3S
d6a0: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
d6b0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
d6c0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
d6d0: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
d6e0: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
d6f0: 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c  ame2, isTemp, 1,
d700: 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20   0, noErr);.  p 
d710: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
d720: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
d730: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
d740: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
d750: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
d760: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74  Select);.    ret
d770: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
d780: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
d790: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
d7a0: 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
d7b0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
d7c0: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
d7d0: 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 69  p->pSchema);.  i
d7e0: 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  f( sqlite3FixIni
d7f0: 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
d800: 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e   iDb, "view", pN
d810: 61 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69  ame).    && sqli
d820: 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46  te3FixSelect(&sF
d830: 69 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29  ix, pSelect).  )
d840: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
d850: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
d860: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
d870: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  rn;.  }..  /* Ma
d880: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
d890: 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73   entire SELECT s
d8a0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
d8b0: 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
d8c0: 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66    ** This will f
d8d0: 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70  orce all the Exp
d8e0: 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73  r.token.z values
d8f0: 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
d900: 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
d910: 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f  d rather than po
d920: 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74  int to the input
d930: 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20   string - which 
d940: 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20  means that.  ** 
d950: 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73  they will persis
d960: 74 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  t after the curr
d970: 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ent sqlite3_exec
d980: 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e  () call returns.
d990: 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65  .  */.  p->pSele
d9a0: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
d9b0: 63 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63  ctDup(db, pSelec
d9c0: 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  t, EXPRDUP_REDUC
d9d0: 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  E);.  sqlite3Sel
d9e0: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
d9f0: 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 64 62  elect);.  if( db
da00: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
da10: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
da20: 7d 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  }.  if( !db->ini
da30: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71  t.busy ){.    sq
da40: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
da50: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
da60: 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  p);.  }..  /* Lo
da70: 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20  cate the end of 
da80: 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20  the CREATE VIEW 
da90: 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65  statement.  Make
daa0: 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20   sEnd point to. 
dab0: 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a   ** the end..  *
dac0: 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73  /.  sEnd = pPars
dad0: 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20  e->sLastToken;. 
dae0: 20 69 66 28 20 41 4c 57 41 59 53 28 73 45 6e 64   if( ALWAYS(sEnd
daf0: 2e 7a 5b 30 5d 21 3d 30 29 20 26 26 20 73 45 6e  .z[0]!=0) && sEn
db00: 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20  d.z[0]!=';' ){. 
db10: 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e     sEnd.z += sEn
db20: 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e  d.n;.  }.  sEnd.
db30: 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e  n = 0;.  n = (in
db40: 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67  t)(sEnd.z - pBeg
db50: 69 6e 2d 3e 7a 29 3b 0a 20 20 7a 20 3d 20 70 42  in->z);.  z = pB
db60: 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65  egin->z;.  while
db70: 28 20 41 4c 57 41 59 53 28 6e 3e 30 29 20 26 26  ( ALWAYS(n>0) &&
db80: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
db90: 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20  z[n-1]) ){ n--; 
dba0: 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b  }.  sEnd.z = &z[
dbb0: 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d  n-1];.  sEnd.n =
dbc0: 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71   1;..  /* Use sq
dbd0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
dbe0: 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20  to add the view 
dbf0: 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  to the SQLITE_MA
dc00: 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20  STER table */.  
dc10: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
dc20: 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64  pParse, 0, &sEnd
dc30: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  , 0);.  return;.
dc40: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
dc50: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
dc60: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
dc70: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
dc80: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
dc90: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
dca0: 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ABLE)./*.** The 
dcb0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
dcc0: 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79  pTable is really
dcd0: 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69   a VIEW.  Fill i
dce0: 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a  n the names of.*
dcf0: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  * the columns of
dd00: 20 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65   the view in the
dd10: 20 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72   pTable structur
dd20: 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  e.  Return the n
dd30: 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f  umber.** of erro
dd40: 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  rs.  If an error
dd50: 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61   is seen leave a
dd60: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
dd70: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
dd80: 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
dd90: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
dda0: 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ames(Parse *pPar
ddb0: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  se, Table *pTabl
ddc0: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65  e){.  Table *pSe
ddd0: 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b  lTab;   /* A fak
dde0: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69  e table from whi
ddf0: 63 68 20 77 65 20 67 65 74 20 74 68 65 20 72 65  ch we get the re
de00: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65  sult set */.  Se
de10: 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20  lect *pSel;     
de20: 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53  /* Copy of the S
de30: 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65  ELECT that imple
de40: 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a  ments the view *
de50: 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  /.  int nErr = 0
de60: 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
de70: 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e  of errors encoun
de80: 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  tered */.  int n
de90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
dea0: 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64  Temporarily hold
deb0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
dec0: 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64  cursors assigned
ded0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
dee0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
def0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
df00: 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c  nection for mall
df10: 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  oc errors */.  i
df20: 6e 74 20 28 2a 78 41 75 74 68 29 28 76 6f 69 64  nt (*xAuth)(void
df30: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72  *,int,const char
df40: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  *,const char*,co
df50: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
df60: 63 68 61 72 2a 29 3b 0a 0a 20 20 61 73 73 65 72  char*);..  asser
df70: 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69  t( pTable );..#i
df80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
df90: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
dfa0: 20 69 66 28 20 73 71 6c 69 74 65 33 56 74 61 62   if( sqlite3Vtab
dfb0: 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72  CallConnect(pPar
dfc0: 73 65 2c 20 70 54 61 62 6c 65 29 20 29 7b 0a 20  se, pTable) ){. 
dfd0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
dfe0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
dff0: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
e000: 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  le) ) return 0;.
e010: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
e020: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
e030: 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65  .  /* A positive
e040: 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20   nCol means the 
e050: 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f  columns names fo
e060: 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a  r this view are.
e070: 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f    ** already kno
e080: 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  wn..  */.  if( p
e090: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20  Table->nCol>0 ) 
e0a0: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
e0b0: 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20  A negative nCol 
e0c0: 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72  is a special mar
e0d0: 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ker meaning that
e0e0: 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   we are currentl
e0f0: 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f  y.  ** trying to
e100: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c   compute the col
e110: 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77  umn names.  If w
e120: 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75  e enter this rou
e130: 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61  tine with.  ** a
e140: 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20   negative nCol, 
e150: 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20  it means two or 
e160: 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20  more views form 
e170: 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69  a loop, like thi
e180: 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
e190: 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65   CREATE VIEW one
e1a0: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
e1b0: 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20  M two;.  **     
e1c0: 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20  CREATE VIEW two 
e1d0: 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
e1e0: 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20   one;.  **.  ** 
e1f0: 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 65 72  Actually, the er
e200: 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e 6f 77  ror above is now
e210: 20 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f   caught prior to
e220: 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 70   reaching this p
e230: 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74  oint..  ** But t
e240: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
e250: 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72  t is still impor
e260: 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65 73 20  tant as it does 
e270: 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20  come up.  ** in 
e280: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20  the following:. 
e290: 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43 52   ** .  **     CR
e2a0: 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e  EATE TABLE main.
e2b0: 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20  ex1(a);.  **    
e2c0: 20 43 52 45 41 54 45 20 54 45 4d 50 20 56 49 45   CREATE TEMP VIE
e2d0: 57 20 65 78 31 20 41 53 20 53 45 4c 45 43 54 20  W ex1 AS SELECT 
e2e0: 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a  a FROM ex1;.  **
e2f0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
e300: 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a  OM temp.ex1;.  *
e310: 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
e320: 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71  nCol<0 ){.    sq
e330: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
e340: 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69  arse, "view %s i
e350: 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66  s circularly def
e360: 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  ined", pTable->z
e370: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
e380: 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 1;.  }.  asser
e390: 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  t( pTable->nCol>
e3a0: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  =0 );..  /* If w
e3b0: 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
e3c0: 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64  it means we need
e3d0: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
e3e0: 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  table names..  *
e3f0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
e400: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52  call to sqlite3R
e410: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
e420: 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61  () will expand a
e430: 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d  ny.  ** "*" elem
e440: 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73 75  ents in the resu
e450: 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65 20 76  lts set of the v
e460: 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73  iew and will ass
e470: 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a  ign cursors.  **
e480: 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73   to the elements
e490: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
e4a0: 75 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20  use.  But we do 
e4b0: 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20 63  not want these c
e4c0: 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  hanges.  ** to b
e4d0: 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f  e permanent.  So
e4e0: 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
e4f0: 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f   is done on a co
e500: 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
e510: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
e520: 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
e530: 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73   view..  */.  as
e540: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53  sert( pTable->pS
e550: 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20  elect );.  pSel 
e560: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
e570: 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70  up(db, pTable->p
e580: 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66  Select, 0);.  if
e590: 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 75 38  ( pSel ){.    u8
e5a0: 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65   enableLookaside
e5b0: 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65   = db->lookaside
e5c0: 2e 62 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 6e  .bEnabled;.    n
e5d0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
e5e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  .    sqlite3SrcL
e5f0: 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
e600: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70  (pParse, pSel->p
e610: 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62 6c 65  Src);.    pTable
e620: 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20  ->nCol = -1;.   
e630: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
e640: 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 23 69 66  Enabled = 0;.#if
e650: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e660: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
e670: 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78     xAuth = db->x
e680: 41 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41  Auth;.    db->xA
e690: 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 70 53 65  uth = 0;.    pSe
e6a0: 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
e6b0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
e6c0: 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20  pParse, pSel);. 
e6d0: 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78     db->xAuth = x
e6e0: 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Auth;.#else.    
e6f0: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
e700: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
e710: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29  ct(pParse, pSel)
e720: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 62 2d  ;.#endif.    db-
e730: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
e740: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 4c 6f 6f 6b  led = enableLook
e750: 61 73 69 64 65 3b 0a 20 20 20 20 70 50 61 72 73  aside;.    pPars
e760: 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20  e->nTab = n;.   
e770: 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a   if( pSelTab ){.
e780: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
e790: 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  able->aCol==0 );
e7a0: 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  .      pTable->n
e7b0: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e  Col = pSelTab->n
e7c0: 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61 62 6c  Col;.      pTabl
e7d0: 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->aCol = pSelTa
e7e0: 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70  b->aCol;.      p
e7f0: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30  SelTab->nCol = 0
e800: 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d  ;.      pSelTab-
e810: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >aCol = 0;.     
e820: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
e830: 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29  ble(db, pSelTab)
e840: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e850: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
e860: 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 54  exHeld(db, 0, pT
e870: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29 20 29  able->pSchema) )
e880: 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ;.      pTable->
e890: 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 20 7c  pSchema->flags |
e8a0: 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  = DB_UnresetView
e8b0: 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
e8c0: 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
e8d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72 72   = 0;.      nErr
e8e0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ++;.    }.    sq
e8f0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
e900: 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 7d  e(db, pSel);.  }
e910: 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72   else {.    nErr
e920: 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ++;.  }.#endif /
e930: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
e940: 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e  EW */.  return n
e950: 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20  Err;  .}.#endif 
e960: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
e970: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
e980: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
e990: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
e9a0: 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  LE) */..#ifndef 
e9b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
e9c0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
e9d0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72   column names fr
e9e0: 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e  om every VIEW in
e9f0: 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a   database idx..*
ea00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
ea10: 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
ea20: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
ea30: 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c  t idx){.  HashEl
ea40: 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72 74 28  em *i;.  assert(
ea50: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
ea60: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 64 78 2c  texHeld(db, idx,
ea70: 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21 44 62   0) );.  if( !Db
ea80: 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20  HasProperty(db, 
ea90: 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56  idx, DB_UnresetV
eaa0: 69 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a  iews) ) return;.
eab0: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
eac0: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62  shFirst(&db->aDb
ead0: 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  [idx].pSchema->t
eae0: 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c  blHash); i;i=sql
eaf0: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
eb00: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
eb10: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
eb20: 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54  a(i);.    if( pT
eb30: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
eb40: 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74       sqliteDelet
eb50: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c  eColumnNames(db,
eb60: 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54   pTab);.      pT
eb70: 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
eb80: 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d      pTab->nCol =
eb90: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
eba0: 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
ebb0: 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
ebc0: 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c  setViews);.}.#el
ebd0: 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69  se.# define sqli
ebe0: 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41  teViewResetAll(A
ebf0: 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ,B).#endif /* SQ
ec00: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
ec10: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
ec20: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
ec30: 20 62 79 20 74 68 65 20 56 44 42 45 20 74 6f 20   by the VDBE to 
ec40: 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72  adjust the inter
ec50: 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73  nal schema.** us
ec60: 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65  ed by SQLite whe
ec70: 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  n the btree laye
ec80: 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20  r moves a table 
ec90: 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a  root page. The.*
eca0: 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  * root-page of a
ecb0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
ecc0: 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 20  in database iDb 
ecd0: 68 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d  has changed from
ece0: 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f   iFrom.** to iTo
ecf0: 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23  ..**.** Ticket #
ed00: 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62 6f  1728:  The symbo
ed10: 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73 74  l table might st
ed20: 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f  ill contain info
ed30: 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61  rmation.** on ta
ed40: 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69  bles and/or indi
ed50: 63 65 73 20 74 68 61 74 20 61 72 65 20 74 68 65  ces that are the
ed60: 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e   process of bein
ed70: 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66  g deleted..** If
ed80: 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b 79   you are unlucky
ed90: 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64  , one of those d
eda0: 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20 6f  eleted indices o
edb0: 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a  r tables might.*
edc0: 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  * have the same 
edd0: 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 20  rootpage number 
ede0: 61 73 20 74 68 65 20 72 65 61 6c 20 74 61 62 6c  as the real tabl
edf0: 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20  e or index that 
ee00: 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65  is.** being move
ee10: 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74  d.  So we cannot
ee20: 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67 20   stop searching 
ee30: 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20  after the first 
ee40: 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75 73  match .** becaus
ee50: 65 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  e the first matc
ee60: 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20 6f  h might be for o
ee70: 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65  ne of the delete
ee80: 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20  d indices.** or 
ee90: 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74  tables and not t
eea0: 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 74  he table/index t
eeb0: 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20  hat is actually 
eec0: 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20  being moved..** 
eed0: 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65  We must continue
eee0: 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61   looping until a
eef0: 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  ll tables and in
ef00: 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f  dices with.** ro
ef10: 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61  otpage==iFrom ha
ef20: 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65  ve been converte
ef30: 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f 74  d to have a root
ef40: 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69  page of iTo.** i
ef50: 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 65  n order to be ce
ef60: 72 74 61 69 6e 20 74 68 61 74 20 77 65 20 67 6f  rtain that we go
ef70: 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65 2e  t the right one.
ef80: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
ef90: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
efa0: 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  UM.void sqlite3R
efb0: 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73 71 6c  ootPageMoved(sql
efc0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
efd0: 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  b, int iFrom, in
efe0: 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c  t iTo){.  HashEl
eff0: 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73  em *pElem;.  Has
f000: 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62 20 2a  h *pHash;.  Db *
f010: 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pDb;..  assert( 
f020: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
f030: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
f040: 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64  0) );.  pDb = &d
f050: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
f060: 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63  Hash = &pDb->pSc
f070: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20  hema->tblHash;. 
f080: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
f090: 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68  eHashFirst(pHash
f0a0: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
f0b0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
f0c0: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c  Elem)){.    Tabl
f0d0: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
f0e0: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
f0f0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74  .    if( pTab->t
f100: 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  num==iFrom ){.  
f110: 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d      pTab->tnum =
f120: 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   iTo;.    }.  }.
f130: 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e    pHash = &pDb->
f140: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
f150: 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
f160: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48  liteHashFirst(pH
f170: 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
f180: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
f190: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49  t(pElem)){.    I
f1a0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c  ndex *pIdx = sql
f1b0: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
f1c0: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  m);.    if( pIdx
f1d0: 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b  ->tnum==iFrom ){
f1e0: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75  .      pIdx->tnu
f1f0: 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20  m = iTo;.    }. 
f200: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
f210: 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f  ** Write code to
f220: 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c 65   erase the table
f230: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
f240: 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61  iTable from data
f250: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73  base iDb..** Als
f260: 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20  o write code to 
f270: 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74  modify the sqlit
f280: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e_master table a
f290: 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
f2a0: 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d  ma.** if a root-
f2b0: 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20  page of another 
f2c0: 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
f2d0: 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65  y the btree-laye
f2e0: 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73  r whilst.** eras
f2f0: 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69 73  ing iTable (this
f300: 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
f310: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
f320: 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73  database)..*/ .s
f330: 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
f340: 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65  oyRootPage(Parse
f350: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54   *pParse, int iT
f360: 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  able, int iDb){.
f370: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
f380: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
f390: 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  e);.  int r1 = s
f3a0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
f3b0: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
f3c0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
f3d0: 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61   OP_Destroy, iTa
f3e0: 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20  ble, r1, iDb);. 
f3f0: 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
f400: 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65  (pParse);.#ifnde
f410: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
f420: 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50  TOVACUUM.  /* OP
f430: 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20  _Destroy stores 
f440: 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31  an in integer r1
f450: 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65  . If this intege
f460: 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  r.  ** is non-ze
f470: 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ro, then it is t
f480: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
f490: 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d  ber of a table m
f4a0: 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63  oved to.  ** loc
f4b0: 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68  ation iTable. Th
f4c0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
f4d0: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71   modifies the sq
f4e0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
f4f0: 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63  e to.  ** reflec
f500: 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a  t this..  **.  *
f510: 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20  * The "#NNN" in 
f520: 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65  the SQL is a spe
f530: 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68  cial constant th
f540: 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65  at means whateve
f550: 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20  r value.  ** is 
f560: 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e  in register NNN.
f570: 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75    See grammar ru
f580: 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  les associated w
f590: 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53  ith the TK_REGIS
f5a0: 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66  TER.  ** token f
f5b0: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
f5c0: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  formation..  */.
f5d0: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
f5e0: 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
f5f0: 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
f600: 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64   SET rootpage=%d
f610: 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20 72   WHERE #%d AND r
f620: 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20  ootpage=#%d",.  
f630: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61     pParse->db->a
f640: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
f650: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
f660: 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72 31  , iTable, r1, r1
f670: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
f680: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
f690: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d  g(pParse, r1);.}
f6a0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44  ../*.** Write VD
f6b0: 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65  BE code to erase
f6c0: 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
f6d0: 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69  all associated i
f6e0: 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a  ndices on disk..
f6f0: 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74  ** Code to updat
f700: 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
f710: 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69  ter tables and i
f720: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64  nternal schema d
f730: 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e  efinitions.** in
f740: 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67   case a root-pag
f750: 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61  e belonging to a
f760: 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20  nother table is 
f770: 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72  moved by the btr
f780: 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61  ee layer.** is a
f790: 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20  lso added (this 
f7a0: 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20  can happen with 
f7b0: 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
f7c0: 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61  atabase)..*/.sta
f7d0: 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79  tic void destroy
f7e0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
f7f0: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
f800: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
f810: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
f820: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
f830: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
f840: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
f850: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
f860: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64  b->pSchema);.  d
f870: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
f880: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75  Parse, pTab->tnu
f890: 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28 70  m, iDb);.  for(p
f8a0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
f8b0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
f8c0: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64  x->pNext){.    d
f8d0: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
f8e0: 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75  Parse, pIdx->tnu
f8f0: 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c  m, iDb);.  }.#el
f900: 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  se.  /* If the d
f910: 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20 61  atabase may be a
f920: 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62  uto-vacuum capab
f930: 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d  le (if SQLITE_OM
f940: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
f950: 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  ** is not define
f960: 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69  d), then it is i
f970: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c  mportant to call
f980: 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74   OP_Destroy on t
f990: 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e  he.  ** table an
f9a0: 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67  d index root-pag
f9b0: 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61  es in order, sta
f9c0: 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e  rting with the n
f9d0: 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a  umerically .  **
f9e0: 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
f9f0: 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20  ge number. This 
fa00: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
fa10: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74  none of the root
fa20: 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  -pages.  ** to b
fa30: 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 72  e destroyed is r
fa40: 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65  elocated by an e
fa50: 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f  arlier OP_Destro
fa60: 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20  y. i.e. if the. 
fa70: 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65   ** following we
fa80: 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20  re coded:.  **. 
fa90: 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34   ** OP_Destroy 4
faa0: 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a   0.  ** ....  **
fab0: 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a   OP_Destroy 5 0.
fac0: 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f    **.  ** and ro
fad0: 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65 6e  ot page 5 happen
fae0: 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72  ed to be the lar
faf0: 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
fb00: 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a  umber in the.  *
fb10: 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  * database, then
fb20: 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75   root page 5 wou
fb30: 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70  ld be moved to p
fb40: 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20 20  age 4 by the .  
fb50: 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34  ** "OP_Destroy 4
fb60: 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20   0" opcode. The 
fb70: 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44  subsequent "OP_D
fb80: 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c  estroy 5 0" woul
fb90: 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65  d hit.  ** a fre
fba0: 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a  e-list page..  *
fbb0: 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
fbc0: 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74  Tab->tnum;.  int
fbd0: 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b   iDestroyed = 0;
fbe0: 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ..  while( 1 ){.
fbf0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
fc00: 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73  .    int iLarges
fc10: 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  t = 0;..    if( 
fc20: 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c  iDestroyed==0 ||
fc30: 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64   iTab<iDestroyed
fc40: 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65   ){.      iLarge
fc50: 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d  st = iTab;.    }
fc60: 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
fc70: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
fc80: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
fc90: 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  xt){.      int i
fca0: 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d  Idx = pIdx->tnum
fcb0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
fcc0: 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  pIdx->pSchema==p
fcd0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
fce0: 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73 74        if( (iDest
fcf0: 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64  royed==0 || (iId
fd00: 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20 26  x<iDestroyed)) &
fd10: 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20  & iIdx>iLargest 
fd20: 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67  ){.        iLarg
fd30: 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20  est = iIdx;.    
fd40: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
fd50: 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b  ( iLargest==0 ){
fd60: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
fd70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fd80: 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
fd90: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
fda0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
fdb0: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
fdc0: 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
fdd0: 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73  (pParse, iLarges
fde0: 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69  t, iDb);.      i
fdf0: 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72  Destroyed = iLar
fe00: 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gest;.    }.  }.
fe10: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
fe20: 52 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66  Remove entries f
fe30: 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73  rom the sqlite_s
fe40: 74 61 74 4e 20 74 61 62 6c 65 73 20 28 66 6f 72  tatN tables (for
fe50: 20 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a 2a   N in (1,2,3)).*
fe60: 2a 20 61 66 74 65 72 20 61 20 44 52 4f 50 20 49  * after a DROP I
fe70: 4e 44 45 58 20 6f 72 20 44 52 4f 50 20 54 41 42  NDEX or DROP TAB
fe80: 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73  LE command..*/.s
fe90: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
fea0: 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65  e3ClearStatTable
feb0: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
fec0: 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
fed0: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
fee0: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
fef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ff00: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6e  * The database n
ff10: 75 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  umber */.  const
ff20: 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20 20   char *zType,   
ff30: 20 20 2f 2a 20 22 69 64 78 22 20 6f 72 20 22 74    /* "idx" or "t
ff40: 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  bl" */.  const c
ff50: 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20  har *zName      
ff60: 2f 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65 78  /* Name of index
ff70: 20 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a   or table */.){.
ff80: 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
ff90: 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d   char *zDbName =
ffa0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
ffb0: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 66  [iDb].zName;.  f
ffc0: 6f 72 28 69 3d 31 3b 20 69 3c 3d 33 3b 20 69 2b  or(i=1; i<=3; i+
ffd0: 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 61  +){.    char zTa
ffe0: 62 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74  b[24];.    sqlit
fff0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
10000 6f 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73  of(zTab),zTab,"s
10010 71 6c 69 74 65 5f 73 74 61 74 25 64 22 2c 69 29  qlite_stat%d",i)
10020 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
10030 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
10040 65 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62  e->db, zTab, zDb
10050 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73  Name) ){.      s
10060 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
10070 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
10080 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
10090 51 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25 51  Q.%s WHERE %s=%Q
100a0 22 2c 0a 20 20 20 20 20 20 20 20 7a 44 62 4e 61  ",.        zDbNa
100b0 6d 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c  me, zTab, zType,
100c0 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a   zName.      );.
100d0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
100e0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
100f0 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65   to drop a table
10100 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
10110 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 50  3CodeDropTable(P
10120 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
10130 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69  ble *pTab, int i
10140 44 62 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b  Db, int isView){
10150 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
10160 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
10170 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65  se->db;.  Trigge
10180 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 44  r *pTrigger;.  D
10190 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
101a0 62 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73  b[iDb];..  v = s
101b0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
101c0 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
101d0 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   v!=0 );.  sqlit
101e0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
101f0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
10200 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
10210 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
10220 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49  UALTABLE.  if( I
10230 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
10240 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
10250 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42  eAddOp0(v, OP_VB
10260 65 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  egin);.  }.#endi
10270 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  f..  /* Drop all
10280 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69   triggers associ
10290 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
102a0 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
102b0 64 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20  d. Code.  ** is 
102c0 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d  generated to rem
102d0 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  ove entries from
102e0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61   sqlite_master a
102f0 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74  nd/or.  ** sqlit
10300 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66  e_temp_master if
10310 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
10320 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c    pTrigger = sql
10330 69 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28  ite3TriggerList(
10340 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
10350 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72   while( pTrigger
10360 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
10370 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
10380 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
10390 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 70 54 72   || .        pTr
103a0 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d  igger->pSchema==
103b0 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
103c0 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ma );.    sqlite
103d0 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28  3DropTriggerPtr(
103e0 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72  pParse, pTrigger
103f0 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 20  );.    pTrigger 
10400 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78  = pTrigger->pNex
10410 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  t;.  }..#ifndef 
10420 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
10430 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52  INCREMENT.  /* R
10440 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65  emove any entrie
10450 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  s of the sqlite_
10460 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61  sequence table a
10470 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20  ssociated with. 
10480 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65   ** the table be
10490 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69  ing dropped. Thi
104a0 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65  s is done before
104b0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72   the table is dr
104c0 6f 70 70 65 64 0a 20 20 2a 2a 20 61 74 20 74 68  opped.  ** at th
104d0 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69  e btree level, i
104e0 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74  n case the sqlit
104f0 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
10500 20 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d   needs to.  ** m
10510 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20  ove as a result 
10520 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e  of the drop (can
10530 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d   happen in auto-
10540 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20  vacuum mode)..  
10550 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74  */.  if( pTab->t
10560 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
10570 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20  oincrement ){.  
10580 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
10590 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
105a0 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
105b0 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %Q.sqlite_sequen
105c0 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ce WHERE name=%Q
105d0 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  ",.      pDb->zN
105e0 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
105f0 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  .    );.  }.#end
10600 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c  if..  /* Drop al
10610 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  l SQLITE_MASTER 
10620 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
10630 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66  entries that ref
10640 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74  er to the.  ** t
10650 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61  able. The progra
10660 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72  m name loops thr
10670 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20  ough the master 
10680 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65  table and delete
10690 73 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77  s.  ** every row
106a0 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
106b0 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73  a table of the s
106c0 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
106d0 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64  one being.  ** d
106e0 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73  ropped. Triggers
106f0 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
10700 65 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20  erately because 
10710 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65  a trigger can be
10720 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e  .  ** created in
10730 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
10740 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74  se that refers t
10750 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f  o a table in ano
10760 74 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62 61  ther.  ** databa
10770 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  se..  */.  sqlit
10780 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
10790 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44 45  arse, .      "DE
107a0 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
107b0 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25  WHERE tbl_name=%
107c0 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69  Q and type!='tri
107d0 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70 44  gger'",.      pD
107e0 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b->zName, SCHEMA
107f0 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54 61  _TABLE(iDb), pTa
10800 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b->zName);.  if(
10810 20 21 69 73 56 69 65 77 20 26 26 20 21 49 73 56   !isView && !IsV
10820 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
10830 20 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65      destroyTable
10840 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
10850 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65    }..  /* Remove
10860 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
10870 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69   from SQLite's i
10880 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61  nternal schema a
10890 6e 64 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74  nd modify.  ** t
108a0 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
108b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  ..  */.  if( IsV
108c0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
108d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
108e0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73  ddOp4(v, OP_VDes
108f0 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c  troy, iDb, 0, 0,
10900 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
10910 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
10920 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
10930 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20  DropTable, iDb, 
10940 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  0, 0, pTab->zNam
10950 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  e, 0);.  sqlite3
10960 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
10970 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c  rse, iDb);.  sql
10980 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
10990 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  db, iDb);.}../*.
109a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
109b0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20  is called to do 
109c0 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52  the work of a DR
109d0 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  OP TABLE stateme
109e0 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20  nt..** pName is 
109f0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
10a00 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70  table to be drop
10a10 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ped..*/.void sql
10a20 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61  ite3DropTable(Pa
10a30 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
10a40 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
10a50 20 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45   isView, int noE
10a60 72 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  rr){.  Table *pT
10a70 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  ab;.  Vdbe *v;. 
10a80 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
10a90 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
10aa0 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d   iDb;..  if( db-
10ab0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
10ac0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
10ad0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
10ae0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
10af0 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73  >nErr==0 );.  as
10b00 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
10b10 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 6e 6f  c==1 );.  if( no
10b20 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65  Err ) db->suppre
10b30 73 73 45 72 72 2b 2b 3b 0a 20 20 70 54 61 62 20  ssErr++;.  pTab 
10b40 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
10b50 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 73 56  able(pParse, isV
10b60 69 65 77 2c 20 0a 20 20 20 20 20 20 20 20 20 20  iew, .          
10b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b80 20 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e    pName->a[0].zN
10b90 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
10ba0 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69  .zDatabase);.  i
10bb0 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73  f( noErr ) db->s
10bc0 75 70 70 72 65 73 73 45 72 72 2d 2d 3b 0a 0a 20  uppressErr--;.. 
10bd0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
10be0 20 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20      if( noErr ) 
10bf0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
10c00 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61  yNamedSchema(pPa
10c10 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  rse, pName->a[0]
10c20 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
10c30 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
10c40 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62  table;.  }.  iDb
10c50 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
10c60 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
10c70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73  ->pSchema);.  as
10c80 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
10c90 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a  iDb<db->nDb );..
10ca0 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20    /* If pTab is 
10cb0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  a virtual table,
10cc0 20 63 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c   call ViewGetCol
10cd0 75 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e  umnNames() to en
10ce0 73 75 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20  sure.  ** it is 
10cf0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
10d00 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
10d10 6c 28 70 54 61 62 29 20 26 26 20 73 71 6c 69 74  l(pTab) && sqlit
10d20 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
10d30 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
10d40 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  b) ){.    goto e
10d50 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
10d60 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
10d70 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
10d80 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
10d90 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73  t code;.    cons
10da0 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
10db0 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
10dc0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
10dd0 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
10de0 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
10df0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
10e00 32 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  2 = 0;.    if( s
10e10 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
10e20 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
10e30 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
10e40 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74  zDb)){.      got
10e50 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
10e60 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
10e70 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20   isView ){.     
10e80 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
10e90 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
10ea0 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
10eb0 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56  LITE_DROP_TEMP_V
10ec0 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
10ed0 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
10ee0 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45   SQLITE_DROP_VIE
10ef0 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  W;.      }.#ifnd
10f00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
10f10 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
10f20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74  }else if( IsVirt
10f30 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
10f40 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
10f50 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20  _DROP_VTABLE;.  
10f60 20 20 20 20 7a 41 72 67 32 20 3d 20 73 71 6c 69      zArg2 = sqli
10f70 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c  te3GetVTable(db,
10f80 20 70 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e   pTab)->pMod->zN
10f90 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ame;.#endif.    
10fa0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
10fb0 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
10fc0 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
10fd0 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
10fe0 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
10ff0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11000 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
11010 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b  LITE_DROP_TABLE;
11020 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11030 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
11040 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
11050 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  code, pTab->zNam
11060 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29  e, zArg2, zDb) )
11070 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
11080 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
11090 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
110a0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
110b0 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
110c0 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  TE, pTab->zName,
110d0 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
110e0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
110f0 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
11100 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73  }.#endif.  if( s
11110 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
11120 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
11130 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20  ite_", 7)==0 .  
11140 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e    && sqlite3StrN
11150 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  ICmp(pTab->zName
11160 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 22 2c  , "sqlite_stat",
11170 20 31 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 73   11)!=0 ){.    s
11180 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
11190 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
111a0 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70   may not be drop
111b0 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ped", pTab->zNam
111c0 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
111d0 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
111e0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
111f0 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a  E_OMIT_VIEW.  /*
11200 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42   Ensure DROP TAB
11210 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f  LE is not used o
11220 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52  n a view, and DR
11230 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75  OP VIEW is not u
11240 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61  sed.  ** on a ta
11250 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
11260 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
11270 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
11280 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
11290 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
112a0 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c  ROP TABLE to del
112b0 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70  ete table %s", p
112c0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
112d0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
112e0 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28  table;.  }.  if(
112f0 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62   !isView && pTab
11300 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
11310 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11320 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
11330 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74  OP VIEW to delet
11340 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62  e view %s", pTab
11350 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
11360 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
11370 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  le;.  }.#endif..
11380 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
11390 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
113a0 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
113b0 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a  master table.  *
113c0 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  * on disk..  */.
113d0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
113e0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
113f0 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
11400 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
11410 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
11420 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  1, iDb);.    sql
11430 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62  ite3ClearStatTab
11440 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c  les(pParse, iDb,
11450 20 22 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e   "tbl", pTab->zN
11460 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
11470 33 46 6b 44 72 6f 70 54 61 62 6c 65 28 70 50 61  3FkDropTable(pPa
11480 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62  rse, pName, pTab
11490 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  );.    sqlite3Co
114a0 64 65 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72  deDropTable(pPar
114b0 73 65 2c 20 70 54 61 62 2c 20 69 44 62 2c 20 69  se, pTab, iDb, i
114c0 73 56 69 65 77 29 3b 0a 20 20 7d 0a 0a 65 78 69  sView);.  }..exi
114d0 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20  t_drop_table:.  
114e0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
114f0 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b  lete(db, pName);
11500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
11510 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
11520 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
11530 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20   foreign key on 
11540 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72  the table.** cur
11550 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
11560 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f  struction.  pFro
11570 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20  mCol determines 
11580 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  which columns.**
11590 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
115a0 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74  table point to t
115b0 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20  he foreign key. 
115c0 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20   If pFromCol==0 
115d0 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20  then.** connect 
115e0 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c  the key to the l
115f0 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72  ast column inser
11600 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65  ted.  pTo is the
11610 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20   name of.** the 
11620 74 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74  table referred t
11630 6f 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20  o.  pToCol is a 
11640 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69  list of tables i
11650 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70  n the other.** p
11660 54 6f 20 74 61 62 6c 65 20 74 68 61 74 20 74 68  To table that th
11670 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f  e foreign key po
11680 69 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20  ints to.  flags 
11690 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20  contains all.** 
116a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
116b0 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72  t the conflict r
116c0 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
116d0 74 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a  thms specified.*
116e0 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45  * in the ON DELE
116f0 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e  TE, ON UPDATE an
11700 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75  d ON INSERT clau
11710 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b  ses..**.** An FK
11720 65 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ey structure is 
11730 63 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65  created and adde
11740 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  d to the table c
11750 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65  urrently.** unde
11760 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69  r construction i
11770 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e  n the pParse->pN
11780 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a  ewTable field..*
11790 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e  *.** The foreign
117a0 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72 20   key is set for 
117b0 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73  IMMEDIATE proces
117c0 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75  sing.  A subsequ
117d0 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73  ent call.** to s
117e0 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
117f0 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68  gnKey() might ch
11800 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45 46  ange this to DEF
11810 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ERRED..*/.void s
11820 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65  qlite3CreateFore
11830 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20  ignKey(.  Parse 
11840 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
11850 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
11860 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
11870 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43  *pFromCol,  /* C
11880 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74  olumns in this t
11890 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20  able that point 
118a0 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  to other table *
118b0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20  /.  Token *pTo, 
118c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
118d0 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74 61   of the other ta
118e0 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
118f0 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a  t *pToCol,    /*
11900 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   Columns in the 
11910 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
11920 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
11930 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63        /* Conflic
11940 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
11950 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20  orithms. */.){. 
11960 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
11970 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64  Parse->db;.#ifnd
11980 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
11990 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65  OREIGN_KEY.  FKe
119a0 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20  y *pFKey = 0;.  
119b0 46 4b 65 79 20 2a 70 4e 65 78 74 54 6f 3b 0a 20  FKey *pNextTo;. 
119c0 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72   Table *p = pPar
119d0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
119e0 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e   int nByte;.  in
119f0 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  t i;.  int nCol;
11a00 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61  .  char *z;..  a
11a10 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b  ssert( pTo!=0 );
11a20 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 49  .  if( p==0 || I
11a30 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
11a40 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
11a50 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20  if( pFromCol==0 
11a60 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  ){.    int iCol 
11a70 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20  = p->nCol-1;.   
11a80 20 69 66 28 20 4e 45 56 45 52 28 69 43 6f 6c 3c   if( NEVER(iCol<
11a90 30 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  0) ) goto fk_end
11aa0 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c  ;.    if( pToCol
11ab0 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
11ac0 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  r!=1 ){.      sq
11ad0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
11ae0 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b  arse, "foreign k
11af0 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20  ey on %s".      
11b00 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65     " should refe
11b10 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63  rence only one c
11b20 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25  olumn of table %
11b30 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e  T",.         p->
11b40 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
11b50 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f  , pTo);.      go
11b60 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d  to fk_end;.    }
11b70 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20  .    nCol = 1;. 
11b80 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f   }else if( pToCo
11b90 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78  l && pToCol->nEx
11ba0 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  pr!=pFromCol->nE
11bb0 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
11bc0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
11bd0 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62  e,.        "numb
11be0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
11bf0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65   foreign key doe
11c00 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
11c10 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20  number of ".    
11c20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20      "columns in 
11c30 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
11c40 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f  able");.    goto
11c50 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65   fk_end;.  }else
11c60 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72  {.    nCol = pFr
11c70 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20  omCol->nExpr;.  
11c80 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  }.  nByte = size
11c90 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43  of(*pFKey) + (nC
11ca0 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b  ol-1)*sizeof(pFK
11cb0 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70  ey->aCol[0]) + p
11cc0 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28  To->n + 1;.  if(
11cd0 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66   pToCol ){.    f
11ce0 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c  or(i=0; i<pToCol
11cf0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
11d00 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71       nByte += sq
11d10 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54  lite3Strlen30(pT
11d20 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
11d30 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) + 1;.    }.  }
11d40 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74  .  pFKey = sqlit
11d50 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
11d60 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  b, nByte );.  if
11d70 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20  ( pFKey==0 ){.  
11d80 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
11d90 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f   }.  pFKey->pFro
11da0 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e  m = p;.  pFKey->
11db0 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70  pNextFrom = p->p
11dc0 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61  FKey;.  z = (cha
11dd0 72 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  r*)&pFKey->aCol[
11de0 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e  nCol];.  pFKey->
11df0 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70  zTo = z;.  memcp
11e00 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f  y(z, pTo->z, pTo
11e10 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e  ->n);.  z[pTo->n
11e20 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
11e30 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20  Dequote(z);.  z 
11e40 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70  += pTo->n+1;.  p
11e50 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f  FKey->nCol = nCo
11e60 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  l;.  if( pFromCo
11e70 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65  l==0 ){.    pFKe
11e80 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d  y->aCol[0].iFrom
11e90 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
11ea0 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
11eb0 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
11ec0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  {.      int j;. 
11ed0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
11ee0 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  p->nCol; j++){. 
11ef0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
11f00 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f  e3StrICmp(p->aCo
11f10 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f  l[j].zName, pFro
11f20 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
11f30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
11f40 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
11f50 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20  .iFrom = j;.    
11f60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11f70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
11f80 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e       if( j>=p->n
11f90 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Col ){.        s
11fa0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
11fb0 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
11fc0 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d    "unknown colum
11fd0 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65  n \"%s\" in fore
11fe0 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
11ff0 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  on", .          
12000 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
12010 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
12020 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
12030 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
12040 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
12050 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
12060 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
12070 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
12080 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61  rlen30(pToCol->a
12090 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
120a0 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
120b0 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20  .zCol = z;.     
120c0 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f   memcpy(z, pToCo
120d0 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e  l->a[i].zName, n
120e0 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20  );.      z[n] = 
120f0 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b  0;.      z += n+
12100 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
12110 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
12120 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61   = 0;.  pFKey->a
12130 41 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29  Action[0] = (u8)
12140 28 66 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20  (flags & 0xff); 
12150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e             /* ON
12160 20 44 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a   DELETE action *
12170 2f 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69  /.  pFKey->aActi
12180 6f 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c  on[1] = (u8)((fl
12190 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66  ags >> 8 ) & 0xf
121a0 66 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44  f);    /* ON UPD
121b0 41 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20  ATE action */.. 
121c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
121d0 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
121e0 64 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d  db, 0, p->pSchem
121f0 61 29 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20  a) );.  pNextTo 
12200 3d 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65  = (FKey *)sqlite
12210 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e  3HashInsert(&p->
12220 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73  pSchema->fkeyHas
12230 68 2c 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  h, .      pFKey-
12240 3e 7a 54 6f 2c 20 73 71 6c 69 74 65 33 53 74 72  >zTo, sqlite3Str
12250 6c 65 6e 33 30 28 70 46 4b 65 79 2d 3e 7a 54 6f  len30(pFKey->zTo
12260 29 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b 65 79  ), (void *)pFKey
12270 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 78  .  );.  if( pNex
12280 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20  tTo==pFKey ){.  
12290 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
122a0 65 64 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  ed = 1;.    goto
122b0 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69   fk_end;.  }.  i
122c0 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20  f( pNextTo ){.  
122d0 20 20 61 73 73 65 72 74 28 20 70 4e 65 78 74 54    assert( pNextT
122e0 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b  o->pPrevTo==0 );
122f0 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  .    pFKey->pNex
12300 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20  tTo = pNextTo;. 
12310 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65     pNextTo->pPre
12320 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d  vTo = pFKey;.  }
12330 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
12340 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74  foreign key to t
12350 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20  he table as the 
12360 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a  last step..  */.
12370 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b    p->pFKey = pFK
12380 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b  ey;.  pFKey = 0;
12390 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69  ..fk_end:.  sqli
123a0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 46  te3DbFree(db, pF
123b0 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  Key);.#endif /* 
123c0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
123d0 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
123e0 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  ) */.  sqlite3Ex
123f0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
12400 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71   pFromCol);.  sq
12410 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
12420 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b  ete(db, pToCol);
12430 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
12440 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
12450 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c   when an INITIAL
12460 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20  LY IMMEDIATE or 
12470 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
12480 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  ED.** clause is 
12490 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  seen as part of 
124a0 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  a foreign key de
124b0 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69  finition.  The i
124c0 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72  sDeferred.** par
124d0 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20  ameter is 1 for 
124e0 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
124f0 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49  ED and 0 for INI
12500 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
12510 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f  ..** The behavio
12520 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  r of the most re
12530 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66  cently created f
12540 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64  oreign key is ad
12550 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64  justed.** accord
12560 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ingly..*/.void s
12570 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
12580 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61  gnKey(Parse *pPa
12590 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72  rse, int isDefer
125a0 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  red){.#ifndef SQ
125b0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
125c0 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70  N_KEY.  Table *p
125d0 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b  Tab;.  FKey *pFK
125e0 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20  ey;.  if( (pTab 
125f0 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
12600 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65  ble)==0 || (pFKe
12610 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29  y = pTab->pFKey)
12620 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
12630 61 73 73 65 72 74 28 20 69 73 44 65 66 65 72 72  assert( isDeferr
12640 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65 72  ed==0 || isDefer
12650 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a  red==1 ); /* EV:
12660 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37 20 2a   R-30323-21917 *
12670 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  /.  pFKey->isDef
12680 65 72 72 65 64 20 3d 20 28 75 38 29 69 73 44 65  erred = (u8)isDe
12690 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d  ferred;.#endif.}
126a0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
126b0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
126c0 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c  erase and refill
126d0 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54   index *pIdx.  T
126e0 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  his is.** used t
126f0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  o initialize a n
12700 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ewly created ind
12710 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75  ex or to recompu
12720 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  te the.** conten
12730 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e  t of an index in
12740 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52   response to a R
12750 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
12760 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74  **.** if memRoot
12770 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61  Page is not nega
12780 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  tive, it means t
12790 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73  hat the index is
127a0 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65   newly.** create
127b0 64 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72  d.  The register
127c0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65   specified by me
127d0 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69  mRootPage contai
127e0 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  ns the.** root p
127f0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
12800 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d  e index.  If mem
12810 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61  RootPage is nega
12820 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tive, then.** th
12830 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
12840 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20  exists and must 
12850 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
12860 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64  e being refilled
12870 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74   and.** the root
12880 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
12890 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b  the index is tak
128a0 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e  en from pIndex->
128b0 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tnum..*/.static 
128c0 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69  void sqlite3Refi
128d0 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  llIndex(Parse *p
128e0 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
128f0 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f  ndex, int memRoo
12900 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20  tPage){.  Table 
12910 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
12920 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20  pTable;  /* The 
12930 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e  table that is in
12940 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  dexed */.  int i
12950 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
12960 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab++;     /* Btr
12970 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
12980 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  or pTab */.  int
12990 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e   iIdx = pParse->
129a0 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42  nTab++;     /* B
129b0 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
129c0 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20   for pIndex */. 
129d0 20 69 6e 74 20 69 53 6f 72 74 65 72 3b 20 20 20   int iSorter;   
129e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129f0 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 65 64  /* Cursor opened
12a00 20 62 79 20 4f 70 65 6e 53 6f 72 74 65 72 20 28   by OpenSorter (
12a10 69 66 20 69 6e 20 75 73 65 29 20 2a 2f 0a 20 20  if in use) */.  
12a20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20  int addr1;      
12a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12a40 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70  * Address of top
12a50 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e   of loop */.  in
12a60 74 20 61 64 64 72 32 3b 20 20 20 20 20 20 20 20  t addr2;        
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12a80 41 64 64 72 65 73 73 20 74 6f 20 6a 75 6d 70 20  Address to jump 
12a90 74 6f 20 66 6f 72 20 6e 65 78 74 20 69 74 65 72  to for next iter
12aa0 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 74  ation */.  int t
12ab0 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
12ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
12ad0 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20  t page of index 
12ae0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
12af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b00 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
12b10 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76  code into this v
12b20 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a  irtual machine *
12b30 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
12b40 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
12b50 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f     /* KeyInfo fo
12b60 72 20 69 6e 64 65 78 20 2a 2f 0a 23 69 66 64 65  r index */.#ifde
12b70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
12b80 52 47 45 5f 53 4f 52 54 0a 20 20 69 6e 74 20 72  RGE_SORT.  int r
12b90 65 67 49 64 78 4b 65 79 3b 20 20 20 20 20 20 20  egIdxKey;       
12ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
12bb0 69 73 74 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e  isters containin
12bc0 67 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 20  g the index key 
12bd0 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20  */.#endif.  int 
12be0 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20  regRecord;      
12bf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
12c00 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61  gister holding a
12c10 73 73 65 6d 62 6c 69 65 64 20 69 6e 64 65 78 20  ssemblied index 
12c20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69  record */.  sqli
12c30 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
12c40 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68  ->db;      /* Th
12c50 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
12c60 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
12c70 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
12c80 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49  maToIndex(db, pI
12c90 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  ndex->pSchema);.
12ca0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12cb0 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
12cc0 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ON.  if( sqlite3
12cd0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
12ce0 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58  , SQLITE_REINDEX
12cf0 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
12d00 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44   0,.      db->aD
12d10 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29  b[iDb].zName ) )
12d20 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
12d30 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  }.#endif..  /* R
12d40 65 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c  equire a write-l
12d50 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
12d60 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73   to perform this
12d70 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
12d80 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
12d90 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
12da0 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61  ab->tnum, 1, pTa
12db0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20  b->zName);..  v 
12dc0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
12dd0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
12de0 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
12df0 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65   if( memRootPage
12e00 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20  >=0 ){.    tnum 
12e10 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20  = memRootPage;. 
12e20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d   }else{.    tnum
12e30 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b   = pIndex->tnum;
12e40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12e50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65  AddOp2(v, OP_Cle
12e60 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ar, tnum, iDb);.
12e70 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c    }.  pKey = sql
12e80 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
12e90 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29  (pParse, pIndex)
12ea0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12eb0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
12ec0 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75  Write, iIdx, tnu
12ed0 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20  m, iDb, .       
12ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
12ef0 61 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45  ar *)pKey, P4_KE
12f00 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
12f10 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67    if( memRootPag
12f20 65 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  e>=0 ){.    sqli
12f30 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
12f40 76 2c 20 31 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  v, 1);.  }..#ifn
12f50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12f60 4d 45 52 47 45 5f 53 4f 52 54 0a 20 20 2f 2a 20  MERGE_SORT.  /* 
12f70 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72 20  Open the sorter 
12f80 63 75 72 73 6f 72 20 69 66 20 77 65 20 61 72 65  cursor if we are
12f90 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a   to use one. */.
12fa0 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61 72    iSorter = pPar
12fb0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71  se->nTab++;.  sq
12fc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
12fd0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  v, OP_SorterOpen
12fe0 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 30 2c  , iSorter, 0, 0,
12ff0 20 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 34   (char*)pKey, P4
13000 5f 4b 45 59 49 4e 46 4f 29 3b 0a 23 65 6c 73 65  _KEYINFO);.#else
13010 0a 20 20 69 53 6f 72 74 65 72 20 3d 20 69 54 61  .  iSorter = iTa
13020 62 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  b;.#endif..  /* 
13030 4f 70 65 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  Open the table. 
13040 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
13050 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62   rows of the tab
13060 6c 65 2c 20 69 6e 73 65 72 74 69 6e 67 20 69 6e  le, inserting in
13070 64 65 78 0a 20 20 2a 2a 20 72 65 63 6f 72 64 73  dex.  ** records
13080 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72   into the sorter
13090 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4f 70  . */.  sqlite3Op
130a0 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
130b0 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c  iTab, iDb, pTab,
130c0 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
130d0 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
130e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
130f0 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30  _Rewind, iTab, 0
13100 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d  );.  regRecord =
13110 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
13120 65 67 28 70 50 61 72 73 65 29 3b 0a 0a 23 69 66  eg(pParse);..#if
13130 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13140 5f 4d 45 52 47 45 5f 53 4f 52 54 0a 20 20 73 71  _MERGE_SORT.  sq
13150 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64  lite3GenerateInd
13160 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49  exKey(pParse, pI
13170 6e 64 65 78 2c 20 69 54 61 62 2c 20 72 65 67 52  ndex, iTab, regR
13180 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20 73 71 6c  ecord, 1);.  sql
13190 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
131a0 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72  , OP_SorterInser
131b0 74 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52  t, iSorter, regR
131c0 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
131d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
131e0 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
131f0 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  dr1+1);.  sqlite
13200 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
13210 20 61 64 64 72 31 29 3b 0a 20 20 61 64 64 72 31   addr1);.  addr1
13220 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
13230 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
13240 72 53 6f 72 74 2c 20 69 53 6f 72 74 65 72 2c 20  rSort, iSorter, 
13250 30 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  0);.  if( pIndex
13260 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
13270 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 32  ne ){.    int j2
13280 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
13290 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 33  rrentAddr(v) + 3
132a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
132b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
132c0 74 6f 2c 20 30 2c 20 6a 32 29 3b 0a 20 20 20 20  to, 0, j2);.    
132d0 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
132e0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
132f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
13300 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
13310 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c 20 69 53  orterCompare, iS
13320 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65 67 52 65  orter, j2, regRe
13330 63 6f 72 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  cord);.    sqlit
13340 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74  e3HaltConstraint
13350 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
13360 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 22 69 6e 64  , OE_Abort, "ind
13370 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65  exed columns are
13380 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 34   not unique", P4
13390 5f 53 54 41 54 49 43 0a 20 20 20 20 29 3b 0a 20  _STATIC.    );. 
133a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72   }else{.    addr
133b0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
133c0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
133d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
133e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
133f0 74 65 72 44 61 74 61 2c 20 69 53 6f 72 74 65 72  terData, iSorter
13400 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
13410 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13420 33 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  3(v, OP_IdxInser
13430 74 2c 20 69 49 64 78 2c 20 72 65 67 52 65 63 6f  t, iIdx, regReco
13440 72 64 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65  rd, 1);.  sqlite
13450 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
13460 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
13470 45 53 55 4c 54 29 3b 0a 23 65 6c 73 65 0a 20 20  ESULT);.#else.  
13480 72 65 67 49 64 78 4b 65 79 20 3d 20 73 71 6c 69  regIdxKey = sqli
13490 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78  te3GenerateIndex
134a0 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49 6e 64  Key(pParse, pInd
134b0 65 78 2c 20 69 54 61 62 2c 20 72 65 67 52 65 63  ex, iTab, regRec
134c0 6f 72 64 2c 20 31 29 3b 0a 20 20 61 64 64 72 32  ord, 1);.  addr2
134d0 20 3d 20 61 64 64 72 31 20 2b 20 31 3b 0a 20 20   = addr1 + 1;.  
134e0 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  if( pIndex->onEr
134f0 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a  ror!=OE_None ){.
13500 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 72 65      const int re
13510 67 52 6f 77 69 64 20 3d 20 72 65 67 49 64 78 4b  gRowid = regIdxK
13520 65 79 20 2b 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  ey + pIndex->nCo
13530 6c 75 6d 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20  lumn;.    const 
13540 69 6e 74 20 6a 32 20 3d 20 73 71 6c 69 74 65 33  int j2 = sqlite3
13550 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
13560 76 29 20 2b 20 32 3b 0a 20 20 20 20 76 6f 69 64  v) + 2;.    void
13570 20 2a 20 63 6f 6e 73 74 20 70 52 65 67 4b 65 79   * const pRegKey
13580 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f   = SQLITE_INT_TO
13590 5f 50 54 52 28 72 65 67 49 64 78 4b 65 79 29 3b  _PTR(regIdxKey);
135a0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 67  ..    /* The reg
135b0 69 73 74 65 72 73 20 61 63 63 65 73 73 65 64 20  isters accessed 
135c0 62 79 20 74 68 65 20 4f 50 5f 49 73 55 6e 69 71  by the OP_IsUniq
135d0 75 65 20 6f 70 63 6f 64 65 20 77 65 72 65 20 61  ue opcode were a
135e0 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20  llocated.    ** 
135f0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 47 65 74  using sqlite3Get
13600 54 65 6d 70 52 61 6e 67 65 28 29 20 69 6e 73 69  TempRange() insi
13610 64 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  de of the sqlite
13620 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
13630 79 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  y().    ** call 
13640 61 62 6f 76 65 2e 20 4a 75 73 74 20 62 65 66 6f  above. Just befo
13650 72 65 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  re that function
13660 20 77 61 73 20 66 72 65 65 64 20 74 68 65 79 20   was freed they 
13670 77 65 72 65 20 72 65 6c 65 61 73 65 64 0a 20 20  were released.  
13680 20 20 2a 2a 20 28 6d 61 64 65 20 61 76 61 69 6c    ** (made avail
13690 61 62 6c 65 20 74 6f 20 74 68 65 20 63 6f 6d 70  able to the comp
136a0 69 6c 65 72 20 66 6f 72 20 72 65 75 73 65 29 20  iler for reuse) 
136b0 75 73 69 6e 67 20 0a 20 20 20 20 2a 2a 20 73 71  using .    ** sq
136c0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
136d0 52 61 6e 67 65 28 29 2e 20 53 6f 20 69 6e 20 73  Range(). So in s
136e0 6f 6d 65 20 77 61 79 73 20 68 61 76 69 6e 67 20  ome ways having 
136f0 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 0a  the OP_IsUnique.
13700 20 20 20 20 2a 2a 20 6f 70 63 6f 64 65 20 75 73      ** opcode us
13710 65 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  e the values sto
13720 72 65 64 20 77 69 74 68 69 6e 20 73 65 65 6d 73  red within seems
13730 20 64 61 6e 67 65 72 6f 75 73 2e 20 48 6f 77 65   dangerous. Howe
13740 76 65 72 2c 20 73 69 6e 63 65 0a 20 20 20 20 2a  ver, since.    *
13750 2a 20 77 65 20 63 61 6e 20 62 65 20 73 75 72 65  * we can be sure
13760 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 74   that no other t
13770 65 6d 70 20 72 65 67 69 73 74 65 72 73 20 68 61  emp registers ha
13780 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ve been allocate
13790 64 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 73  d.    ** since s
137a0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
137b0 70 52 61 6e 67 65 28 29 20 77 61 73 20 63 61 6c  pRange() was cal
137c0 6c 65 64 2c 20 69 74 20 69 73 20 73 61 66 65 20  led, it is safe 
137d0 74 6f 20 64 6f 20 73 6f 2e 0a 20 20 20 20 2a 2f  to do so..    */
137e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
137f0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 73 55  AddOp4(v, OP_IsU
13800 6e 69 71 75 65 2c 20 69 49 64 78 2c 20 6a 32 2c  nique, iIdx, j2,
13810 20 72 65 67 52 6f 77 69 64 2c 20 70 52 65 67 4b   regRowid, pRegK
13820 65 79 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20  ey, P4_INT32);. 
13830 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f     sqlite3HaltCo
13840 6e 73 74 72 61 69 6e 74 28 0a 20 20 20 20 20 20  nstraint(.      
13850 20 20 70 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f    pParse, OE_Abo
13860 72 74 2c 20 22 69 6e 64 65 78 65 64 20 63 6f 6c  rt, "indexed col
13870 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69  umns are not uni
13880 71 75 65 22 2c 20 50 34 5f 53 54 41 54 49 43 29  que", P4_STATIC)
13890 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
138a0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
138b0 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c  IdxInsert, iIdx,
138c0 20 72 65 67 52 65 63 6f 72 64 2c 20 30 29 3b 0a   regRecord, 0);.
138d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
138e0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
138f0 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
13900 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
13910 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
13920 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64  Parse, regRecord
13930 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
13940 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
13950 74 65 72 4e 65 78 74 2c 20 69 53 6f 72 74 65 72  terNext, iSorter
13960 2c 20 61 64 64 72 32 29 3b 0a 20 20 73 71 6c 69  , addr2);.  sqli
13970 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
13980 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 73 71  v, addr1);..  sq
13990 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
139a0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61  v, OP_Close, iTa
139b0 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b);.  sqlite3Vdb
139c0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
139d0 6f 73 65 2c 20 69 49 64 78 29 3b 0a 20 20 73 71  ose, iIdx);.  sq
139e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
139f0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 6f  v, OP_Close, iSo
13a00 72 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rter);.}../*.** 
13a10 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64  Create a new ind
13a20 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61  ex for an SQL ta
13a30 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61  ble.  pName1.pNa
13a40 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20  me2 is the name 
13a50 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a  of the index .**
13a60 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73   and pTblList is
13a70 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
13a80 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
13a90 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42  o be indexed.  B
13aa0 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20  oth will .** be 
13ab0 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61  NULL for a prima
13ac0 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64  ry key or an ind
13ad0 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74  ex that is creat
13ae0 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a  ed to satisfy a.
13af0 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  ** UNIQUE constr
13b00 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65  aint.  If pTable
13b10 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20   and pIndex are 
13b20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65  NULL, use pParse
13b30 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61  ->pNewTable.** a
13b40 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  s the table to b
13b50 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72  e indexed.  pPar
13b60 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73  se->pNewTable is
13b70 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73   a table that is
13b80 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65  .** currently be
13b90 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
13ba0 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  by a CREATE TABL
13bb0 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
13bc0 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  ** pList is a li
13bd0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
13be0 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c   be indexed.  pL
13bf0 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ist will be NULL
13c00 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61   if this.** is a
13c10 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
13c20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e  unique-constrain
13c30 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  t on the most re
13c40 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  cent column adde
13c50 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c  d.** to the tabl
13c60 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
13c70 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
13c80 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69   .**.** If the i
13c90 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20  ndex is created 
13ca0 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 72 65  successfully, re
13cb0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
13cc0 6f 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 0a  o the new Index.
13cd0 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 54 68  ** structure. Th
13ce0 69 73 20 69 73 20 75 73 65 64 20 62 79 20 73 71  is is used by sq
13cf0 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b  lite3AddPrimaryK
13d00 65 79 28 29 20 74 6f 20 6d 61 72 6b 20 74 68 65  ey() to mark the
13d10 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 74 68 65   index.** as the
13d20 20 74 61 62 6c 65 73 20 70 72 69 6d 61 72 79 20   tables primary 
13d30 6b 65 79 20 28 49 6e 64 65 78 2e 61 75 74 6f 49  key (Index.autoI
13d40 6e 64 65 78 3d 3d 32 29 2e 0a 2a 2f 0a 49 6e 64  ndex==2)..*/.Ind
13d50 65 78 20 2a 73 71 6c 69 74 65 33 43 72 65 61 74  ex *sqlite3Creat
13d60 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  eIndex(.  Parse 
13d70 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
13d80 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  All information 
13d90 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65  about this parse
13da0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
13db0 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73  me1,     /* Firs
13dc0 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20  t part of index 
13dd0 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c  name. May be NUL
13de0 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  L */.  Token *pN
13df0 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63  ame2,     /* Sec
13e00 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65  ond part of inde
13e10 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
13e20 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ULL */.  SrcList
13e30 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54   *pTblName, /* T
13e40 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55  able to index. U
13e50 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
13e60 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45  able if 0 */.  E
13e70 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
13e80 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63    /* A list of c
13e90 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
13ea0 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
13eb0 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20  Error,       /* 
13ec0 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e  OE_Abort, OE_Ign
13ed0 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c  ore, OE_Replace,
13ee0 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20   or OE_None */. 
13ef0 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20   Token *pStart, 
13f00 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
13f10 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
13f20 69 6e 73 20 74 68 69 73 20 73 74 61 74 65 6d 65  ins this stateme
13f30 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nt */.  Token *p
13f40 45 6e 64 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  End,       /* Th
13f50 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65  e ")" that close
13f60 73 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44  s the CREATE IND
13f70 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EX statement */.
13f80 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c    int sortOrder,
13f90 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64       /* Sort ord
13fa0 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65  er of primary ke
13fb0 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55  y when pList==NU
13fc0 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f  LL */.  int ifNo
13fd0 74 45 78 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d  tExist     /* Om
13fe0 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65  it error if inde
13ff0 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
14000 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
14010 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a  pRet = 0;     /*
14020 20 50 6f 69 6e 74 65 72 20 74 6f 20 72 65 74 75   Pointer to retu
14030 72 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  rn */.  Table *p
14040 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Tab = 0;     /* 
14050 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  Table to be inde
14060 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  xed */.  Index *
14070 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a  pIndex = 0;   /*
14080 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
14090 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68   created */.  ch
140a0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20  ar *zName = 0;  
140b0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
140c0 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  e index */.  int
140d0 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
140e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
140f0 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61  haracters in zNa
14100 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  me */.  int i, j
14110 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64  ;.  Token nullId
14120 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65  ;        /* Fake
14130 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d   token for an em
14140 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20  pty ID list */. 
14150 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20   DbFixer sFix;  
14160 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73        /* For ass
14170 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20  igning database 
14180 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20  names to pTable 
14190 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
141a0 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74  erMask;   /* 1 t
141b0 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20  o honor DESC in 
141c0 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e  index.  0 to ign
141d0 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ore. */.  sqlite
141e0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
141f0 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  db;.  Db *pDb;  
14200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
14210 65 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65  e specific table
14220 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
14230 69 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65  indexed database
14240 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
14250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
14260 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
14270 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e  ase that is bein
14280 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54  g written */.  T
14290 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b  oken *pName = 0;
142a0 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
142b0 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  ed name of the i
142c0 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a  ndex to create *
142d0 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  /.  struct ExprL
142e0 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49  ist_item *pListI
142f0 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  tem; /* For loop
14300 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a  ing over pList *
14310 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20  /.  int nCol;.  
14320 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a  int nExtra = 0;.
14330 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a    char *zExtra;.
14340 0a 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72  .  assert( pStar
14350 74 3d 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30 20  t==0 || pEnd!=0 
14360 29 3b 20 2f 2a 20 70 45 6e 64 20 6d 75 73 74 20  ); /* pEnd must 
14370 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 70  be non-NULL if p
14380 53 74 61 72 74 20 69 73 20 2a 2f 0a 20 20 61 73  Start is */.  as
14390 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
143a0 72 72 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  rr==0 );      /*
143b0 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   Never called wi
143c0 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20  th prior errors 
143d0 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
143e0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49 4e 5f  locFailed || IN_
143f0 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a  DECLARE_VTAB ){.
14400 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
14410 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
14420 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
14430 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
14440 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
14450 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
14460 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20  te_index;.  }.. 
14470 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
14480 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
14490 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
144a0 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20  Return early if 
144b0 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a  not found..  */.
144c0 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d    if( pTblName!=
144d0 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65  0 ){..    /* Use
144e0 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e   the two-part in
144f0 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  dex name to dete
14500 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61  rmine the databa
14510 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65  se .    ** to se
14520 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62  arch for the tab
14530 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61  le. 'Fix' the ta
14540 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73  ble name to this
14550 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72   db.    ** befor
14560 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65  e looking up the
14570 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20   table..    */. 
14580 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
14590 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20  1 && pName2 );. 
145a0 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
145b0 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
145c0 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
145d0 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20  e2, &pName);.   
145e0 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74   if( iDb<0 ) got
145f0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
14600 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dex;.    assert(
14610 20 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65 2d   pName && pName-
14620 3e 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  >z );..#ifndef S
14630 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44  QLITE_OMIT_TEMPD
14640 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  B.    /* If the 
14650 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75  index name was u
14660 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63  nqualified, chec
14670 6b 20 69 66 20 74 68 65 20 74 68 65 20 74 61 62  k if the the tab
14680 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74  le.    ** is a t
14690 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f  emp table. If so
146a0 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
146b0 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20  se to 1. Do not 
146c0 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  do this.    ** i
146d0 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20 61  f initialising a
146e0 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
146f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
14700 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
14710 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
14720 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f  sqlite3SrcListLo
14730 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 62  okup(pParse, pTb
14740 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  lName);.      if
14750 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26  ( pName2->n==0 &
14760 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e  & pTab && pTab->
14770 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62  pSchema==db->aDb
14780 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20  [1].pSchema ){. 
14790 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a         iDb = 1;.
147a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
147b0 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 73 71  ndif..    if( sq
147c0 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
147d0 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c  ix, pParse, iDb,
147e0 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29   "index", pName)
147f0 20 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69   &&.        sqli
14800 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73  te3FixSrcList(&s
14810 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20  Fix, pTblName). 
14820 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42     ){.      /* B
14830 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65  ecause the parse
14840 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62  r constructs pTb
14850 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e  lName from a sin
14860 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a  gle identifier,.
14870 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
14880 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e  FixSrcList can n
14890 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20  ever fail. */.  
148a0 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
148b0 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20     }.    pTab = 
148c0 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
148d0 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54  le(pParse, 0, pT
148e0 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61  blName->a[0].zNa
148f0 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62  me, .        pTb
14900 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  lName->a[0].zDat
14910 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20  abase);.    if( 
14920 21 70 54 61 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c  !pTab || db->mal
14930 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
14940 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
14950 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
14960 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
14970 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
14980 65 6d 61 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ema );.  }else{.
14990 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
149a0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
149b0 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20 29 3b  rt( pStart==0 );
149c0 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50 61 72  .    pTab = pPar
149d0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
149e0 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67     if( !pTab ) g
149f0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
14a00 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20 3d  index;.    iDb =
14a10 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
14a20 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
14a30 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20  pSchema);.  }.  
14a40 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
14a50 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Db];..  assert( 
14a60 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  pTab!=0 );.  ass
14a70 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
14a80 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71  r==0 );.  if( sq
14a90 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54  lite3StrNICmp(pT
14aa0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ab->zName, "sqli
14ab0 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20  te_", 7)==0 .   
14ac0 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 26 70      && memcmp(&p
14ad0 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61  Tab->zName[7],"a
14ae0 6c 74 65 72 74 61 62 5f 22 2c 39 29 21 3d 30 20  ltertab_",9)!=0 
14af0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
14b00 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
14b10 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
14b20 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54   be indexed", pT
14b30 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
14b40 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
14b50 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e  _index;.  }.#ifn
14b60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14b70 56 49 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d  VIEW.  if( pTab-
14b80 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
14b90 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14ba0 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d  pParse, "views m
14bb0 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
14bc0 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
14bd0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
14be0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e  .  }.#endif.#ifn
14bf0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14c00 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
14c10 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
14c20 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
14c30 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14c40 2c 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65  , "virtual table
14c50 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
14c60 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
14c70 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
14c80 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ex;.  }.#endif..
14c90 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
14ca0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
14cb0 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65  ndex.  Make sure
14cc0 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c   there is not al
14cd0 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20  ready another.  
14ce0 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
14cf0 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
14d00 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  name.  .  **.  *
14d10 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66  * Exception:  If
14d20 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
14d30 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72  the names of per
14d40 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66  manent indices f
14d50 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  rom the.  ** sql
14d60 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
14d70 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f   (because some o
14d80 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61  ther process cha
14d90 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29  nged the schema)
14da0 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66   and.  ** one of
14db0 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73   the index names
14dc0 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74   collides with t
14dd0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d  he name of a tem
14de0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a  porary table or.
14df0 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e    ** index, then
14e00 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
14e10 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69  e to process thi
14e20 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20  s index..  **.  
14e30 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69  ** If pName==0 i
14e40 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
14e50 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67  are.  ** dealing
14e60 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20   with a primary 
14e70 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  key or UNIQUE co
14e80 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61  nstraint.  We ha
14e90 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72  ve to invent our
14ea0 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a  .  ** own name..
14eb0 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65    */.  if( pName
14ec0 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
14ed0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
14ee0 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
14ef0 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
14f00 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
14f10 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
14f20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 7a  assert( pName->z
14f30 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 53  !=0 );.    if( S
14f40 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
14f50 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
14f60 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20  (pParse, zName) 
14f70 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
14f80 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
14f90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
14fa0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
14fb0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
14fc0 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
14fd0 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a  zName, 0)!=0 ){.
14fe0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
14ff0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
15000 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
15010 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  y a table named 
15020 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
15030 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
15040 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
15050 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
15060 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  f( sqlite3FindIn
15070 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70  dex(db, zName, p
15080 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  Db->zName)!=0 ){
15090 0a 20 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f  .      if( !ifNo
150a0 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20  tExist ){.      
150b0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
150c0 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
150d0 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73   %s already exis
150e0 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ts", zName);.   
150f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15100 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69    assert( !db->i
15110 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20  nit.busy );.    
15120 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
15130 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
15140 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
15150 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  }.      goto exi
15160 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
15170 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
15180 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e     int n;.    In
15190 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20  dex *pLoop;.    
151a0 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e  for(pLoop=pTab->
151b0 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f  pIndex, n=1; pLo
151c0 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
151d0 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20  >pNext, n++){}. 
151e0 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
151f0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73  e3MPrintf(db, "s
15200 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
15210 25 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s_%d", pTab->zN
15220 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28  ame, n);.    if(
15230 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
15240 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
15250 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
15260 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
15270 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69   for authorizati
15280 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  on to create an 
15290 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e  index..  */.#ifn
152a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
152b0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
152c0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
152d0 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61   *zDb = pDb->zNa
152e0 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
152f0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
15300 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
15310 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
15320 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29  (iDb), 0, zDb) )
15330 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
15340 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
15350 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51      }.    i = SQ
15360 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45  LITE_CREATE_INDE
15370 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54  X;.    if( !OMIT
15380 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
15390 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43  1 ) i = SQLITE_C
153a0 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
153b0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
153c0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
153d0 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61  e, i, zName, pTa
153e0 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
153f0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
15400 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
15410 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
15420 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d  ..  /* If pList=
15430 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69  =0, it means thi
15440 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
15450 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70  lled to make a p
15460 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20  rimary.  ** key 
15470 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20  out of the last 
15480 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20  column added to 
15490 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
154a0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20  construction..  
154b0 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66  ** So create a f
154c0 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75  ake list to simu
154d0 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a  late this..  */.
154e0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
154f0 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d  {.    nullId.z =
15500 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62   pTab->aCol[pTab
15510 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b  ->nCol-1].zName;
15520 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20  .    nullId.n = 
15530 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
15540 28 63 68 61 72 2a 29 6e 75 6c 6c 49 64 2e 7a 29  (char*)nullId.z)
15550 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  ;.    pList = sq
15560 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
15570 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30  end(pParse, 0, 0
15580 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
15590 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
155a0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
155b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
155c0 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  tSetName(pParse,
155d0 20 70 4c 69 73 74 2c 20 26 6e 75 6c 6c 49 64 2c   pList, &nullId,
155e0 20 30 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e   0);.    pList->
155f0 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  a[0].sortOrder =
15600 20 28 75 38 29 73 6f 72 74 4f 72 64 65 72 3b 0a   (u8)sortOrder;.
15610 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65    }..  /* Figure
15620 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79   out how many by
15630 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 72 65  tes of space are
15640 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
15650 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20  re explicitly.  
15660 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c  ** specified col
15670 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
15680 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  names..  */.  fo
15690 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
156a0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
156b0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
156c0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
156d0 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 20  ;.    if( pExpr 
156e0 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
156f0 20 2a 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d   *pColl = pExpr-
15700 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 2f 2a  >pColl;.      /*
15710 20 45 69 74 68 65 72 20 70 43 6f 6c 6c 21 3d 30   Either pColl!=0
15720 20 6f 72 20 74 68 65 72 65 20 77 61 73 20 61 6e   or there was an
15730 20 4f 4f 4d 20 66 61 69 6c 75 72 65 2e 20 20 42   OOM failure.  B
15740 75 74 20 69 66 20 61 6e 20 4f 4f 4d 0a 20 20 20  ut if an OOM.   
15750 20 20 20 2a 2a 20 66 61 69 6c 75 72 65 20 77 65     ** failure we
15760 20 68 61 76 65 20 71 75 69 74 20 62 65 66 6f 72   have quit befor
15770 65 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20  e reaching this 
15780 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  point. */.      
15790 69 66 28 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c  if( ALWAYS(pColl
157a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 78  ) ){.        nEx
157b0 74 72 61 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69  tra += (1 + sqli
157c0 74 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c  te3Strlen30(pCol
157d0 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  l->zName));.    
157e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
157f0 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61   /* .  ** Alloca
15800 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72  te the index str
15810 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20  ucture. .  */.  
15820 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
15830 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
15840 20 20 6e 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e    nCol = pList->
15850 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 20  nExpr;.  pIndex 
15860 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
15870 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20 20 20  cZero(db, .     
15880 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 49   ROUND8(sizeof(I
15890 6e 64 65 78 29 29 20 2b 20 20 20 20 20 20 20 20  ndex)) +        
158a0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
158b0 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20 20 20  tructure  */.   
158c0 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
158d0 28 74 52 6f 77 63 6e 74 29 2a 28 6e 43 6f 6c 2b  (tRowcnt)*(nCol+
158e0 31 29 29 20 2b 20 20 20 2f 2a 20 49 6e 64 65 78  1)) +   /* Index
158f0 2e 61 69 52 6f 77 45 73 74 20 20 20 2a 2f 0a 20  .aiRowEst   */. 
15900 20 20 20 20 20 73 69 7a 65 6f 66 28 63 68 61 72       sizeof(char
15910 20 2a 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20   *)*nCol +      
15920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
15930 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f  ex.azColl     */
15940 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e  .      sizeof(in
15950 74 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20  t)*nCol +       
15960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
15970 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20  ndex.aiColumn   
15980 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
15990 75 38 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20  u8)*nCol +      
159a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
159b0 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65   Index.aSortOrde
159c0 72 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 61 6d 65  r */.      nName
159d0 20 2b 20 31 20 2b 20 20 20 20 20 20 20 20 20 20   + 1 +          
159e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159f0 2f 2a 20 49 6e 64 65 78 2e 7a 4e 61 6d 65 20 20  /* Index.zName  
15a00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6e 45 78      */.      nEx
15a10 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20  tra             
15a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a30 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73    /* Collation s
15a40 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 20 2a 2f  equence names */
15a50 0a 20 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  .  );.  if( db->
15a60 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
15a70 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
15a80 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
15a90 20 20 7a 45 78 74 72 61 20 3d 20 28 63 68 61 72    zExtra = (char
15aa0 2a 29 70 49 6e 64 65 78 3b 0a 20 20 70 49 6e 64  *)pIndex;.  pInd
15ab0 65 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20 28  ex->aiRowEst = (
15ac0 74 52 6f 77 63 6e 74 2a 29 26 7a 45 78 74 72 61  tRowcnt*)&zExtra
15ad0 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 49  [ROUND8(sizeof(I
15ae0 6e 64 65 78 29 29 5d 3b 0a 20 20 70 49 6e 64 65  ndex))];.  pInde
15af0 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61  x->azColl = (cha
15b00 72 2a 2a 29 0a 20 20 20 20 20 28 28 63 68 61 72  r**).     ((char
15b10 2a 29 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45  *)pIndex->aiRowE
15b20 73 74 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65  st + ROUND8(size
15b30 6f 66 28 74 52 6f 77 63 6e 74 29 2a 6e 43 6f 6c  of(tRowcnt)*nCol
15b40 2b 31 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  +1));.  assert( 
15b50 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
15b60 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 69 52  MENT(pIndex->aiR
15b70 6f 77 45 73 74 29 20 29 3b 0a 20 20 61 73 73 65  owEst) );.  asse
15b80 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
15b90 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d  LIGNMENT(pIndex-
15ba0 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20 20 70 49  >azColl) );.  pI
15bb0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  ndex->aiColumn =
15bc0 20 28 69 6e 74 20 2a 29 28 26 70 49 6e 64 65 78   (int *)(&pIndex
15bd0 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b  ->azColl[nCol]);
15be0 0a 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74  .  pIndex->aSort
15bf0 4f 72 64 65 72 20 3d 20 28 75 38 20 2a 29 28 26  Order = (u8 *)(&
15c00 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
15c10 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65  [nCol]);.  pInde
15c20 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  x->zName = (char
15c30 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 53 6f   *)(&pIndex->aSo
15c40 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 29 3b 0a  rtOrder[nCol]);.
15c50 20 20 7a 45 78 74 72 61 20 3d 20 28 63 68 61 72    zExtra = (char
15c60 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 7a 4e 61   *)(&pIndex->zNa
15c70 6d 65 5b 6e 4e 61 6d 65 2b 31 5d 29 3b 0a 20 20  me[nName+1]);.  
15c80 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a  memcpy(pIndex->z
15c90 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Name, zName, nNa
15ca0 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d  me+1);.  pIndex-
15cb0 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a  >pTable = pTab;.
15cc0 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d    pIndex->nColum
15cd0 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
15ce0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ;.  pIndex->onEr
15cf0 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f  ror = (u8)onErro
15d00 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74  r;.  pIndex->aut
15d10 6f 49 6e 64 65 78 20 3d 20 28 75 38 29 28 70 4e  oIndex = (u8)(pN
15d20 61 6d 65 3d 3d 30 29 3b 0a 20 20 70 49 6e 64 65  ame==0);.  pInde
15d30 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  x->pSchema = db-
15d40 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
15d50 61 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  a;.  assert( sql
15d60 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
15d70 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
15d80 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
15d90 6f 20 73 65 65 20 69 66 20 77 65 20 73 68 6f 75  o see if we shou
15da0 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65  ld honor DESC re
15db0 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20  quests on index 
15dc0 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69  columns.  */.  i
15dd0 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  f( pDb->pSchema-
15de0 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20  >file_format>=4 
15df0 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72  ){.    sortOrder
15e00 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20  Mask = -1;   /* 
15e10 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20  Honor DESC */.  
15e20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f  }else{.    sortO
15e30 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20  rderMask = 0;   
15e40 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20   /* Ignore DESC 
15e50 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61  */.  }..  /* Sca
15e60 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  n the names of t
15e70 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
15e80 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
15e90 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c  dexed and.  ** l
15ea0 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  oad the column i
15eb0 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20  ndices into the 
15ec0 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  Index structure.
15ed0 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f    Report an erro
15ee0 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f  r.  ** if any co
15ef0 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e  lumn is not foun
15f00 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44  d..  **.  ** TOD
15f10 4f 3a 20 20 41 64 64 20 61 20 74 65 73 74 20 74  O:  Add a test t
15f20 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
15f30 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e   the same column
15f40 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64 0a 20 20   is not named.  
15f50 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63  ** more than onc
15f60 65 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  e within the sam
15f70 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74  e index.  Only t
15f80 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63  he first instanc
15f90 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f  e of.  ** the co
15fa0 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72 20 62  lumn will ever b
15fb0 65 20 75 73 65 64 20 62 79 20 74 68 65 20 6f 70  e used by the op
15fc0 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65 20 74  timizer.  Note t
15fd0 68 61 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20  hat using the.  
15fe0 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 6d  ** same column m
15ff0 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 63 61  ore than once ca
16000 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72 72 6f 72  nnot be an error
16010 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
16020 75 6c 64 20 0a 20 20 2a 2a 20 62 72 65 61 6b 20  uld .  ** break 
16030 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
16040 69 62 69 6c 69 74 79 20 2d 20 69 74 20 6e 65 65  ibility - it nee
16050 64 73 20 74 6f 20 62 65 20 61 20 77 61 72 6e 69  ds to be a warni
16060 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ng..  */.  for(i
16070 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c  =0, pListItem=pL
16080 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
16090 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69  >nExpr; i++, pLi
160a0 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63  stItem++){.    c
160b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e  onst char *zColN
160c0 61 6d 65 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d  ame = pListItem-
160d0 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 75  >zName;.    Colu
160e0 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 20  mn *pTabCol;.   
160f0 20 69 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f   int requestedSo
16100 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 63 68 61  rtOrder;.    cha
16110 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20  r *zColl;       
16120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
16130 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
16140 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 66  e name */..    f
16150 6f 72 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d  or(j=0, pTabCol=
16160 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54  pTab->aCol; j<pT
16170 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70  ab->nCol; j++, p
16180 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  TabCol++){.     
16190 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
161a0 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54  Cmp(zColName, pT
161b0 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30  abCol->zName)==0
161c0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
161d0 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d      if( j>=pTab-
161e0 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  >nCol ){.      s
161f0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
16200 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
16210 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e   has no column n
16220 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20  amed %s",.      
16230 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a    pTab->zName, z
16240 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ColName);.      
16250 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
16260 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 67  ema = 1;.      g
16270 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
16280 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
16290 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
162a0 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 2f 2a  n[i] = j;.    /*
162b0 20 4a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 6f   Justification o
162c0 66 20 74 68 65 20 41 4c 57 41 59 53 28 70 4c 69  f the ALWAYS(pLi
162d0 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70  stItem->pExpr->p
162e0 43 6f 6c 6c 29 3a 20 20 42 65 63 61 75 73 65 20  Coll):  Because 
162f0 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 77 61  of.    ** the wa
16300 79 20 74 68 65 20 22 69 64 78 6c 69 73 74 22 20  y the "idxlist" 
16310 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 69 73 20  non-terminal is 
16320 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74  constructed by t
16330 68 65 20 70 61 72 73 65 72 2c 0a 20 20 20 20 2a  he parser,.    *
16340 2a 20 69 66 20 70 4c 69 73 74 49 74 65 6d 2d 3e  * if pListItem->
16350 70 45 78 70 72 20 69 73 20 6e 6f 74 20 6e 75 6c  pExpr is not nul
16360 6c 20 74 68 65 6e 20 65 69 74 68 65 72 20 70 4c  l then either pL
16370 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
16380 70 43 6f 6c 6c 0a 20 20 20 20 2a 2a 20 6d 75 73  pColl.    ** mus
16390 74 20 65 78 69 73 74 20 6f 72 20 65 6c 73 65 20  t exist or else 
163a0 74 68 65 72 65 20 6d 75 73 74 20 68 61 76 65 20  there must have 
163b0 62 65 65 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  been an OOM erro
163c0 72 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65  r.  But if there
163d0 0a 20 20 20 20 2a 2a 20 77 61 73 20 61 6e 20 4f  .    ** was an O
163e0 4f 4d 20 65 72 72 6f 72 2c 20 77 65 20 77 6f 75  OM error, we wou
163f0 6c 64 20 6e 65 76 65 72 20 72 65 61 63 68 20 74  ld never reach t
16400 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20  his point. */.  
16410 20 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d    if( pListItem-
16420 3e 70 45 78 70 72 20 26 26 20 41 4c 57 41 59 53  >pExpr && ALWAYS
16430 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70  (pListItem->pExp
16440 72 2d 3e 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  r->pColl) ){.   
16450 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20     int nColl;.  
16460 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73      zColl = pLis
16470 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43  tItem->pExpr->pC
16480 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  oll->zName;.    
16490 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    nColl = sqlite
164a0 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29  3Strlen30(zColl)
164b0 20 2b 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   + 1;.      asse
164c0 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c  rt( nExtra>=nCol
164d0 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  l );.      memcp
164e0 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c  y(zExtra, zColl,
164f0 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a   nColl);.      z
16500 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20  Coll = zExtra;. 
16510 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e       zExtra += n
16520 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74  Coll;.      nExt
16530 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20  ra -= nColl;.   
16540 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43   }else{.      zC
16550 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  oll = pTab->aCol
16560 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].zColl;.     
16570 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 7b 0a 20   if( !zColl ){. 
16580 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 64         zColl = d
16590 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 2d 3e 7a 4e  b->pDfltColl->zN
165a0 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
165b0 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e   }.    if( !db->
165c0 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73 71  init.busy && !sq
165d0 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
165e0 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  eq(pParse, zColl
165f0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
16600 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
16610 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  x;.    }.    pIn
16620 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d  dex->azColl[i] =
16630 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75   zColl;.    requ
16640 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d  estedSortOrder =
16650 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74   pListItem->sort
16660 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72 64 65  Order & sortOrde
16670 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65  rMask;.    pInde
16680 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
16690 20 3d 20 28 75 38 29 72 65 71 75 65 73 74 65 64   = (u8)requested
166a0 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 20  SortOrder;.  }. 
166b0 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52   sqlite3DefaultR
166c0 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 0a  owEst(pIndex);..
166d0 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72    if( pTab==pPar
166e0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b  se->pNewTable ){
166f0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  .    /* This rou
16700 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61  tine has been ca
16710 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
16720 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
16730 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65  x as a.    ** re
16740 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52  sult of a PRIMAR
16750 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
16760 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75  clause on a colu
16770 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f  mn definition, o
16780 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41  r.    ** a PRIMA
16790 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
167a0 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e   clause followin
167b0 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66  g the column def
167c0 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  initions..    **
167d0 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20   i.e. one of:.  
167e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41    **.    ** CREA
167f0 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52 49  TE TABLE t(x PRI
16800 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20  MARY KEY, y);.  
16810 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
16820 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45  E t(x, y, UNIQUE
16830 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a  (x, y));.    **.
16840 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61      ** Either wa
16850 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  y, check to see 
16860 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  if the table alr
16870 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61 6e  eady has such an
16880 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a   index. If.    *
16890 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68  * so, don't both
168a0 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69 73  er creating this
168b0 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20   one. This only 
168c0 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a  applies to.    *
168d0 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
168e0 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e  created indices.
168f0 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73   Users can do as
16900 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68 0a   they wish with.
16910 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20      ** explicit 
16920 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a  indices..    **.
16930 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55      ** Two UNIQU
16940 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59  E or PRIMARY KEY
16950 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
16960 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 69   considered equi
16970 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61  valent.    ** (a
16980 6e 64 20 74 68 75 73 20 73 75 70 70 72 65 73 73  nd thus suppress
16990 69 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  ing the second o
169a0 6e 65 29 20 65 76 65 6e 20 69 66 20 74 68 65 79  ne) even if they
169b0 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a   have different.
169c0 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65      ** sort orde
169d0 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rs..    **.    *
169e0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
169f0 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69  ifferent collati
16a00 6e 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20  ng sequences or 
16a10 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  if the columns o
16a20 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e  f.    ** the con
16a30 73 74 72 61 69 6e 74 20 6f 63 63 75 72 20 69 6e  straint occur in
16a40 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72   different order
16a50 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73  s, then the cons
16a60 74 72 61 69 6e 74 73 20 61 72 65 0a 20 20 20 20  traints are.    
16a70 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69  ** considered di
16a80 73 74 69 6e 63 74 20 61 6e 64 20 62 6f 74 68 20  stinct and both 
16a90 72 65 73 75 6c 74 20 69 6e 20 73 65 70 61 72 61  result in separa
16aa0 74 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  te indices..    
16ab0 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
16ac0 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
16ad0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
16ae0 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
16af0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
16b00 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t k;.      asser
16b10 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  t( pIdx->onError
16b20 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20  !=OE_None );.   
16b30 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
16b40 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20  >autoIndex );.  
16b50 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
16b60 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  ex->onError!=OE_
16b70 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20 69  None );..      i
16b80 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  f( pIdx->nColumn
16b90 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  !=pIndex->nColum
16ba0 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
16bb0 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
16bc0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b  Idx->nColumn; k+
16bd0 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
16be0 74 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20  t char *z1;.    
16bf0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
16c00 7a 32 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z2;.        if( 
16c10 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  pIdx->aiColumn[k
16c20 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  ]!=pIndex->aiCol
16c30 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a  umn[k] ) break;.
16c40 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 49 64          z1 = pId
16c50 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
16c60 20 20 20 20 20 20 7a 32 20 3d 20 70 49 6e 64 65        z2 = pInde
16c70 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
16c80 20 20 20 20 20 20 69 66 28 20 7a 31 21 3d 7a 32        if( z1!=z2
16c90 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
16ca0 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65  mp(z1, z2) ) bre
16cb0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
16cc0 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e    if( k==pIdx->n
16cd0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
16ce0 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
16cf0 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45  ror!=pIndex->onE
16d00 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rror ){.        
16d10 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72    /* This constr
16d20 61 69 6e 74 20 63 72 65 61 74 65 73 20 74 68 65  aint creates the
16d30 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61   same index as a
16d40 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
16d50 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
16d60 74 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65  t specified some
16d70 77 68 65 72 65 20 69 6e 20 74 68 65 20 43 52 45  where in the CRE
16d80 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
16d90 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ent..          *
16da0 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e  * However the ON
16db0 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
16dc0 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e  s are different.
16dd0 20 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20   If both this . 
16de0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
16df0 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70  traint and the p
16e00 72 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65  revious equivale
16e10 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  nt constraint ha
16e20 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20  ve explicit.    
16e30 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46        ** ON CONF
16e40 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74 68 69  LICT clauses thi
16e50 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f  s is an error. O
16e60 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68  therwise, use th
16e70 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  e.          ** e
16e80 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
16e90 69 65 64 20 62 65 68 61 76 69 6f 75 72 20 66 6f  ied behaviour fo
16ea0 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  r the index..   
16eb0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
16ec0 20 20 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e      if( !(pIdx->
16ed0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
16ee0 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f  ult || pIndex->o
16ef0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
16f00 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lt) ){.         
16f10 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
16f20 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
16f30 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e              "con
16f40 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46  flicting ON CONF
16f50 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73 70 65  LICT clauses spe
16f60 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20  cified", 0);.   
16f70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16f80 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45     if( pIdx->onE
16f90 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
16fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16fb0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20  pIdx->onError = 
16fc0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b  pIndex->onError;
16fd0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
16fe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
16ff0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
17000 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
17010 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c     }.  }..  /* L
17020 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65  ink the new Inde
17030 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  x structure to i
17040 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20  ts table and to 
17050 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69  the other.  ** i
17060 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
17070 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20  e structures. . 
17080 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
17090 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49  it.busy ){.    I
170a0 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 61 73 73  ndex *p;.    ass
170b0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
170c0 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
170d0 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  0, pIndex->pSche
170e0 6d 61 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73  ma) );.    p = s
170f0 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
17100 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  (&pIndex->pSchem
17110 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20  a->idxHash, .   
17120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17130 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
17140 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72  Name, sqlite3Str
17150 6c 65 6e 33 30 28 70 49 6e 64 65 78 2d 3e 7a 4e  len30(pIndex->zN
17160 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ame),.          
17170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17180 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28  pIndex);.    if(
17190 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65   p ){.      asse
171a0 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b  rt( p==pIndex );
171b0 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
171c0 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
171d0 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
171e0 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
171f0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
17200 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
17210 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
17220 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
17230 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70  anges;.    if( p
17240 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20  TblName!=0 ){.  
17250 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
17260 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54   = db->init.newT
17270 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  num;.    }.  }..
17280 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
17290 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 74  init.busy is 0 t
172a0 68 65 6e 20 63 72 65 61 74 65 20 74 68 65 20 69  hen create the i
172b0 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54  ndex on disk.  T
172c0 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65  his.  ** involve
172d0 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e  s writing the in
172e0 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73  dex into the mas
172f0 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69  ter table and fi
17300 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a  lling in the.  *
17310 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65  * index with the
17320 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63   current table c
17330 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20  ontents..  **.  
17340 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e  ** The db->init.
17350 62 75 73 79 20 69 73 20 30 20 77 68 65 6e 20 74  busy is 0 when t
17360 68 65 20 75 73 65 72 20 66 69 72 73 74 20 65 6e  he user first en
17370 74 65 72 73 20 61 20 43 52 45 41 54 45 20 49 4e  ters a CREATE IN
17380 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e  DEX .  ** comman
17390 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  d.  db->init.bus
173a0 79 20 69 73 20 31 20 77 68 65 6e 20 61 20 64 61  y is 1 when a da
173b0 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
173c0 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54   and .  ** CREAT
173d0 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
173e0 74 73 20 61 72 65 20 72 65 61 64 20 6f 75 74 20  ts are read out 
173f0 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  of the master ta
17400 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68  ble.  In.  ** th
17410 65 20 6c 61 74 74 65 72 20 63 61 73 65 20 74 68  e latter case th
17420 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
17430 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20  exists on disk, 
17440 77 68 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a  which is why.  *
17450 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20  * we don't want 
17460 74 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a  to recreate it..
17470 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62    **.  ** If pTb
17480 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  lName==0 it mean
17490 73 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  s this index is 
174a0 67 65 6e 65 72 61 74 65 64 20 61 73 20 61 20 70  generated as a p
174b0 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20  rimary key.  ** 
174c0 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
174d0 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45  aint of a CREATE
174e0 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
174f0 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62  .  Since the tab
17500 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74  le.  ** has just
17510 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69   been created, i
17520 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61  t contains no da
17530 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ta and the index
17540 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
17550 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65    ** step can be
17560 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20   skipped..  */. 
17570 20 65 6c 73 65 7b 20 2f 2a 20 69 66 28 20 64 62   else{ /* if( db
17580 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
17590 20 2a 2f 0a 20 20 20 20 56 64 62 65 20 2a 76 3b   */.    Vdbe *v;
175a0 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  .    char *zStmt
175b0 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d  ;.    int iMem =
175c0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
175d0 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
175e0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
175f0 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
17600 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
17610 65 5f 69 6e 64 65 78 3b 0a 0a 0a 20 20 20 20 2f  e_index;...    /
17620 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f  * Create the roo
17630 74 70 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e  tpage for the in
17640 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  dex.    */.    s
17650 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
17660 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
17670 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 1, iDb);.    s
17680 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17690 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64  (v, OP_CreateInd
176a0 65 78 2c 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a  ex, iDb, iMem);.
176b0 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74  .    /* Gather t
176c0 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
176d0 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49   of the CREATE I
176e0 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69  NDEX statement i
176f0 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a  nto.    ** the z
17700 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20  Stmt variable.  
17710 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74    */.    if( pSt
17720 61 72 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  art ){.      ass
17730 65 72 74 28 20 70 45 6e 64 21 3d 30 20 29 3b 0a  ert( pEnd!=0 );.
17740 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64        /* A named
17750 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65   index with an e
17760 78 70 6c 69 63 69 74 20 43 52 45 41 54 45 20 49  xplicit CREATE I
17770 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
17780 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  /.      zStmt = 
17790 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
177a0 62 2c 20 22 43 52 45 41 54 45 25 73 20 49 4e 44  b, "CREATE%s IND
177b0 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20  EX %.*s",.      
177c0 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f    onError==OE_No
177d0 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51  ne ? "" : " UNIQ
177e0 55 45 22 2c 0a 20 20 20 20 20 20 20 20 28 69 6e  UE",.        (in
177f0 74 29 28 70 45 6e 64 2d 3e 7a 20 2d 20 70 4e 61  t)(pEnd->z - pNa
17800 6d 65 2d 3e 7a 29 20 2b 20 31 2c 0a 20 20 20 20  me->z) + 1,.    
17810 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20      pName->z);. 
17820 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17830 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20  /* An automatic 
17840 69 6e 64 65 78 20 63 72 65 61 74 65 64 20 62 79  index created by
17850 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
17860 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
17870 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  int */.      /* 
17880 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
17890 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20  Printf(""); */. 
178a0 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a       zStmt = 0;.
178b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
178c0 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71  d an entry in sq
178d0 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20  lite_master for 
178e0 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20 2a  this index.    *
178f0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  /.    sqlite3Nes
17900 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
17910 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45 52   .        "INSER
17920 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c  T INTO %Q.%s VAL
17930 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25  UES('index',%Q,%
17940 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20  Q,#%d,%Q);",.   
17950 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
17960 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
17970 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20  TABLE(iDb),.    
17980 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
17990 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  e,.        pTab-
179a0 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
179b0 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53  iMem,.        zS
179c0 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  tmt.    );.    s
179d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
179e0 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a   zStmt);..    /*
179f0 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20   Fill the index 
17a00 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72 65  with data and re
17a10 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61  parse the schema
17a20 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70  . Code an OP_Exp
17a30 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e  ire.    ** to in
17a40 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65  validate all pre
17a50 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  -compiled statem
17a60 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ents..    */.   
17a70 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b   if( pTblName ){
17a80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
17a90 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
17aa0 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b  , pIndex, iMem);
17ab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68  .      sqlite3Ch
17ac0 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
17ad0 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  e, iDb);.      s
17ae0 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72  qlite3VdbeAddPar
17af0 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44  seSchemaOp(v, iD
17b00 62 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  b,.         sqli
17b10 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
17b20 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79  name='%q' AND ty
17b30 70 65 3d 27 69 6e 64 65 78 27 22 2c 20 70 49 6e  pe='index'", pIn
17b40 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  dex->zName));.  
17b50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17b60 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 78 70 69  ddOp1(v, OP_Expi
17b70 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  re, 0);.    }.  
17b80 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64  }..  /* When add
17b90 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ing an index to 
17ba0 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69  the list of indi
17bb0 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c  ces for a table,
17bc0 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20   make.  ** sure 
17bd0 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65  all indices labe
17be0 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63  led OE_Replace c
17bf0 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68  ome after all th
17c00 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a  ose labeled.  **
17c10 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69   OE_Ignore.  Thi
17c20 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66  s is necessary f
17c30 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 63  or the correct c
17c40 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b 0a  onstraint check.
17c50 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
17c60 28 69 6e 20 73 71 6c 69 74 65 33 47 65 6e 65 72  (in sqlite3Gener
17c70 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65  ateConstraintChe
17c80 63 6b 73 28 29 29 20 61 73 20 70 61 72 74 20 6f  cks()) as part o
17c90 66 0a 20 20 2a 2a 20 55 50 44 41 54 45 20 61 6e  f.  ** UPDATE an
17ca0 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  d INSERT stateme
17cb0 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66  nts.  .  */.  if
17cc0 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
17cd0 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29  || pTblName==0 )
17ce0 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f  {.    if( onErro
17cf0 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c  r!=OE_Replace ||
17d00 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30   pTab->pIndex==0
17d10 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61  .         || pTa
17d20 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  b->pIndex->onErr
17d30 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b  or==OE_Replace){
17d40 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
17d50 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e  Next = pTab->pIn
17d60 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  dex;.      pTab-
17d70 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
17d80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17d90 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72     Index *pOther
17da0 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
17db0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f  .      while( pO
17dc0 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70  ther->pNext && p
17dd0 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e  Other->pNext->on
17de0 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
17df0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74  e ){.        pOt
17e00 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  her = pOther->pN
17e10 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
17e20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
17e30 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
17e40 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e  ;.      pOther->
17e50 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a  pNext = pIndex;.
17e60 20 20 20 20 7d 0a 20 20 20 20 70 52 65 74 20 3d      }.    pRet =
17e70 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 49 6e   pIndex;.    pIn
17e80 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  dex = 0;.  }..  
17e90 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f  /* Clean up befo
17ea0 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78  re exiting */.ex
17eb0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a  it_create_index:
17ec0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b  .  if( pIndex ){
17ed0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
17ee0 65 65 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 7a  ee(db, pIndex->z
17ef0 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 73 71 6c  ColAff);.    sql
17f00 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
17f10 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71  Index);.  }.  sq
17f20 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
17f30 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
17f40 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
17f50 44 65 6c 65 74 65 28 64 62 2c 20 70 54 62 6c 4e  Delete(db, pTblN
17f60 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
17f70 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
17f80 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
17f90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74  .}../*.** Fill t
17fa0 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73  he Index.aiRowEs
17fb0 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 64  t[] array with d
17fc0 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69  efault informati
17fd0 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  on - information
17fe0 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77  .** to be used w
17ff0 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20  hen we have not 
18000 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20  run the ANALYZE 
18010 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61  command..**.** a
18020 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75  iRowEst[0] is su
18030 70 70 6f 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e  ppose to contain
18040 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
18050 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69  lements in the i
18060 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77  ndex..** Since w
18070 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67  e do not know, g
18080 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20  uess 1 million. 
18090 20 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20   aiRowEst[1] is 
180a0 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
180b0 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
180c0 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
180d0 65 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79  e that match any
180e0 20 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75   particular valu
180f0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73  e of the.** firs
18100 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
18110 69 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74  index.  aiRowEst
18120 5b 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61  [2] is an estima
18130 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
18140 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74  .** of rows that
18150 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69   match any parti
18160 63 75 6c 61 72 20 63 6f 6d 62 69 6e 69 61 74 69  cular combiniati
18170 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  on of the first 
18180 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20  2 columns.** of 
18190 74 68 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20  the index.  And 
181a0 73 6f 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75  so forth.  It mu
181b0 73 74 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  st always be the
181c0 20 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20   case that.*.** 
181d0 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45            aiRowE
181e0 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b  st[N]<=aiRowEst[
181f0 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20  N-1].**         
18200 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31    aiRowEst[N]>=1
18210 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f  .**.** Apart fro
18220 6d 20 74 68 61 74 2c 20 77 65 20 68 61 76 65 20  m that, we have 
18230 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20  little to go on 
18240 62 65 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f  besides intuitio
18250 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61  n as to.** how a
18260 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64  iRowEst[] should
18270 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
18280 20 20 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65    The numbers ge
18290 6e 65 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20  nerated here.** 
182a0 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70  are based on typ
182b0 69 63 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e  ical values foun
182c0 64 20 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69  d in actual indi
182d0 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ces..*/.void sql
182e0 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73  ite3DefaultRowEs
182f0 74 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  t(Index *pIdx){.
18300 20 20 74 52 6f 77 63 6e 74 20 2a 61 20 3d 20 70    tRowcnt *a = p
18310 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20  Idx->aiRowEst;. 
18320 20 69 6e 74 20 69 3b 0a 20 20 74 52 6f 77 63 6e   int i;.  tRowcn
18330 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 61  t n;.  assert( a
18340 21 3d 30 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20  !=0 );.  a[0] = 
18350 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52  pIdx->pTable->nR
18360 6f 77 45 73 74 3b 0a 20 20 69 66 28 20 61 5b 30  owEst;.  if( a[0
18370 5d 3c 31 30 20 29 20 61 5b 30 5d 20 3d 20 31 30  ]<10 ) a[0] = 10
18380 3b 0a 20 20 6e 20 3d 20 31 30 3b 0a 20 20 66 6f  ;.  n = 10;.  fo
18390 72 28 69 3d 31 3b 20 69 3c 3d 70 49 64 78 2d 3e  r(i=1; i<=pIdx->
183a0 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
183b0 20 20 20 61 5b 69 5d 20 3d 20 6e 3b 0a 20 20 20     a[i] = n;.   
183c0 20 69 66 28 20 6e 3e 35 20 29 20 6e 2d 2d 3b 0a   if( n>5 ) n--;.
183d0 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78 2d 3e    }.  if( pIdx->
183e0 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
183f0 20 29 7b 0a 20 20 20 20 61 5b 70 49 64 78 2d 3e   ){.    a[pIdx->
18400 6e 43 6f 6c 75 6d 6e 5d 20 3d 20 31 3b 0a 20 20  nColumn] = 1;.  
18410 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
18420 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f  routine will dro
18430 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61  p an existing na
18440 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73  med index.  This
18450 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c   routine.** impl
18460 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20  ements the DROP 
18470 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e  INDEX statement.
18480 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18490 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20  DropIndex(Parse 
184a0 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
184b0 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45   *pName, int ifE
184c0 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65 78 20  xists){.  Index 
184d0 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20  *pIndex;.  Vdbe 
184e0 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
184f0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
18500 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73    int iDb;..  as
18510 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
18520 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e 65  rr==0 );   /* Ne
18530 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ver called with 
18540 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a  prior errors */.
18550 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
18560 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
18570 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
18580 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ex;.  }.  assert
18590 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
185a0 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45   );.  if( SQLITE
185b0 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
185c0 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
185d0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
185e0 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
185f0 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
18600 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
18610 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pName->a[0].zNam
18620 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
18630 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28  Database);.  if(
18640 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20   pIndex==0 ){.  
18650 20 20 69 66 28 20 21 69 66 45 78 69 73 74 73 20    if( !ifExists 
18660 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18670 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
18680 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a   "no such index:
18690 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b   %S", pName, 0);
186a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
186b0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
186c0 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70  ifyNamedSchema(p
186d0 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  Parse, pName->a[
186e0 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
186f0 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
18700 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
18710 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
18720 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
18730 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75    if( pIndex->au
18740 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73  toIndex ){.    s
18750 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
18760 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73  Parse, "index as
18770 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e  sociated with UN
18780 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72  IQUE ".      "or
18790 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
187a0 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62  straint cannot b
187b0 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a  e dropped", 0);.
187c0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
187d0 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
187e0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
187f0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
18800 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b  Index->pSchema);
18810 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18820 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
18830 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
18840 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
18850 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62  P_INDEX;.    Tab
18860 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
18870 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63  x->pTable;.    c
18880 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
18890 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
188a0 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
188b0 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
188c0 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20  MA_TABLE(iDb);. 
188d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
188e0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
188f0 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
18900 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Tab, 0, zDb) ){.
18910 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
18920 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
18930 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  }.    if( !OMIT_
18940 54 45 4d 50 44 42 20 26 26 20 69 44 62 20 29 20  TEMPDB && iDb ) 
18950 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
18960 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  OP_TEMP_INDEX;. 
18970 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
18980 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
18990 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  code, pIndex->zN
189a0 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
189b0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
189c0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
189d0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
189e0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
189f0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
18a00 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61  move the index a
18a10 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  nd from the mast
18a20 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20  er table */.  v 
18a30 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
18a40 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
18a50 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
18a60 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
18a70 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
18a80 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
18a90 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
18aa0 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45  se,.       "DELE
18ab0 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
18ac0 45 52 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20  ERE name=%Q AND 
18ad0 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20  type='index'",. 
18ae0 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
18af0 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
18b00 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 49 6e  _TABLE(iDb), pIn
18b10 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  dex->zName.    )
18b20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65  ;.    sqlite3Cle
18b30 61 72 53 74 61 74 54 61 62 6c 65 73 28 70 50 61  arStatTables(pPa
18b40 72 73 65 2c 20 69 44 62 2c 20 22 69 64 78 22 2c  rse, iDb, "idx",
18b50 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b   pIndex->zName);
18b60 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
18b70 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
18b80 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72   iDb);.    destr
18b90 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
18ba0 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c  e, pIndex->tnum,
18bb0 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
18bc0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
18bd0 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44  OP_DropIndex, iD
18be0 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d  b, 0, 0, pIndex-
18bf0 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  >zName, 0);.  }.
18c00 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78  .exit_drop_index
18c10 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
18c20 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61  stDelete(db, pNa
18c30 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41  me);.}../*.** pA
18c40 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65  rray is a pointe
18c50 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  r to an array of
18c60 20 6f 62 6a 65 63 74 73 2e 20 20 45 61 63 68 20   objects.  Each 
18c70 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a  object in the.**
18c80 20 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72   array is szEntr
18c90 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  y bytes in size.
18ca0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
18cb0 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65 77 0a 2a  llocates a new.*
18cc0 2a 20 6f 62 6a 65 63 74 20 6f 6e 20 74 68 65 20  * object on the 
18cd0 65 6e 64 20 6f 66 20 74 68 65 20 61 72 72 61 79  end of the array
18ce0 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 45 6e 74 72 79  ..**.** *pnEntry
18cf0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
18d00 66 20 65 6e 74 72 69 65 73 20 61 6c 72 65 61 64  f entries alread
18d10 79 20 69 6e 20 75 73 65 2e 20 20 2a 70 6e 41 6c  y in use.  *pnAl
18d20 6c 6f 63 20 69 73 0a 2a 2a 20 74 68 65 20 70 72  loc is.** the pr
18d30 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
18d40 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  ed size of the a
18d50 72 72 61 79 2e 20 20 69 6e 69 74 53 69 7a 65 20  rray.  initSize 
18d60 69 73 20 74 68 65 0a 2a 2a 20 73 75 67 67 65 73  is the.** sugges
18d70 74 65 64 20 69 6e 69 74 69 61 6c 20 61 72 72 61  ted initial arra
18d80 79 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 69 6f  y size allocatio
18d90 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64  n..**.** The ind
18da0 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e  ex of the new en
18db0 74 72 79 20 69 73 20 72 65 74 75 72 6e 65 64 20  try is returned 
18dc0 69 6e 20 2a 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20  in *pIdx..**.** 
18dd0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
18de0 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
18df0 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f  o the array of o
18e00 62 6a 65 63 74 73 2e 20 20 54 68 69 73 0a 2a 2a  bjects.  This.**
18e10 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 73 61   might be the sa
18e20 6d 65 20 61 73 20 74 68 65 20 70 41 72 72 61 79  me as the pArray
18e30 20 70 61 72 61 6d 65 74 65 72 20 6f 72 20 69 74   parameter or it
18e40 20 6d 69 67 68 74 20 62 65 20 61 20 64 69 66 66   might be a diff
18e50 65 72 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74 65 72  erent.** pointer
18e60 20 69 66 20 74 68 65 20 61 72 72 61 79 20 77 61   if the array wa
18e70 73 20 72 65 73 69 7a 65 64 2e 0a 2a 2f 0a 76 6f  s resized..*/.vo
18e80 69 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79  id *sqlite3Array
18e90 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69  Allocate(.  sqli
18ea0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a  te3 *db,      /*
18eb0 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e   Connection to n
18ec0 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20  otify of malloc 
18ed0 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f  failures */.  vo
18ee0 69 64 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20  id *pArray,     
18ef0 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65  /* Array of obje
18f00 63 74 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72  cts.  Might be r
18f10 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20  eallocated */.  
18f20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20  int szEntry,    
18f30 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63    /* Size of eac
18f40 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20  h object in the 
18f50 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a  array */.  int *
18f60 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20  pnEntry,     /* 
18f70 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74  Number of object
18f80 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  s currently in u
18f90 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64  se */.  int *pId
18fa0 78 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  x         /* Wri
18fb0 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  te the index of 
18fc0 61 20 6e 65 77 20 73 6c 6f 74 20 68 65 72 65 20  a new slot here 
18fd0 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b  */.){.  char *z;
18fe0 0a 20 20 69 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e  .  int n = *pnEn
18ff0 74 72 79 3b 0a 20 20 69 66 28 20 28 6e 20 26 20  try;.  if( (n & 
19000 28 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20  (n-1))==0 ){.   
19010 20 69 6e 74 20 73 7a 20 3d 20 28 6e 3d 3d 30 29   int sz = (n==0)
19020 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20 20 20 20   ? 1 : 2*n;.    
19030 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 73 71 6c  void *pNew = sql
19040 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
19050 2c 20 70 41 72 72 61 79 2c 20 73 7a 2a 73 7a 45  , pArray, sz*szE
19060 6e 74 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70  ntry);.    if( p
19070 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
19080 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20  *pIdx = -1;.    
19090 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b    return pArray;
190a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72 72 61  .    }.    pArra
190b0 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  y = pNew;.  }.  
190c0 7a 20 3d 20 28 63 68 61 72 2a 29 70 41 72 72 61  z = (char*)pArra
190d0 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b 6e  y;.  memset(&z[n
190e0 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20   * szEntry], 0, 
190f0 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64  szEntry);.  *pId
19100 78 20 3d 20 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e  x = n;.  ++*pnEn
19110 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 41  try;.  return pA
19120 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rray;.}../*.** A
19130 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d  ppend a new elem
19140 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ent to the given
19150 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65   IdList.  Create
19160 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66   a new IdList if
19170 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a  .** need be..**.
19180 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20  ** A new IdList 
19190 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
191a0 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
191b0 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73   fails..*/.IdLis
191c0 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
191d0 41 70 70 65 6e 64 28 73 71 6c 69 74 65 33 20 2a  Append(sqlite3 *
191e0 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73  db, IdList *pLis
191f0 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
19200 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
19210 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
19220 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
19230 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
19240 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29  , sizeof(IdList)
19250 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
19260 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
19270 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20  .  }.  pList->a 
19280 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
19290 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 64 62  locate(.      db
192a0 2c 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61  ,.      pList->a
192b0 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  ,.      sizeof(p
192c0 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20  List->a[0]),.   
192d0 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a     &pList->nId,.
192e0 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
192f0 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73  if( i<0 ){.    s
19300 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
19310 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
19320 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
19330 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  .  pList->a[i].z
19340 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
19350 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
19360 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72  pToken);.  retur
19370 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
19380 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69  * Delete an IdLi
19390 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
193a0 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
193b0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c  sqlite3 *db, IdL
193c0 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
193d0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
193e0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
193f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
19400 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
19410 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
19420 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
19430 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zName);.  }.  sq
19440 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
19450 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c  pList->a);.  sql
19460 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
19470 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
19480 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
19490 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65   in pList of the
194a0 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65   identifier name
194b0 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d  d zId.  Return -
194c0 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e  1.** if not foun
194d0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
194e0 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c  3IdListIndex(IdL
194f0 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73  ist *pList, cons
19500 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
19510 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
19520 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
19530 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   -1;.  for(i=0; 
19540 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
19550 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
19560 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74  te3StrICmp(pList
19570 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e  ->a[i].zName, zN
19580 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
19590 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
195a0 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78   -1;.}../*.** Ex
195b0 70 61 6e 64 20 74 68 65 20 73 70 61 63 65 20 61  pand the space a
195c0 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
195d0 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 20 6f   given SrcList o
195e0 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63 72 65 61  bject by.** crea
195f0 74 69 6e 67 20 6e 45 78 74 72 61 20 6e 65 77 20  ting nExtra new 
19600 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67 20  slots beginning 
19610 61 74 20 69 53 74 61 72 74 2e 20 20 69 53 74 61  at iStart.  iSta
19620 72 74 20 69 73 20 7a 65 72 6f 20 62 61 73 65 64  rt is zero based
19630 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20 61  ..** New slots a
19640 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a  re zeroed..**.**
19650 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73 75   For example, su
19660 70 70 6f 73 65 20 61 20 53 72 63 4c 69 73 74 20  ppose a SrcList 
19670 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61 69  initially contai
19680 6e 73 20 74 77 6f 20 65 6e 74 72 69 65 73 3a 20  ns two entries: 
19690 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65 6e  A,B..** To appen
196a0 64 20 33 20 6e 65 77 20 65 6e 74 72 69 65 73 20  d 3 new entries 
196b0 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c 20 64 6f  onto the end, do
196c0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
196d0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
196e0 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 6c 69  large(db, pSrcli
196f0 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a  st, 3, 2);.**.**
19700 20 41 66 74 65 72 20 74 68 65 20 63 61 6c 6c 20   After the call 
19710 61 62 6f 76 65 20 69 74 20 77 6f 75 6c 64 20 63  above it would c
19720 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20 6e  ontain:  A, B, n
19730 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a  il, nil, nil..**
19740 20 49 66 20 74 68 65 20 69 53 74 61 72 74 20 61   If the iStart a
19750 72 67 75 6d 65 6e 74 20 68 61 64 20 62 65 65 6e  rgument had been
19760 20 31 20 69 6e 73 74 65 61 64 20 6f 66 20 32 2c   1 instead of 2,
19770 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
19780 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 62  .** would have b
19790 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e 69  een:  A, nil, ni
197a0 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20 70  l, nil, B.  To p
197b0 72 65 70 65 6e 64 20 74 68 65 20 6e 65 77 20 73  repend the new s
197c0 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53 74  lots,.** the iSt
197d0 61 72 74 20 76 61 6c 75 65 20 77 6f 75 6c 64 20  art value would 
197e0 62 65 20 30 2e 20 20 54 68 65 20 72 65 73 75 6c  be 0.  The resul
197f0 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20  t then would.** 
19800 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69  be: nil, nil, ni
19810 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49  l, A, B..**.** I
19820 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
19830 61 74 69 6f 6e 20 66 61 69 6c 73 20 74 68 65 20  ation fails the 
19840 53 72 63 4c 69 73 74 20 69 73 20 75 6e 63 68 61  SrcList is uncha
19850 6e 67 65 64 2e 20 20 54 68 65 0a 2a 2a 20 64 62  nged.  The.** db
19860 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
19870 6c 61 67 20 77 69 6c 6c 20 62 65 20 73 65 74 20  lag will be set 
19880 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c  to true..*/.SrcL
19890 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
198a0 69 73 74 45 6e 6c 61 72 67 65 28 0a 20 20 73 71  istEnlarge(.  sq
198b0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
198c0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
198d0 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66  nection to notif
198e0 79 20 6f 66 20 4f 4f 4d 20 65 72 72 6f 72 73 20  y of OOM errors 
198f0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
19900 72 63 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 53  rc,     /* The S
19910 72 63 4c 69 73 74 20 74 6f 20 62 65 20 65 6e 6c  rcList to be enl
19920 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  arged */.  int n
19930 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 2f 2a  Extra,        /*
19940 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 77 20 73   Number of new s
19950 6c 6f 74 73 20 74 6f 20 61 64 64 20 74 6f 20 70  lots to add to p
19960 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e  Src->a[] */.  in
19970 74 20 69 53 74 61 72 74 20 20 20 20 20 20 20 20  t iStart        
19980 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 53 72   /* Index in pSr
19990 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72 73 74 20  c->a[] of first 
199a0 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20  new slot */.){. 
199b0 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 61   int i;..  /* Sa
199c0 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
199d0 20 63 61 6c 6c 69 6e 67 20 70 61 72 61 6d 65 74   calling paramet
199e0 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ers */.  assert(
199f0 20 69 53 74 61 72 74 3e 3d 30 20 29 3b 0a 20 20   iStart>=0 );.  
19a00 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d  assert( nExtra>=
19a10 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
19a20 53 72 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Src!=0 );.  asse
19a30 72 74 28 20 69 53 74 61 72 74 3c 3d 70 53 72 63  rt( iStart<=pSrc
19a40 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20 20 2f 2a 20  ->nSrc );..  /* 
19a50 41 6c 6c 6f 63 61 74 65 20 61 64 64 69 74 69 6f  Allocate additio
19a60 6e 61 6c 20 73 70 61 63 65 20 69 66 20 6e 65 65  nal space if nee
19a70 64 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 53 72  ded */.  if( pSr
19a80 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70  c->nSrc+nExtra>p
19a90 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  Src->nAlloc ){. 
19aa0 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77     SrcList *pNew
19ab0 3b 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63  ;.    int nAlloc
19ac0 20 3d 20 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45   = pSrc->nSrc+nE
19ad0 78 74 72 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47  xtra;.    int nG
19ae0 6f 74 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73  ot;.    pNew = s
19af0 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
19b00 64 62 2c 20 70 53 72 63 2c 0a 20 20 20 20 20 20  db, pSrc,.      
19b10 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
19b20 2a 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63  *pSrc) + (nAlloc
19b30 2d 31 29 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d  -1)*sizeof(pSrc-
19b40 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  >a[0]) );.    if
19b50 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
19b60 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
19b70 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
19b80 20 20 20 20 20 72 65 74 75 72 6e 20 70 53 72 63       return pSrc
19b90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63  ;.    }.    pSrc
19ba0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f   = pNew;.    nGo
19bb0 74 20 3d 20 28 73 71 6c 69 74 65 33 44 62 4d 61  t = (sqlite3DbMa
19bc0 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e 65  llocSize(db, pNe
19bd0 77 29 20 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72  w) - sizeof(*pSr
19be0 63 29 29 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d  c))/sizeof(pSrc-
19bf0 3e 61 5b 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53  >a[0])+1;.    pS
19c00 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 31  rc->nAlloc = (u1
19c10 36 29 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f  6)nGot;.  }..  /
19c20 2a 20 4d 6f 76 65 20 65 78 69 73 74 69 6e 67 20  * Move existing 
19c30 73 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d 65 20  slots that come 
19c40 61 66 74 65 72 20 74 68 65 20 6e 65 77 6c 79 20  after the newly 
19c50 69 6e 73 65 72 74 65 64 20 73 6c 6f 74 73 0a 20  inserted slots. 
19c60 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 77   ** out of the w
19c70 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 53  ay */.  for(i=pS
19c80 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 69  rc->nSrc-1; i>=i
19c90 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20 20  Start; i--){.   
19ca0 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74 72   pSrc->a[i+nExtr
19cb0 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 3b  a] = pSrc->a[i];
19cc0 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53 72  .  }.  pSrc->nSr
19cd0 63 20 2b 3d 20 28 69 31 36 29 6e 45 78 74 72 61  c += (i16)nExtra
19ce0 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65  ;..  /* Zero the
19cf0 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   newly allocated
19d00 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73   slots */.  mems
19d10 65 74 28 26 70 53 72 63 2d 3e 61 5b 69 53 74 61  et(&pSrc->a[iSta
19d20 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  rt], 0, sizeof(p
19d30 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72  Src->a[0])*nExtr
19d40 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53 74 61  a);.  for(i=iSta
19d50 72 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e 45 78  rt; i<iStart+nEx
19d60 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  tra; i++){.    p
19d70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
19d80 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  r = -1;.  }..  /
19d90 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
19da0 65 72 20 74 6f 20 74 68 65 20 65 6e 6c 61 72 67  er to the enlarg
19db0 65 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  ed SrcList */.  
19dc0 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a  return pSrc;.}..
19dd0 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
19de0 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  new table name t
19df0 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  o the given SrcL
19e00 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
19e10 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a  ew SrcList if.**
19e20 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77   need be.  A new
19e30 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65   entry is create
19e40 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  d in the SrcList
19e50 20 65 76 65 6e 20 69 66 20 70 54 61 62 6c 65 20   even if pTable 
19e60 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41  is NULL..**.** A
19e70 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75   SrcList is retu
19e80 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
19e90 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d   there is an OOM
19ea0 20 65 72 72 6f 72 2e 20 20 54 68 65 20 72 65 74   error.  The ret
19eb0 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74  urned.** SrcList
19ec0 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 73 61   might be the sa
19ed0 6d 65 20 61 73 20 74 68 65 20 53 72 63 4c 69 73  me as the SrcLis
19ee0 74 20 74 68 61 74 20 77 61 73 20 69 6e 70 75 74  t that was input
19ef0 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a   or it might be.
19f00 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49  ** a new one.  I
19f10 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64  f an OOM error d
19f20 6f 65 73 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  oes occurs, then
19f30 20 74 68 65 20 70 72 69 6f 72 20 76 61 6c 75 65   the prior value
19f40 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61   of pList.** tha
19f50 74 20 69 73 20 69 6e 70 75 74 20 74 6f 20 74 68  t is input to th
19f60 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 75  is routine is au
19f70 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72 65 65  tomatically free
19f80 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74  d..**.** If pDat
19f90 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c  abase is not nul
19fa0 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  l, it means that
19fb0 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
19fc0 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61  n optional.** da
19fd0 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66  tabase name pref
19fe0 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20  ix.  Like this: 
19ff0 20 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65   "database.table
1a000 22 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73  ".  The pDatabas
1a010 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74  e.** points to t
1a020 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
1a030 64 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69  d the pTable poi
1a040 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  nts to the datab
1a050 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65  ase name..** The
1a060 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61   SrcList.a[].zNa
1a070 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c  me field is fill
1a080 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
1a090 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67  e name which mig
1a0a0 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20  ht.** come from 
1a0b0 70 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61  pTable (if pData
1a0c0 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72  base is NULL) or
1a0d0 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e   from pDatabase.
1a0e0 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b    .** SrcList.a[
1a0f0 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66  ].zDatabase is f
1a100 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64  illed with the d
1a110 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f  atabase name fro
1a120 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20  m pTable,.** or 
1a130 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20  with NULL if no 
1a140 64 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63  database is spec
1a150 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  ified..**.** In 
1a160 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
1a170 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  call like this:.
1a180 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
1a190 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1a1a0 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a  nd(D,A,B,0);.**.
1a1b0 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74  ** Then B is a t
1a1c0 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
1a1d0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
1a1e0 69 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20  is unspecified. 
1a1f0 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69   If called.** li
1a200 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
1a210 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
1a220 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
1a230 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,C);.**.** Then
1a240 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20   C is the table 
1a250 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68  name and B is th
1a260 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  e database name.
1a270 20 20 49 66 20 43 20 69 73 20 64 65 66 69 6e 65    If C is define
1a280 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20 69 73 20  d.** then so is 
1a290 42 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  B.  In other wor
1a2a0 64 73 2c 20 77 65 20 6e 65 76 65 72 20 68 61 76  ds, we never hav
1a2b0 65 20 61 20 63 61 73 65 20 77 68 65 72 65 3a 0a  e a case where:.
1a2c0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
1a2d0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1a2e0 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a  nd(D,A,0,C);.**.
1a2f0 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c 65 20 61  ** Both pTable a
1a300 6e 64 20 70 44 61 74 61 62 61 73 65 20 61 72 65  nd pDatabase are
1a310 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 71   assumed to be q
1a320 75 6f 74 65 64 2e 20 20 54 68 65 79 20 61 72 65  uoted.  They are
1a330 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66   dequoted.** bef
1a340 6f 72 65 20 62 65 69 6e 67 20 61 64 64 65 64 20  ore being added 
1a350 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74 2e 0a  to the SrcList..
1a360 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
1a370 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1a380 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1a390 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
1a3a0 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20  ction to notify 
1a3b0 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  of malloc failur
1a3c0 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  es */.  SrcList 
1a3d0 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 41  *pList,     /* A
1a3e0 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 53 72  ppend to this Sr
1a3f0 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61  cList. NULL crea
1a400 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c 69 73  tes a new SrcLis
1a410 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  t */.  Token *pT
1a420 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 61  able,      /* Ta
1a430 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f  ble to append */
1a440 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62  .  Token *pDatab
1a450 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61 62 61  ase    /* Databa
1a460 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  se of the table 
1a470 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  */.){.  struct S
1a480 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1a490 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44  em;.  assert( pD
1a4a0 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54  atabase==0 || pT
1a4b0 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43  able!=0 );  /* C
1a4c0 61 6e 6e 6f 74 20 68 61 76 65 20 43 20 77 69 74  annot have C wit
1a4d0 68 6f 75 74 20 42 20 2a 2f 0a 20 20 69 66 28 20  hout B */.  if( 
1a4e0 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
1a4f0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44  pList = sqlite3D
1a500 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
1a510 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20  sizeof(SrcList) 
1a520 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
1a530 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1a540 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
1a550 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 69  c = 1;.  }.  pLi
1a560 73 74 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  st = sqlite3SrcL
1a570 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70  istEnlarge(db, p
1a580 4c 69 73 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e  List, 1, pList->
1a590 6e 53 72 63 29 3b 0a 20 20 69 66 28 20 64 62 2d  nSrc);.  if( db-
1a5a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1a5b0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  .    sqlite3SrcL
1a5c0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
1a5d0 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ist);.    return
1a5e0 20 30 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20   0;.  }.  pItem 
1a5f0 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
1a600 74 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66  t->nSrc-1];.  if
1a610 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70  ( pDatabase && p
1a620 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29  Database->z==0 )
1a630 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20  {.    pDatabase 
1a640 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
1a650 44 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20  Database ){.    
1a660 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70  Token *pTemp = p
1a670 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44  Database;.    pD
1a680 61 74 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65  atabase = pTable
1a690 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70  ;.    pTable = p
1a6a0 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65  Temp;.  }.  pIte
1a6b0 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
1a6c0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1a6d0 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 70  db, pTable);.  p
1a6e0 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
1a6f0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1a700 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74 61  mToken(db, pData
1a710 62 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  base);.  return 
1a720 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
1a730 41 73 73 69 67 6e 20 56 64 62 65 43 75 72 73 6f  Assign VdbeCurso
1a740 72 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 73 20  r index numbers 
1a750 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  to all tables in
1a760 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f   a SrcList.*/.vo
1a770 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
1a780 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50  tAssignCursors(P
1a790 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
1a7a0 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
1a7b0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1a7c0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1a7d0 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70  Item;.  assert(p
1a7e0 4c 69 73 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e  List || pParse->
1a7f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1a800 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   );.  if( pList 
1a810 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  ){.    for(i=0, 
1a820 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
1a830 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  i<pList->nSrc; i
1a840 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1a850 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69      if( pItem->i
1a860 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61  Cursor>=0 ) brea
1a870 6b 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  k;.      pItem->
1a880 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  iCursor = pParse
1a890 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
1a8a0 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
1a8b0 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
1a8c0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
1a8d0 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
1a8e0 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
1a8f0 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d  ->pSrc);.      }
1a900 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1a910 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
1a920 74 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63  tire SrcList inc
1a930 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73  luding all its s
1a940 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  ubstructure..*/.
1a950 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
1a960 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  istDelete(sqlite
1a970 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a  3 *db, SrcList *
1a980 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
1a990 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1a9a0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1a9b0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1a9c0 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49  return;.  for(pI
1a9d0 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
1a9e0 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63  0; i<pList->nSrc
1a9f0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
1aa00 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1aa10 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44  ee(db, pItem->zD
1aa20 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71  atabase);.    sq
1aa30 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1aa40 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
1aa50 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1aa60 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  (db, pItem->zAli
1aa70 61 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  as);.    sqlite3
1aa80 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
1aa90 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20 73  ->zIndex);.    s
1aaa0 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
1aab0 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61  e(db, pItem->pTa
1aac0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  b);.    sqlite3S
1aad0 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
1aae0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pItem->pSelect);
1aaf0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1ab00 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
1ab10 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ->pOn);.    sqli
1ab20 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
1ab30 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e  db, pItem->pUsin
1ab40 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
1ab50 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
1ab60 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  t);.}../*.** Thi
1ab70 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1ab80 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
1ab90 72 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74  r to add a new t
1aba0 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  erm to the.** en
1abb0 64 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46  d of a growing F
1abc0 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ROM clause.  The
1abd0 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
1abe0 73 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a  s the part of.**
1abf0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1ac00 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
1ac10 79 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74  y been construct
1ac20 65 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c  ed.  "p" is NULL
1ac30 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74  .** if this is t
1ac40 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66  he first term of
1ac50 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1ac60 2e 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44  .  pTable and pD
1ac70 61 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74  atabase.** are t
1ac80 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
1ac90 61 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73  able and databas
1aca0 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
1acb0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ROM clause term.
1acc0 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69 73  .** pDatabase is
1acd0 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74   NULL if the dat
1ace0 61 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69  abase name quali
1acf0 66 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20  fier is missing 
1ad00 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63  - the.** usual c
1ad10 61 73 65 2e 20 20 49 66 20 74 68 65 20 74 65 72  ase.  If the ter
1ad20 6d 20 68 61 73 20 61 20 61 6c 69 61 73 2c 20 74  m has a alias, t
1ad30 68 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74  hen pAlias point
1ad40 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61  s to the.** alia
1ad50 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65  s token.  If the
1ad60 20 74 65 72 6d 20 69 73 20 61 20 73 75 62 71 75   term is a subqu
1ad70 65 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75  ery, then pSubqu
1ad80 65 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45  ery is the.** SE
1ad90 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
1ada0 68 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79  hat the subquery
1adb0 20 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70   encodes.  The p
1adc0 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61  Table and.** pDa
1add0 74 61 62 61 73 65 20 70 61 72 61 6d 65 74 65 72  tabase parameter
1ade0 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73  s are NULL for s
1adf0 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65 20  ubqueries.  The 
1ae00 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a  pOn and pUsing.*
1ae10 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  * parameters are
1ae20 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1ae30 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
1ae40 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
1ae50 52 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63  Return a new Src
1ae60 4c 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64  List which encod
1ae70 65 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77  es is the FROM w
1ae80 69 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74  ith the new.** t
1ae90 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72  erm added..*/.Sr
1aea0 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
1aeb0 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54  cListAppendFromT
1aec0 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
1aed0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
1aee0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
1aef0 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
1af00 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
1af10 2a 20 54 68 65 20 6c 65 66 74 20 70 61 72 74 20  * The left part 
1af20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
1af30 73 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20  se already seen 
1af40 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
1af50 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
1af60 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
1af70 65 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20  e to add to the 
1af80 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
1af90 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73   Token *pDatabas
1afa0 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  e,       /* Name
1afb0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1afc0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62   containing pTab
1afd0 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
1afe0 41 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20 20  Alias,          
1aff0 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  /* The right-han
1b000 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 41 53  d side of the AS
1b010 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a   subexpression *
1b020 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
1b030 71 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41  query,      /* A
1b040 20 73 75 62 71 75 65 72 79 20 75 73 65 64 20 69   subquery used i
1b050 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62  n place of a tab
1b060 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70  le name */.  Exp
1b070 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20  r *pOn,         
1b080 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63       /* The ON c
1b090 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20  lause of a join 
1b0a0 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73  */.  IdList *pUs
1b0b0 69 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ing          /* 
1b0c0 54 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  The USING clause
1b0d0 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b   of a join */.){
1b0e0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1b0f0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1b100 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1b110 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
1b120 20 21 70 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70   !p && (pOn || p
1b130 55 73 69 6e 67 29 20 29 7b 0a 20 20 20 20 73 71  Using) ){.    sq
1b140 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1b150 61 72 73 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c  arse, "a JOIN cl
1b160 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64  ause is required
1b170 20 62 65 66 6f 72 65 20 25 73 22 2c 20 0a 20 20   before %s", .  
1b180 20 20 20 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20      (pOn ? "ON" 
1b190 3a 20 22 55 53 49 4e 47 22 29 0a 20 20 20 20 29  : "USING").    )
1b1a0 3b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e  ;.    goto appen
1b1b0 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20  d_from_error;.  
1b1c0 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 53  }.  p = sqlite3S
1b1d0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c  rcListAppend(db,
1b1e0 20 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61 74   p, pTable, pDat
1b1f0 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  abase);.  if( p=
1b200 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e  =0 || NEVER(p->n
1b210 53 72 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 67  Src==0) ){.    g
1b220 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f  oto append_from_
1b230 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 49 74  error;.  }.  pIt
1b240 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53  em = &p->a[p->nS
1b250 72 63 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  rc-1];.  assert(
1b260 20 70 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20   pAlias!=0 );.  
1b270 69 66 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b  if( pAlias->n ){
1b280 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  .    pItem->zAli
1b290 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  as = sqlite3Name
1b2a0 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41  FromToken(db, pA
1b2b0 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74  lias);.  }.  pIt
1b2c0 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53  em->pSelect = pS
1b2d0 75 62 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d  ubquery;.  pItem
1b2e0 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70  ->pOn = pOn;.  p
1b2f0 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70  Item->pUsing = p
1b300 55 73 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20  Using;.  return 
1b310 70 3b 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d  p;.. append_from
1b320 5f 65 72 72 6f 72 3a 0a 20 20 61 73 73 65 72 74  _error:.  assert
1b330 28 20 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ( p==0 );.  sqli
1b340 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1b350 2c 20 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65  , pOn);.  sqlite
1b360 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
1b370 2c 20 70 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c  , pUsing);.  sql
1b380 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
1b390 28 64 62 2c 20 70 53 75 62 71 75 65 72 79 29 3b  (db, pSubquery);
1b3a0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1b3b0 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44  /*.** Add an IND
1b3c0 45 58 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49  EXED BY or NOT I
1b3d0 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 74 6f  NDEXED clause to
1b3e0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
1b3f0 6c 79 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65  ly added .** ele
1b400 6d 65 6e 74 20 6f 66 20 74 68 65 20 73 6f 75 72  ment of the sour
1b410 63 65 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61  ce-list passed a
1b420 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
1b430 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
1b440 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64  qlite3SrcListInd
1b450 65 78 65 64 42 79 28 50 61 72 73 65 20 2a 70 50  exedBy(Parse *pP
1b460 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
1b470 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65  , Token *pIndexe
1b480 64 42 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20  dBy){.  assert( 
1b490 70 49 6e 64 65 78 65 64 42 79 21 3d 30 20 29 3b  pIndexedBy!=0 );
1b4a0 0a 20 20 69 66 28 20 70 20 26 26 20 41 4c 57 41  .  if( p && ALWA
1b4b0 59 53 28 70 2d 3e 6e 53 72 63 3e 30 29 20 29 7b  YS(p->nSrc>0) ){
1b4c0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
1b4d0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
1b4e0 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d  = &p->a[p->nSrc-
1b4f0 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
1b500 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65  pItem->notIndexe
1b510 64 3d 3d 30 20 26 26 20 70 49 74 65 6d 2d 3e 7a  d==0 && pItem->z
1b520 49 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20  Index==0 );.    
1b530 69 66 28 20 70 49 6e 64 65 78 65 64 42 79 2d 3e  if( pIndexedBy->
1b540 6e 3d 3d 31 20 26 26 20 21 70 49 6e 64 65 78 65  n==1 && !pIndexe
1b550 64 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20  dBy->z ){.      
1b560 2f 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45 58 45  /* A "NOT INDEXE
1b570 44 22 20 63 6c 61 75 73 65 20 77 61 73 20 73 75  D" clause was su
1b580 70 70 6c 69 65 64 2e 20 53 65 65 20 70 61 72 73  pplied. See pars
1b590 65 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  e.y .      ** co
1b5a0 6e 73 74 72 75 63 74 20 22 69 6e 64 65 78 65 64  nstruct "indexed
1b5b0 5f 6f 70 74 22 20 66 6f 72 20 64 65 74 61 69 6c  _opt" for detail
1b5c0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 74 65  s. */.      pIte
1b5d0 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20  m->notIndexed = 
1b5e0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1b5f0 20 20 20 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65      pItem->zInde
1b600 78 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  x = sqlite3NameF
1b610 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
1b620 3e 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79 29  >db, pIndexedBy)
1b630 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1b640 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69  *.** When buildi
1b650 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61  ng up a FROM cla
1b660 75 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65  use in the parse
1b670 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  r, the join oper
1b680 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69  ator.** is initi
1b690 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f  ally attached to
1b6a0 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
1b6b0 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65  d.  But the code
1b6c0 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78   generator.** ex
1b6d0 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f  pects the join o
1b6e0 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e  perator to be on
1b6f0 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
1b700 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
1b710 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20  e.** Shifts all 
1b720 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66  join operators f
1b730 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
1b740 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20  t for an entire 
1b750 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a  FROM.** clause..
1b760 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53  **.** Example: S
1b770 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20  uppose the join 
1b780 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  is like this:.**
1b790 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20  .**           A 
1b7a0 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f  natural cross jo
1b7b0 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  in B.**.** The o
1b7c0 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75  perator is "natu
1b7d0 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e  ral cross join".
1b7e0 20 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70    The A and B op
1b7f0 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65  erands are store
1b800 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20  d.** in p->a[0] 
1b810 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73  and p->a[1], res
1b820 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20  pectively.  The 
1b830 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79  parser initially
1b840 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f   stores the.** o
1b850 70 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20  perator with A. 
1b860 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
1b870 69 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74  ifts that operat
1b880 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f  or over to B..*/
1b890 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
1b8a0 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70  ListShiftJoinTyp
1b8b0 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20  e(SrcList *p){. 
1b8c0 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
1b8d0 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t i;.    assert(
1b8e0 20 70 2d 3e 61 20 7c 7c 20 70 2d 3e 6e 53 72 63   p->a || p->nSrc
1b8f0 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  ==0 );.    for(i
1b900 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b  =p->nSrc-1; i>0;
1b910 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i--){.      p->
1b920 61 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  a[i].jointype = 
1b930 70 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79  p->a[i-1].jointy
1b940 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  pe;.    }.    p-
1b950 3e 61 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  >a[0].jointype =
1b960 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
1b970 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63   Begin a transac
1b980 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
1b990 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63  ite3BeginTransac
1b9a0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
1b9b0 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20  se, int type){. 
1b9c0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1b9d0 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
1b9e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1b9f0 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d  rse!=0 );.  db =
1ba00 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
1ba10 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
1ba20 2f 2a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  /*  if( db->aDb[
1ba30 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
1ba40 72 6e 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  rn; */.  if( sql
1ba50 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1ba60 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
1ba70 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e  NSACTION, "BEGIN
1ba80 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  ", 0, 0) ){.    
1ba90 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20  return;.  }.  v 
1baa0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1bab0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
1bac0 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  !v ) return;.  i
1bad0 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45  f( type!=TK_DEFE
1bae0 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28  RRED ){.    for(
1baf0 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
1bb00 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
1bb10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1bb20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
1bb30 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58   i, (type==TK_EX
1bb40 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20  CLUSIVE)+1);.   
1bb50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
1bb60 65 73 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20  esBtree(v, i);. 
1bb70 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1bb80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1bb90 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30  OP_AutoCommit, 0
1bba0 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  , 0);.}../*.** C
1bbb0 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74  ommit a transact
1bbc0 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
1bbd0 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63  te3CommitTransac
1bbe0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
1bbf0 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  se){.  Vdbe *v;.
1bc00 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1bc10 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
1bc20 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20  ( pParse->db!=0 
1bc30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
1bc40 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1bc50 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
1bc60 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  TION, "COMMIT", 
1bc70 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74  0, 0) ){.    ret
1bc80 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73  urn;.  }.  v = s
1bc90 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1bca0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
1bcb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1bcc0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75  eAddOp2(v, OP_Au
1bcd0 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b  toCommit, 1, 0);
1bce0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  .  }.}../*.** Ro
1bcf0 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
1bd00 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
1bd10 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e  ite3RollbackTran
1bd20 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
1bd30 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
1bd40 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  v;..  assert( pP
1bd50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  arse!=0 );.  ass
1bd60 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21  ert( pParse->db!
1bd70 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  =0 );.  if( sqli
1bd80 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1bd90 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
1bda0 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41  SACTION, "ROLLBA
1bdb0 43 4b 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  CK", 0, 0) ){.  
1bdc0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1bdd0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1bde0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1bdf0 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
1be00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1be10 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
1be20 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 1);.  }.}../*.
1be30 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1be40 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
1be50 65 20 70 61 72 73 65 72 20 77 68 65 6e 20 69 74  e parser when it
1be60 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e   parses a comman
1be70 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20  d to create,.** 
1be80 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
1be90 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70  ack an SQL savep
1bea0 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  oint. .*/.void s
1beb0 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28  qlite3Savepoint(
1bec0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1bed0 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e  nt op, Token *pN
1bee0 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
1bef0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
1bf00 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
1bf10 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  e->db, pName);. 
1bf20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
1bf30 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
1bf40 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1bf50 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
1bf60 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
1bf70 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63  ATION.    static
1bf80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f   const char * co
1bf90 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45  nst az[] = { "BE
1bfa0 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c  GIN", "RELEASE",
1bfb0 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20   "ROLLBACK" };. 
1bfc0 20 20 20 61 73 73 65 72 74 28 20 21 53 41 56 45     assert( !SAVE
1bfd0 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53  POINT_BEGIN && S
1bfe0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
1bff0 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54  ==1 && SAVEPOINT
1c000 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a  _ROLLBACK==2 );.
1c010 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21  #endif.    if( !
1c020 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68  v || sqlite3Auth
1c030 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1c040 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20  LITE_SAVEPOINT, 
1c050 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30  az[op], zName, 0
1c060 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
1c070 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
1c080 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >db, zName);.   
1c090 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
1c0a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1c0b0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76  AddOp4(v, OP_Sav
1c0c0 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30  epoint, op, 0, 0
1c0d0 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41  , zName, P4_DYNA
1c0e0 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  MIC);.  }.}../*.
1c0f0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
1c100 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69   TEMP database i
1c110 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c  s open and avail
1c120 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52  able for use.  R
1c130 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d  eturn.** the num
1c140 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
1c150 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20  Leave any error 
1c160 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20  messages in the 
1c170 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
1c180 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1c190 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
1c1a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
1c1b0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1c1c0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1c1d0 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  f( db->aDb[1].pB
1c1e0 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d  t==0 && !pParse-
1c1f0 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
1c200 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65  int rc;.    Btre
1c210 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 74  e *pBt;.    stat
1c220 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61  ic const int fla
1c230 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  gs = .          
1c240 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1c250 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20  WRITE |.        
1c260 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
1c270 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  EATE |.         
1c280 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
1c290 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20  LUSIVE |.       
1c2a0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
1c2b0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
1c2c0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1c2d0 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20  OPEN_TEMP_DB;.. 
1c2e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1c2f0 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66  treeOpen(db->pVf
1c300 73 2c 20 30 2c 20 64 62 2c 20 26 70 42 74 2c 20  s, 0, db, &pBt, 
1c310 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  0, flags);.    i
1c320 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c330 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1c340 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1c350 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  , "unable to ope
1c360 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61  n a temporary da
1c370 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20  tabase ".       
1c380 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69   "file for stori
1c390 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ng temporary tab
1c3a0 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61  les");.      pPa
1c3b0 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
1c3c0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1c3d0 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b    }.    db->aDb[
1c3e0 31 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  1].pBt = pBt;.  
1c3f0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
1c400 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a  b[1].pSchema );.
1c410 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e      if( SQLITE_N
1c420 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72  OMEM==sqlite3Btr
1c430 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 42  eeSetPageSize(pB
1c440 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73  t, db->nextPages
1c450 69 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20  ize, -1, 0) ){. 
1c460 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46       db->mallocF
1c470 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ailed = 1;.     
1c480 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1c490 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1c4a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1c4b0 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
1c4c0 74 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68  t will verify th
1c4d0 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
1c4e0 61 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72  and start.** a r
1c4f0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1c500 66 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61  for all named da
1c510 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a  tabase files..**
1c520 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74  .** It is import
1c530 61 6e 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68  ant that all sch
1c540 65 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76  ema cookies be v
1c550 65 72 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a  erified and all.
1c560 2a 2a 20 72 65 61 64 20 74 72 61 6e 73 61 63 74  ** read transact
1c570 69 6f 6e 73 20 62 65 20 73 74 61 72 74 65 64 20  ions be started 
1c580 62 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20  before anything 
1c590 65 6c 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a  else happens in.
1c5a0 2a 2a 20 74 68 65 20 56 44 42 45 20 70 72 6f 67  ** the VDBE prog
1c5b0 72 61 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72  ram.  But this r
1c5c0 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61  outine can be ca
1c5d0 6c 6c 65 64 20 61 66 74 65 72 20 6d 75 63 68 20  lled after much 
1c5e0 6f 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61  other.** code ha
1c5f0 73 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64  s been generated
1c600 2e 20 20 53 6f 20 68 65 72 65 20 69 73 20 77 68  .  So here is wh
1c610 61 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20  at we do:.**.** 
1c620 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  The first time t
1c630 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1c640 61 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61  alled, we code a
1c650 6e 20 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a  n OP_Goto that.*
1c660 2a 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61  * will jump to a
1c670 20 73 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74   subroutine at t
1c680 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72  he end of the pr
1c690 6f 67 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a  ogram.  Then we.
1c6a0 2a 2a 20 72 65 63 6f 72 64 20 65 76 65 72 79 20  ** record every 
1c6b0 64 61 74 61 62 61 73 65 20 74 68 61 74 20 6e 65  database that ne
1c6c0 65 64 73 20 69 74 73 20 73 63 68 65 6d 61 20 76  eds its schema v
1c6d0 65 72 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a  erified in the.*
1c6e0 2a 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  * pParse->cookie
1c6f0 4d 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74  Mask field.  Lat
1c700 65 72 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74  er, after all ot
1c710 68 65 72 20 63 6f 64 65 20 68 61 73 20 62 65 65  her code has bee
1c720 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20  n.** generated, 
1c730 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74  the subroutine t
1c740 68 61 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f  hat does the coo
1c750 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  kie verification
1c760 73 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20  s and.** starts 
1c770 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  the transactions
1c780 20 77 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61   will be coded a
1c790 6e 64 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50  nd the OP_Goto P
1c7a0 32 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20  2 value.** will 
1c7b0 62 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74  be made to point
1c7c0 20 74 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74   to that subrout
1c7d0 69 6e 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61  ine.  The genera
1c7e0 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63  tion of the.** c
1c7f0 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69  ookie verificati
1c800 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f  on subroutine co
1c810 64 65 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71  de happens in sq
1c820 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
1c830 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44  g()..**.** If iD
1c840 62 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 74 68  b<0 then code th
1c850 65 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d  e OP_Goto only -
1c860 20 64 6f 6e 27 74 20 73 65 74 20 66 6c 61 67 20   don't set flag 
1c870 74 6f 20 76 65 72 69 66 79 20 74 68 65 0a 2a 2a  to verify the.**
1c880 20 73 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64   schema on any d
1c890 61 74 61 62 61 73 65 73 2e 20 20 54 68 69 73 20  atabases.  This 
1c8a0 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70  can be used to p
1c8b0 6f 73 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47  osition the OP_G
1c8c0 6f 74 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20  oto.** early in 
1c8d0 74 68 65 20 63 6f 64 65 2c 20 62 65 66 6f 72 65  the code, before
1c8e0 20 77 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20   we know if any 
1c8f0 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 73 20  database tables 
1c900 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f  will be used..*/
1c910 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
1c920 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61  eVerifySchema(Pa
1c930 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1c940 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a   iDb){.  Parse *
1c950 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
1c960 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
1c970 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 69 66 28  (pParse);..  if(
1c980 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b   pToplevel->cook
1c990 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20  ieGoto==0 ){.   
1c9a0 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
1c9b0 65 33 47 65 74 56 64 62 65 28 70 54 6f 70 6c 65  e3GetVdbe(pTople
1c9c0 76 65 6c 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  vel);.    if( v=
1c9d0 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  =0 ) return;  /*
1c9e0 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65   This only happe
1c9f0 6e 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ns if there was 
1ca00 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f  a prior error */
1ca10 0a 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  .    pToplevel->
1ca20 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c  cookieGoto = sql
1ca30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ca40 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29  , OP_Goto, 0, 0)
1ca50 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44  +1;.  }.  if( iD
1ca60 62 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  b>=0 ){.    sqli
1ca70 74 65 33 20 2a 64 62 20 3d 20 70 54 6f 70 6c 65  te3 *db = pTople
1ca80 76 65 6c 2d 3e 64 62 3b 0a 20 20 20 20 79 44 62  vel->db;.    yDb
1ca90 4d 61 73 6b 20 6d 61 73 6b 3b 0a 0a 20 20 20 20  Mask mask;..    
1caa0 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e  assert( iDb<db->
1cab0 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nDb );.    asser
1cac0 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  t( db->aDb[iDb].
1cad0 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31  pBt!=0 || iDb==1
1cae0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1caf0 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41  iDb<SQLITE_MAX_A
1cb00 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 20  TTACHED+2 );.   
1cb10 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1cb20 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
1cb30 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
1cb40 20 20 20 6d 61 73 6b 20 3d 20 28 28 79 44 62 4d     mask = ((yDbM
1cb50 61 73 6b 29 31 29 3c 3c 69 44 62 3b 0a 20 20 20  ask)1)<<iDb;.   
1cb60 20 69 66 28 20 28 70 54 6f 70 6c 65 76 65 6c 2d   if( (pToplevel-
1cb70 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61  >cookieMask & ma
1cb80 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
1cb90 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69  pToplevel->cooki
1cba0 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  eMask |= mask;. 
1cbb0 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e       pToplevel->
1cbc0 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d  cookieValue[iDb]
1cbd0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
1cbe0 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f  pSchema->schema_
1cbf0 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69 66  cookie;.      if
1cc00 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
1cc10 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  & iDb==1 ){.    
1cc20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
1cc30 65 6d 70 44 61 74 61 62 61 73 65 28 70 54 6f 70  empDatabase(pTop
1cc40 6c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  level);.      }.
1cc50 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1cc60 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a  ** If argument z
1cc70 44 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  Db is NULL, then
1cc80 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 64   call sqlite3Cod
1cc90 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 29 20  eVerifySchema() 
1cca0 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20 61 74 74  for each .** att
1ccb0 61 63 68 65 64 20 64 61 74 61 62 61 73 65 2e 20  ached database. 
1ccc0 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 76 6f 6b  Otherwise, invok
1ccd0 65 20 69 74 20 66 6f 72 20 74 68 65 20 64 61 74  e it for the dat
1cce0 61 62 61 73 65 20 6e 61 6d 65 64 20 7a 44 62 20  abase named zDb 
1ccf0 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
1cd00 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e  lite3CodeVerifyN
1cd10 61 6d 65 64 53 63 68 65 6d 61 28 50 61 72 73 65  amedSchema(Parse
1cd20 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
1cd30 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73 71  char *zDb){.  sq
1cd40 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1cd50 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b  se->db;.  int i;
1cd60 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
1cd70 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
1cd80 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
1cd90 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[i];.    if( 
1cda0 70 44 62 2d 3e 70 42 74 20 26 26 20 28 21 7a 44  pDb->pBt && (!zD
1cdb0 62 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 53  b || 0==sqlite3S
1cdc0 74 72 49 43 6d 70 28 7a 44 62 2c 20 70 44 62 2d  trICmp(zDb, pDb-
1cdd0 3e 7a 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20 20  >zName)) ){.    
1cde0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
1cdf0 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
1ce00 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
1ce10 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1ce20 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
1ce30 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f   prepares for do
1ce40 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  ing an operation
1ce50 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63   that.** might c
1ce60 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61  hange the databa
1ce70 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
1ce80 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20  outine starts a 
1ce90 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  new transaction 
1cea0 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c  if we are not al
1ceb0 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20  ready within.** 
1cec0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  a transaction.  
1ced0 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  If we are alread
1cee0 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  y within a trans
1cef0 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63  action, then a c
1cf00 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20  heckpoint.** is 
1cf10 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53 74  set if the setSt
1cf20 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65  atement paramete
1cf30 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68  r is true.  A ch
1cf40 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a  eckpoint should.
1cf50 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70  ** be set for op
1cf60 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69  erations that mi
1cf70 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f  ght fail (due to
1cf80 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70   a constraint) p
1cf90 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61  art of.** the wa
1cfa0 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68  y through and wh
1cfb0 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  ich will need to
1cfc0 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65   undo some write
1cfd0 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  s without having
1cfe0 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20   to.** rollback 
1cff0 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61  the whole transa
1d000 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72  ction.  For oper
1d010 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c  ations where all
1d020 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
1d030 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62  can be checked b
1d040 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
1d050 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68  s are made to th
1d060 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69  e database, it i
1d070 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73  s never.** neces
1d080 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77  sary to undo a w
1d090 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65  rite and the che
1d0a0 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e  ckpoint should n
1d0b0 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ot be set..*/.vo
1d0c0 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57  id sqlite3BeginW
1d0d0 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61  riteOperation(Pa
1d0e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1d0f0 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69   setStatement, i
1d100 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65  nt iDb){.  Parse
1d110 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
1d120 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
1d130 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  el(pParse);.  sq
1d140 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
1d150 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
1d160 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d  b);.  pToplevel-
1d170 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20 28 28  >writeMask |= ((
1d180 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 44 62 3b  yDbMask)1)<<iDb;
1d190 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73  .  pToplevel->is
1d1a0 4d 75 6c 74 69 57 72 69 74 65 20 7c 3d 20 73 65  MultiWrite |= se
1d1b0 74 53 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f  tStatement;.}../
1d1c0 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
1d1d0 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
1d1e0 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
1d1f0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d 69   construction mi
1d200 67 68 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f 72  ght write.** mor
1d210 65 20 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72 79  e than one entry
1d220 20 28 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65 74   (example: delet
1d230 69 6e 67 20 6f 6e 65 20 72 6f 77 20 74 68 65 6e  ing one row then
1d240 20 69 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74 68   inserting anoth
1d250 65 72 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e 67  er,.** inserting
1d260 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 69   multiple rows i
1d270 6e 20 61 20 74 61 62 6c 65 2c 20 6f 72 20 69 6e  n a table, or in
1d280 73 65 72 74 69 6e 67 20 61 20 72 6f 77 20 61 6e  serting a row an
1d290 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 2e  d index entries.
1d2a0 29 0a 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72 74  ).** If an abort
1d2b0 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 73 6f   occurs after so
1d2c0 6d 65 20 6f 66 20 74 68 65 73 65 20 77 72 69 74  me of these writ
1d2d0 65 73 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65  es have complete
1d2e0 64 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 0a  d, then it will.
1d2f0 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20  ** be necessary 
1d300 74 6f 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d 70  to undo the comp
1d310 6c 65 74 65 64 20 77 72 69 74 65 73 2e 0a 2a 2f  leted writes..*/
1d320 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 75 6c  .void sqlite3Mul
1d330 74 69 57 72 69 74 65 28 50 61 72 73 65 20 2a 70  tiWrite(Parse *p
1d340 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20  Parse){.  Parse 
1d350 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
1d360 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
1d370 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f  l(pParse);.  pTo
1d380 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57  plevel->isMultiW
1d390 72 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20  rite = 1;.}../* 
1d3a0 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  .** The code gen
1d3b0 65 72 61 74 6f 72 20 63 61 6c 6c 73 20 74 68 69  erator calls thi
1d3c0 73 20 72 6f 75 74 69 6e 65 20 69 66 20 69 73 20  s routine if is 
1d3d0 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 69  discovers that i
1d3e0 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  t is.** possible
1d3f0 20 74 6f 20 61 62 6f 72 74 20 61 20 73 74 61 74   to abort a stat
1d400 65 6d 65 6e 74 20 70 72 69 6f 72 20 74 6f 20 63  ement prior to c
1d410 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20 6f  ompletion.  In o
1d420 72 64 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72 66  rder to .** perf
1d430 6f 72 6d 20 74 68 69 73 20 61 62 6f 72 74 20 77  orm this abort w
1d440 69 74 68 6f 75 74 20 63 6f 72 72 75 70 74 69 6e  ithout corruptin
1d450 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  g the database, 
1d460 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 0a  we need to make.
1d470 2a 2a 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ** sure that the
1d480 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 72   statement is pr
1d490 6f 74 65 63 74 65 64 20 62 79 20 61 20 73 74 61  otected by a sta
1d4a0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
1d4b0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69  on..**.** Techni
1d4c0 63 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20 6e  cally, we only n
1d4d0 65 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 6d  eed to set the m
1d4e0 61 79 41 62 6f 72 74 20 66 6c 61 67 20 69 66 20  ayAbort flag if 
1d4f0 74 68 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57 72  the.** isMultiWr
1d500 69 74 65 20 66 6c 61 67 20 77 61 73 20 70 72 65  ite flag was pre
1d510 76 69 6f 75 73 6c 79 20 73 65 74 2e 20 20 54 68  viously set.  Th
1d520 65 72 65 20 69 73 20 61 20 74 69 6d 65 20 64 65  ere is a time de
1d530 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63 68  pendency.** such
1d540 20 74 68 61 74 20 74 68 65 20 61 62 6f 72 74 20   that the abort 
1d550 6d 75 73 74 20 6f 63 63 75 72 20 61 66 74 65 72  must occur after
1d560 20 74 68 65 20 6d 75 6c 74 69 77 72 69 74 65 2e   the multiwrite.
1d570 20 20 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a 20    This makes.** 
1d580 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e 74 73 20  some statements 
1d590 69 6e 76 6f 6c 76 69 6e 67 20 74 68 65 20 52 45  involving the RE
1d5a0 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 72  PLACE conflict r
1d5b0 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
1d5c0 74 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74 74  thm.** go a litt
1d5d0 6c 65 20 66 61 73 74 65 72 2e 20 20 42 75 74 20  le faster.  But 
1d5e0 74 61 6b 69 6e 67 20 61 64 76 61 6e 74 61 67 65  taking advantage
1d5f0 20 6f 66 20 74 68 69 73 20 74 69 6d 65 20 64 65   of this time de
1d600 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65  pendency.** make
1d610 73 20 69 74 20 6d 6f 72 65 20 64 69 66 66 69 63  s it more diffic
1d620 75 6c 74 20 74 6f 20 70 72 6f 76 65 20 74 68 61  ult to prove tha
1d630 74 20 74 68 65 20 63 6f 64 65 20 69 73 20 63 6f  t the code is co
1d640 72 72 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70 61  rrect (in .** pa
1d650 72 74 69 63 75 6c 61 72 2c 20 69 74 20 70 72 65  rticular, it pre
1d660 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 77 72  vents us from wr
1d670 69 74 69 6e 67 20 61 6e 20 65 66 66 65 63 74 69  iting an effecti
1d680 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  ve.** implementa
1d690 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 41  tion of sqlite3A
1d6a0 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 29  ssertMayAbort())
1d6b0 20 61 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20   and so we have 
1d6c0 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b  chosen.** to tak
1d6d0 65 20 74 68 65 20 73 61 66 65 20 72 6f 75 74 65  e the safe route
1d6e0 20 61 6e 64 20 73 6b 69 70 20 74 68 65 20 6f 70   and skip the op
1d6f0 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  timization..*/.v
1d700 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 79 41 62  oid sqlite3MayAb
1d710 6f 72 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ort(Parse *pPars
1d720 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  e){.  Parse *pTo
1d730 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
1d740 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
1d750 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76  arse);.  pToplev
1d760 65 6c 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20 31  el->mayAbort = 1
1d770 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  ;.}../*.** Code 
1d780 61 6e 20 4f 50 5f 48 61 6c 74 20 74 68 61 74 20  an OP_Halt that 
1d790 63 61 75 73 65 73 20 74 68 65 20 76 64 62 65 20  causes the vdbe 
1d7a0 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  to return an SQL
1d7b0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a  ITE_CONSTRAINT.*
1d7c0 2a 20 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e 45  * error. The onE
1d7d0 72 72 6f 72 20 70 61 72 61 6d 65 74 65 72 20 64  rror parameter d
1d7e0 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20  etermines which 
1d7f0 28 69 66 20 61 6e 79 29 20 6f 66 20 74 68 65 20  (if any) of the 
1d800 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64  statement.** and
1d810 2f 6f 72 20 63 75 72 72 65 6e 74 20 74 72 61 6e  /or current tran
1d820 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
1d830 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  d back..*/.void 
1d840 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
1d850 72 61 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61  raint(Parse *pPa
1d860 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72  rse, int onError
1d870 2c 20 63 68 61 72 20 2a 70 34 2c 20 69 6e 74 20  , char *p4, int 
1d880 70 34 74 79 70 65 29 7b 0a 20 20 56 64 62 65 20  p4type){.  Vdbe 
1d890 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
1d8a0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
1d8b0 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41  f( onError==OE_A
1d8c0 62 6f 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  bort ){.    sqli
1d8d0 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
1d8e0 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  se);.  }.  sqlit
1d8f0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1d900 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
1d910 43 4f 4e 53 54 52 41 49 4e 54 2c 20 6f 6e 45 72  CONSTRAINT, onEr
1d920 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34 74 79  ror, 0, p4, p4ty
1d930 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  pe);.}../*.** Ch
1d940 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49  eck to see if pI
1d950 6e 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f  ndex uses the co
1d960 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1d970 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a   pColl.  Return.
1d980 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  ** true if it do
1d990 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  es and false if 
1d9a0 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a  it does not..*/.
1d9b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d9c0 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
1d9d0 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e  ic int collation
1d9e0 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72  Match(const char
1d9f0 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a   *zColl, Index *
1da00 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69  pIndex){.  int i
1da10 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c  ;.  assert( zCol
1da20 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  l!=0 );.  for(i=
1da30 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f  0; i<pIndex->nCo
1da40 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
1da50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1da60 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
1da70 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  ];.    assert( z
1da80 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 30  !=0 );.    if( 0
1da90 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
1daa0 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  (z, zColl) ){.  
1dab0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1dac0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1dad0 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
1dae0 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c  .** Recompute al
1daf0 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
1db00 62 20 74 68 61 74 20 75 73 65 20 74 68 65 20 63  b that use the c
1db10 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1db20 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70  e pColl..** If p
1db30 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63  Coll==0 then rec
1db40 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
1db50 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23  es of pTab..*/.#
1db60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1db70 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
1db80 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61  c void reindexTa
1db90 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
1dba0 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
1dbb0 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
1dbc0 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  l){.  Index *pIn
1dbd0 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
1dbe0 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
1dbf0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
1dc00 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e  ab */..  for(pIn
1dc10 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  dex=pTab->pIndex
1dc20 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
1dc30 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b  =pIndex->pNext){
1dc40 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d  .    if( zColl==
1dc50 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61  0 || collationMa
1dc60 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65  tch(zColl, pInde
1dc70 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  x) ){.      int 
1dc80 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
1dc90 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
1dca0 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
1dcb0 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  hema);.      sql
1dcc0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
1dcd0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
1dce0 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  0, iDb);.      s
1dcf0 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
1dd00 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
1dd10 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , -1);.    }.  }
1dd20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1dd30 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
1dd40 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61  ndices of all ta
1dd50 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61  bles in all data
1dd60 62 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a  bases where the.
1dd70 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74  ** indices use t
1dd80 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
1dd90 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66  uence pColl.  If
1dda0 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72   pColl==0 then r
1ddb0 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20  ecompute.** all 
1ddc0 69 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65  indices everywhe
1ddd0 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  re..*/.#ifndef S
1dde0 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
1ddf0 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  EX.static void r
1de00 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
1de10 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
1de20 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
1de30 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  ){.  Db *pDb;   
1de40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de50 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74   /* A single dat
1de60 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  abase */.  int i
1de70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
1de80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1de90 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d  tabase index num
1dea0 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ber */.  sqlite3
1deb0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1dec0 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  b;   /* The data
1ded0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1dee0 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b  */.  HashElem *k
1def0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1df00 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1df10 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70  over tables in p
1df20 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  Db */.  Table *p
1df30 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
1df40 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
1df50 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
1df60 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
1df70 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c  ite3BtreeHoldsAl
1df80 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 20  lMutexes(db) ); 
1df90 20 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20 73   /* Needed for s
1dfa0 63 68 65 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a  chema access */.
1dfb0 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62    for(iDb=0, pDb
1dfc0 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62  =db->aDb; iDb<db
1dfd0 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44  ->nDb; iDb++, pD
1dfe0 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  b++){.    assert
1dff0 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20  ( pDb!=0 );.    
1e000 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68  for(k=sqliteHash
1e010 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68  First(&pDb->pSch
1e020 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20  ema->tblHash);  
1e030 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e  k; k=sqliteHashN
1e040 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70  ext(k)){.      p
1e050 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71  Tab = (Table*)sq
1e060 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b  liteHashData(k);
1e070 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54 61  .      reindexTa
1e080 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
1e090 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  , zColl);.    }.
1e0a0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
1e0b0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1e0c0 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45  e for the REINDE
1e0d0 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  X command..**.**
1e0e0 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
1e0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e100 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a             -- 1.
1e110 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
1e120 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20  X  <collation>  
1e130 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
1e140 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  2.**        REIN
1e150 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
1e160 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d  .?<tablename>  -
1e170 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 3.**        RE
1e180 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73  INDEX  ?<databas
1e190 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20  e>.?<indexname> 
1e1a0 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d   -- 4.**.** Form
1e1b0 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e   1 causes all in
1e1c0 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74  dices in all att
1e1d0 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
1e1e0 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a  to be rebuilt..*
1e1f0 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64  * Form 2 rebuild
1e200 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
1e210 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74   all databases t
1e220 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65  hat use the name
1e230 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66  d.** collating f
1e240 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20  unction.  Forms 
1e250 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20  3 and 4 rebuild 
1e260 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
1e270 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65  or all.** indice
1e280 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1e290 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  h the named tabl
1e2a0 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
1e2b0 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
1e2c0 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  X.void sqlite3Re
1e2d0 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  index(Parse *pPa
1e2e0 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
1e2f0 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  e1, Token *pName
1e300 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  2){.  CollSeq *p
1e310 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
1e320 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
1e330 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65  equence to be re
1e340 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c  indexed, or NULL
1e350 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
1e360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e370 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74    /* Name of a t
1e380 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f  able or index */
1e390 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1e3a0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Db;            /
1e3b0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
1e3c0 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c  tabase */.  Tabl
1e3d0 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
1e3e0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62          /* A tab
1e3f0 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
1e400 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  se */.  Index *p
1e410 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
1e420 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
1e430 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1e440 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44  pTab */.  int iD
1e450 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1e460 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1e470 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62  abase index numb
1e480 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
1e490 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1e4a0 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
1e4b0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1e4c0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e  /.  Token *pObjN
1e4d0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
1e4e0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
1e4f0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f  able or index to
1e500 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f   be reindexed */
1e510 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
1e520 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
1e530 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1e540 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
1e550 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
1e560 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61   and code in pPa
1e570 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  rse and return N
1e580 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51  ULL. */.  if( SQ
1e590 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
1e5a0 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
1e5b0 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
1e5c0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61  ;.  }..  if( pNa
1e5d0 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  me1==0 ){.    re
1e5e0 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
1e5f0 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72  Parse, 0);.    r
1e600 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69  eturn;.  }else i
1e610 66 28 20 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d  f( NEVER(pName2=
1e620 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a  =0) || pName2->z
1e630 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
1e640 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65  *zColl;.    asse
1e650 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b  rt( pName1->z );
1e660 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  .    zColl = sql
1e670 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1e680 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e  n(pParse->db, pN
1e690 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 21  ame1);.    if( !
1e6a0 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a  zColl ) return;.
1e6b0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1e6c0 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
1e6d0 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c  b, ENC(db), zCol
1e6e0 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  l, 0);.    if( p
1e6f0 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65  Coll ){.      re
1e700 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
1e710 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  Parse, zColl);. 
1e720 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
1e730 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  ee(db, zColl);. 
1e740 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
1e750 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
1e760 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
1e770 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
1e780 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
1e790 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
1e7a0 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d  pName2, &pObjNam
1e7b0 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20  e);.  if( iDb<0 
1e7c0 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20  ) return;.  z = 
1e7d0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1e7e0 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d  oken(db, pObjNam
1e7f0 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  e);.  if( z==0 )
1e800 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d   return;.  zDb =
1e810 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
1e820 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  ame;.  pTab = sq
1e830 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
1e840 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66  b, z, zDb);.  if
1e850 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65  ( pTab ){.    re
1e860 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73  indexTable(pPars
1e870 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20  e, pTab, 0);.   
1e880 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1e890 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72  b, z);.    retur
1e8a0 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20  n;.  }.  pIndex 
1e8b0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
1e8c0 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a  ex(db, z, zDb);.
1e8d0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1e8e0 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49  db, z);.  if( pI
1e8f0 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  ndex ){.    sqli
1e900 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
1e910 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
1e920 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
1e930 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
1e940 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
1e950 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  1);.    return;.
1e960 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72    }.  sqlite3Err
1e970 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
1e980 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66  nable to identif
1e990 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20  y the object to 
1e9a0 62 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a  be reindexed");.
1e9b0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1e9c0 52 65 74 75 72 6e 20 61 20 64 79 6e 61 6d 69 63  Return a dynamic
1e9d0 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 4b 65 79  ly allocated Key
1e9e0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
1e9f0 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 0a  hat can be used.
1ea00 2a 2a 20 77 69 74 68 20 4f 50 5f 4f 70 65 6e 52  ** with OP_OpenR
1ea10 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e 57 72  ead or OP_OpenWr
1ea20 69 74 65 20 74 6f 20 61 63 63 65 73 73 20 64 61  ite to access da
1ea30 74 61 62 61 73 65 20 69 6e 64 65 78 20 70 49 64  tabase index pId
1ea40 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  x..**.** If succ
1ea50 65 73 73 66 75 6c 2c 20 61 20 70 6f 69 6e 74 65  essful, a pointe
1ea60 72 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74 72  r to the new str
1ea70 75 63 74 75 72 65 20 69 73 20 72 65 74 75 72 6e  ucture is return
1ea80 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
1ea90 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69  .** the caller i
1eaa0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1eab0 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  r calling sqlite
1eac0 33 44 62 46 72 65 65 28 64 62 2c 20 29 20 6f 6e  3DbFree(db, ) on
1ead0 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 0a 2a   the returned .*
1eae0 2a 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 61 6e  * pointer. If an
1eaf0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 6f   error occurs (o
1eb00 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 6f 72 20  ut of memory or 
1eb10 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6f  missing collatio
1eb20 6e 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 29 2c  n .** sequence),
1eb30 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
1eb40 64 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 20  d and the state 
1eb50 6f 66 20 70 50 61 72 73 65 20 75 70 64 61 74 65  of pParse update
1eb60 64 20 74 6f 20 72 65 66 6c 65 63 74 0a 2a 2a 20  d to reflect.** 
1eb70 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 4b 65  the error..*/.Ke
1eb80 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 49 6e  yInfo *sqlite3In
1eb90 64 65 78 4b 65 79 69 6e 66 6f 28 50 61 72 73 65  dexKeyinfo(Parse
1eba0 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
1ebb0 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b  *pIdx){.  int i;
1ebc0 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49  .  int nCol = pI
1ebd0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69  dx->nColumn;.  i
1ebe0 6e 74 20 6e 42 79 74 65 73 20 3d 20 73 69 7a 65  nt nBytes = size
1ebf0 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e  of(KeyInfo) + (n
1ec00 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 43 6f  Col-1)*sizeof(Co
1ec10 6c 6c 53 65 71 2a 29 20 2b 20 6e 43 6f 6c 3b 0a  llSeq*) + nCol;.
1ec20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1ec30 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65  pParse->db;.  Ke
1ec40 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 28 4b  yInfo *pKey = (K
1ec50 65 79 49 6e 66 6f 20 2a 29 73 71 6c 69 74 65 33  eyInfo *)sqlite3
1ec60 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
1ec70 20 6e 42 79 74 65 73 29 3b 0a 0a 20 20 69 66 28   nBytes);..  if(
1ec80 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 70 4b 65   pKey ){.    pKe
1ec90 79 2d 3e 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  y->db = pParse->
1eca0 64 62 3b 0a 20 20 20 20 70 4b 65 79 2d 3e 61 53  db;.    pKey->aS
1ecb0 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a  ortOrder = (u8 *
1ecc0 29 26 28 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 6e  )&(pKey->aColl[n
1ecd0 43 6f 6c 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  Col]);.    asser
1ece0 74 28 20 26 70 4b 65 79 2d 3e 61 53 6f 72 74 4f  t( &pKey->aSortO
1ecf0 72 64 65 72 5b 6e 43 6f 6c 5d 3d 3d 26 28 28 28  rder[nCol]==&(((
1ed00 75 38 20 2a 29 70 4b 65 79 29 5b 6e 42 79 74 65  u8 *)pKey)[nByte
1ed10 73 5d 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  s]) );.    for(i
1ed20 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
1ed30 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  {.      char *zC
1ed40 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  oll = pIdx->azCo
1ed50 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73  ll[i];.      ass
1ed60 65 72 74 28 20 7a 43 6f 6c 6c 20 29 3b 0a 20 20  ert( zColl );.  
1ed70 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b      pKey->aColl[
1ed80 69 5d 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  i] = sqlite3Loca
1ed90 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
1eda0 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
1edb0 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pKey->aSortOrder
1edc0 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72  [i] = pIdx->aSor
1edd0 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d  tOrder[i];.    }
1ede0 0a 20 20 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c  .    pKey->nFiel
1edf0 64 20 3d 20 28 75 31 36 29 6e 43 6f 6c 3b 0a 20  d = (u16)nCol;. 
1ee00 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65   }..  if( pParse
1ee10 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71  ->nErr ){.    sq
1ee20 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1ee30 70 4b 65 79 29 3b 0a 20 20 20 20 70 4b 65 79 20  pKey);.    pKey 
1ee40 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1ee50 6e 20 70 4b 65 79 3b 0a 7d 0a                    n pKey;.}.