/ Hex Artifact Content
Login

Artifact a48e74d24897100017d39ceba5de255e53ec9488:


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 75 33 32  o>0 ){.      u32
1210: 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69 6e 74   mask;.      int
1220: 20 69 44 62 3b 0a 20 20 20 20 20 20 73 71 6c 69   iDb;.      sqli
1230: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1240: 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  v, pParse->cooki
1250: 65 47 6f 74 6f 2d 31 29 3b 0a 20 20 20 20 20 20  eGoto-1);.      
1260: 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73 6b 3d  for(iDb=0, mask=
1270: 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  1; iDb<db->nDb; 
1280: 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b 2b 29  mask<<=1, iDb++)
1290: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  {.        if( (m
12a0: 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 63 6f  ask & pParse->co
12b0: 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29 20 63  okieMask)==0 ) c
12c0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
12d0: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
12e0: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
12f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1300: 62 65 41 64 64 4f 70 32 28 76 2c 4f 50 5f 54 72  beAddOp2(v,OP_Tr
1310: 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62 2c 20  ansaction, iDb, 
1320: 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e  (mask & pParse->
1330: 77 72 69 74 65 4d 61 73 6b 29 21 3d 30 29 3b 0a  writeMask)!=0);.
1340: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
1350: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
1360: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1370: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 4f 50  3VdbeAddOp2(v,OP
1380: 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69  _VerifyCookie, i
1390: 44 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  Db, pParse->cook
13a0: 69 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b 0a 20  ieValue[iDb]);. 
13b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
13e0: 45 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  E.      {.      
13f0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
1400: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
1410: 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 3b 20 69  se->nVtabLock; i
1420: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ++){.          c
1430: 68 61 72 20 2a 76 74 61 62 20 3d 20 28 63 68 61  har *vtab = (cha
1440: 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54  r *)sqlite3GetVT
1450: 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d  able(db, pParse-
1460: 3e 61 70 56 74 61 62 4c 6f 63 6b 5b 69 5d 29 3b  >apVtabLock[i]);
1470: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1480: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1490: 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c 20 30 2c  OP_VBegin, 0, 0,
14a0: 20 30 2c 20 76 74 61 62 2c 20 50 34 5f 56 54 41   0, vtab, P4_VTA
14b0: 42 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  B);.        }.  
14c0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
14d0: 74 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20  tabLock = 0;.   
14e0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
14f0: 20 20 20 2f 2a 20 4f 6e 63 65 20 61 6c 6c 20 74     /* Once all t
1500: 68 65 20 63 6f 6f 6b 69 65 73 20 68 61 76 65 20  he cookies have 
1510: 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 61 6e  been verified an
1520: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f  d transactions o
1530: 70 65 6e 65 64 2c 20 0a 20 20 20 20 20 20 2a 2a  pened, .      **
1540: 20 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71 75   obtain the requ
1550: 69 72 65 64 20 74 61 62 6c 65 2d 6c 6f 63 6b 73  ired table-locks
1560: 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
1570: 70 20 75 6e 6c 65 73 73 20 74 68 65 20 0a 20 20  p unless the .  
1580: 20 20 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61      ** shared-ca
1590: 63 68 65 20 66 65 61 74 75 72 65 20 69 73 20 65  che feature is e
15a0: 6e 61 62 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f  nabled..      */
15b0: 0a 20 20 20 20 20 20 63 6f 64 65 54 61 62 6c 65  .      codeTable
15c0: 4c 6f 63 6b 73 28 70 50 61 72 73 65 29 3b 0a 0a  Locks(pParse);..
15d0: 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
15e0: 69 7a 65 20 61 6e 79 20 41 55 54 4f 49 4e 43 52  ize any AUTOINCR
15f0: 45 4d 45 4e 54 20 64 61 74 61 20 73 74 72 75 63  EMENT data struc
1600: 74 75 72 65 73 20 72 65 71 75 69 72 65 64 2e 0a  tures required..
1610: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
1620: 71 6c 69 74 65 33 41 75 74 6f 69 6e 63 72 65 6d  qlite3Autoincrem
1630: 65 6e 74 42 65 67 69 6e 28 70 50 61 72 73 65 29  entBegin(pParse)
1640: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 61  ;..      /* Fina
1650: 6c 6c 79 2c 20 6a 75 6d 70 20 62 61 63 6b 20 74  lly, jump back t
1660: 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
1670: 6f 66 20 74 68 65 20 65 78 65 63 75 74 61 62 6c  of the executabl
1680: 65 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20  e code. */.     
1690: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16a0: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
16b0: 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  , pParse->cookie
16c0: 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Goto);.    }.  }
16d0: 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ...  /* Get the 
16e0: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65 61  VDBE program rea
16f0: 64 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  dy for execution
1700: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26  .  */.  if( v &&
1710: 20 41 4c 57 41 59 53 28 70 50 61 72 73 65 2d 3e   ALWAYS(pParse->
1720: 6e 45 72 72 3d 3d 30 29 20 26 26 20 21 64 62 2d  nErr==0) && !db-
1730: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1740: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1750: 45 42 55 47 0a 20 20 20 20 46 49 4c 45 20 2a 74  EBUG.    FILE *t
1760: 72 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67  race = (db->flag
1770: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54  s & SQLITE_VdbeT
1780: 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75  race)!=0 ? stdou
1790: 74 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  t : 0;.    sqlit
17a0: 65 33 56 64 62 65 54 72 61 63 65 28 76 2c 20 74  e3VdbeTrace(v, t
17b0: 72 61 63 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  race);.#endif.  
17c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
17d0: 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 30  ->iCacheLevel==0
17e0: 20 29 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 73   );  /* Disables
17f0: 20 61 6e 64 20 72 65 2d 65 6e 61 62 6c 65 73 20   and re-enables 
1800: 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 2f 2a 20  match */.    /* 
1810: 41 20 6d 69 6e 69 6d 75 6d 20 6f 66 20 6f 6e 65  A minimum of one
1820: 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 69   cursor is requi
1830: 72 65 64 20 69 66 20 61 75 74 6f 69 6e 63 72 65  red if autoincre
1840: 6d 65 6e 74 20 69 73 20 75 73 65 64 0a 20 20 20  ment is used.   
1850: 20 2a 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b   *  See ticket [
1860: 61 36 39 36 33 37 39 63 31 66 30 38 38 36 36 5d  a696379c1f08866]
1870: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 72   */.    if( pPar
1880: 73 65 2d 3e 70 41 69 6e 63 21 3d 30 20 26 26 20  se->pAinc!=0 && 
1890: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 30 20  pParse->nTab==0 
18a0: 29 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d  ) pParse->nTab =
18b0: 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   1;.    sqlite3V
18c0: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 76 2c 20  dbeMakeReady(v, 
18d0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 70 50  pParse->nVar, pP
18e0: 61 72 73 65 2d 3e 6e 4d 65 6d 2c 0a 20 20 20 20  arse->nMem,.    
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1900: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
1910: 62 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41  b, pParse->nMaxA
1920: 72 67 2c 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  rg, pParse->expl
1930: 61 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ain,.           
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
1950: 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69  arse->isMultiWri
1960: 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61  te && pParse->ma
1970: 79 41 62 6f 72 74 29 3b 0a 20 20 20 20 70 50 61  yAbort);.    pPa
1980: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
1990: 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73  _DONE;.    pPars
19a0: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
19b0: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
19c0: 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49  pParse->rc==SQLI
19d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
19e0: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
19f0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50  _ERROR;.  }.  pP
1a00: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a  arse->nTab = 0;.
1a10: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
1a20: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53   0;.  pParse->nS
1a30: 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  et = 0;.  pParse
1a40: 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70 50  ->nVar = 0;.  pP
1a50: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
1a60: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
1a70: 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a  cookieGoto = 0;.
1a80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65  }../*.** Run the
1a90: 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65   parser and code
1aa0: 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72   generator recur
1ab0: 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20  sively in order 
1ac0: 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63  to generate.** c
1ad0: 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20  ode for the SQL 
1ae0: 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20  statement given 
1af0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
1b00: 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65  the pParse conte
1b10: 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  xt.** currently 
1b20: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1b30: 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61  on.  When the pa
1b40: 72 73 65 72 20 69 73 20 72 75 6e 20 72 65 63 75  rser is run recu
1b50: 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20  rsively.** this 
1b60: 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f  way, the final O
1b70: 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70  P_Halt is not ap
1b80: 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72  pended and other
1b90: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
1ba0: 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74  ** and finalizat
1bb0: 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d  ion steps are om
1bc0: 69 74 74 65 64 20 62 65 63 61 75 73 65 20 74 68  itted because th
1bd0: 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67  ose are handling
1be0: 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72   by the.** outer
1bf0: 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a  most parser..**.
1c00: 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e  ** Not everythin
1c10: 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20  g is nestable.  
1c20: 54 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73  This facility is
1c30: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72   designed to per
1c40: 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55  mit.** INSERT, U
1c50: 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54  PDATE, and DELET
1c60: 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61  E operations aga
1c70: 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54  inst SQLITE_MAST
1c80: 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65  ER.  Use.** care
1c90: 20 69 66 20 79 6f 75 20 64 65 63 69 64 65 20 74   if you decide t
1ca0: 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 69  o try to use thi
1cb0: 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f  s routine for so
1cc0: 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
1cd0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1ce0: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 50 61  e3NestedParse(Pa
1cf0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
1d00: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
1d10: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
1d20: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t ap;.  char *zS
1d30: 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ql;.  char *zErr
1d40: 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Msg = 0;.  sqlit
1d50: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1d60: 3e 64 62 3b 0a 23 20 64 65 66 69 6e 65 20 53 41  >db;.# define SA
1d70: 56 45 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28 50  VE_SZ  (sizeof(P
1d80: 61 72 73 65 29 20 2d 20 6f 66 66 73 65 74 6f 66  arse) - offsetof
1d90: 28 50 61 72 73 65 2c 6e 56 61 72 29 29 0a 20 20  (Parse,nVar)).  
1da0: 63 68 61 72 20 73 61 76 65 42 75 66 5b 53 41 56  char saveBuf[SAV
1db0: 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50  E_SZ];..  if( pP
1dc0: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
1dd0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
1de0: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30  Parse->nested<10
1df0: 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20   );  /* Nesting 
1e00: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f  should only be o
1e10: 66 20 6c 69 6d 69 74 65 64 20 64 65 70 74 68 20  f limited depth 
1e20: 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  */.  va_start(ap
1e30: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53  , zFormat);.  zS
1e40: 71 6c 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  ql = sqlite3VMPr
1e50: 69 6e 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74  intf(db, zFormat
1e60: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
1e70: 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d  ap);.  if( zSql=
1e80: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1e90: 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20  ;   /* A malloc 
1ea0: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
1eb0: 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73 65   */.  }.  pParse
1ec0: 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65  ->nested++;.  me
1ed0: 6d 63 70 79 28 73 61 76 65 42 75 66 2c 20 26 70  mcpy(saveBuf, &p
1ee0: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56  Parse->nVar, SAV
1ef0: 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28  E_SZ);.  memset(
1f00: 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30  &pParse->nVar, 0
1f10: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73 71  , SAVE_SZ);.  sq
1f20: 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28 70  lite3RunParser(p
1f30: 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a 45  Parse, zSql, &zE
1f40: 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
1f50: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72  3DbFree(db, zErr
1f60: 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Msg);.  sqlite3D
1f70: 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b  bFree(db, zSql);
1f80: 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61 72 73  .  memcpy(&pPars
1f90: 65 2d 3e 6e 56 61 72 2c 20 73 61 76 65 42 75 66  e->nVar, saveBuf
1fa0: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50  , SAVE_SZ);.  pP
1fb0: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a  arse->nested--;.
1fc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
1fd0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
1fe0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
1ff0: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
2000: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
2010: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
2020: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
2030: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
2040: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
2050: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
2060: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
2070: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
2080: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
2090: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
20a0: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
20b0: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
20c0: 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  ched for the tab
20d0: 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69  le and the.** fi
20e0: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
20f0: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
2100: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f   (No checking fo
2110: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
2120: 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f  e.** names is do
2130: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
2140: 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66   order is TEMP f
2150: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2160: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78   then any.** aux
2170: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
2180: 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65   added using the
2190: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
21a0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
21b0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
21c0: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
21d0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
21e0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
21f0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2200: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
2210: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
2220: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
2230: 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20  ;.  int nName;. 
2240: 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d   assert( zName!=
2250: 30 20 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73  0 );.  nName = s
2260: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2270: 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 4f  Name);.  for(i=O
2280: 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62  MIT_TEMPDB; i<db
2290: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
22a0: 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f   int j = (i<2) ?
22b0: 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53   i^1 : i;   /* S
22c0: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
22d0: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66  e MAIN */.    if
22e0: 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26  ( zDatabase!=0 &
22f0: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
2300: 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e  (zDatabase, db->
2310: 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20  aDb[j].zName) ) 
2320: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20  continue;.    p 
2330: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
2340: 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53  d(&db->aDb[j].pS
2350: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
2360: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
2370: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
2380: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
2390: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
23a0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
23b0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
23c0: 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69  escribes a parti
23d0: 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a  cular database.*
23e0: 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68  * table given th
23f0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74  e name of that t
2400: 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e  able and (option
2410: 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f  ally) the name o
2420: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
2430: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
2440: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
2450: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
2460: 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61  d.  Also leave a
2470: 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61  n.** error messa
2480: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
2490: 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rrMsg..**.** The
24a0: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
24b0: 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
24c0: 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64   and sqlite3Find
24d0: 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74 20  Table() is that 
24e0: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
24f0: 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20  leaves an error 
2500: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
2510: 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65  e->zErrMsg where
2520: 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54  .** sqlite3FindT
2530: 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e  able() does not.
2540: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
2550: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a 20  e3LocateTable(. 
2560: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2570: 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65          /* conte
2580: 78 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 72  xt in which to r
2590: 65 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a  eport errors */.
25a0: 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20    int isView,   
25b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
25c0: 20 69 66 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20   if looking for 
25d0: 61 20 56 49 45 57 20 72 61 74 68 65 72 20 74 68  a VIEW rather th
25e0: 61 6e 20 61 20 54 41 42 4c 45 20 2a 2f 0a 20 20  an a TABLE */.  
25f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2600: 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  e,     /* Name o
2610: 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61  f the table we a
2620: 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a  re looking for *
2630: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2640: 7a 44 62 61 73 65 20 20 20 20 20 2f 2a 20 4e 61  zDbase     /* Na
2650: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
2660: 73 65 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55  se.  Might be NU
2670: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  LL */.){.  Table
2680: 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20   *p;..  /* Read 
2690: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
26a0: 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ema. If an error
26b0: 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
26c0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
26d0: 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e    ** and code in
26e0: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
26f0: 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66  rn NULL. */.  if
2700: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
2710: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
2720: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
2730: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70  turn 0;.  }..  p
2740: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
2750: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
2760: 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a  zName, zDbase);.
2770: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
2780: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
2790: 73 67 20 3d 20 69 73 56 69 65 77 20 3f 20 22 6e  sg = isView ? "n
27a0: 6f 20 73 75 63 68 20 76 69 65 77 22 20 3a 20 22  o such view" : "
27b0: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 22 3b 0a  no such table";.
27c0: 20 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29      if( zDbase )
27d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
27e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
27f0: 22 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d 73  "%s: %s.%s", zMs
2800: 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65  g, zDbase, zName
2810: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2820: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2830: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a  Msg(pParse, "%s:
2840: 20 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 4e 61 6d   %s", zMsg, zNam
2850: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  e);.    }.    pP
2860: 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
2870: 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  a = 1;.  }.  ret
2880: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
2890: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
28a0: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
28b0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a  hat describes .*
28c0: 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  * a particular i
28d0: 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e  ndex given the n
28e0: 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65  ame of that inde
28f0: 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d  x.** and the nam
2900: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2910: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
2920: 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65  the index..** Re
2930: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
2940: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
2950: 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c   zDatabase is 0,
2960: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61   all databases a
2970: 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  re searched for 
2980: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64  the.** table and
2990: 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
29a0: 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65 74  ing index is ret
29b0: 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63  urned.  (No chec
29c0: 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c  king.** for dupl
29d0: 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65  icate index name
29e0: 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65  s is done.)  The
29f0: 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73   search order is
2a00: 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20  .** TEMP first, 
2a10: 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20  then MAIN, then 
2a20: 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61  any auxiliary da
2a30: 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a  tabases added.**
2a40: 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43   using the ATTAC
2a50: 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e  H command..*/.In
2a60: 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  dex *sqlite3Find
2a70: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
2a80: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
2a90: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
2aa0: 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20   *zDb){.  Index 
2ab0: 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  *p = 0;.  int i;
2ac0: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73  .  int nName = s
2ad0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2ae0: 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 4f  Name);.  for(i=O
2af0: 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62  MIT_TEMPDB; i<db
2b00: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
2b10: 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f   int j = (i<2) ?
2b20: 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65   i^1 : i;  /* Se
2b30: 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65  arch TEMP before
2b40: 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63 68   MAIN */.    Sch
2b50: 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64  ema *pSchema = d
2b60: 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d  b->aDb[j].pSchem
2b70: 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  a;.    assert( p
2b80: 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66  Schema );.    if
2b90: 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33  ( zDb && sqlite3
2ba0: 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d  StrICmp(zDb, db-
2bb0: 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29  >aDb[j].zName) )
2bc0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
2bd0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
2be0: 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  nd(&pSchema->idx
2bf0: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Hash, zName, nNa
2c00: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  me);.    if( p )
2c10: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
2c20: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
2c30: 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d   Reclaim the mem
2c40: 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e 20 69  ory used by an i
2c50: 6e 64 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ndex.*/.static v
2c60: 6f 69 64 20 66 72 65 65 49 6e 64 65 78 28 49 6e  oid freeIndex(In
2c70: 64 65 78 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dex *p){.  sqlit
2c80: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 70 54 61 62  e3 *db = p->pTab
2c90: 6c 65 2d 3e 64 62 4d 65 6d 3b 0a 23 69 66 6e 64  le->dbMem;.#ifnd
2ca0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2cb0: 4e 41 4c 59 5a 45 0a 20 20 73 71 6c 69 74 65 33  NALYZE.  sqlite3
2cc0: 44 65 6c 65 74 65 49 6e 64 65 78 53 61 6d 70 6c  DeleteIndexSampl
2cd0: 65 73 28 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20  es(p);.#endif.  
2ce0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2cf0: 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  , p->zColAff);. 
2d00: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2d10: 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
2d20: 52 65 6d 6f 76 65 20 74 68 65 20 67 69 76 65 6e  Remove the given
2d30: 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20   index from the 
2d40: 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
2d50: 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74  , and free.** it
2d60: 73 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  s memory structu
2d70: 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  res..**.** The i
2d80: 6e 64 65 78 20 69 73 20 72 65 6d 6f 76 65 64 20  ndex is removed 
2d90: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2da0: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 62 75  e hash tables bu
2db0: 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 75  t.** it is not u
2dc0: 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65  nlinked from the
2dd0: 20 54 61 62 6c 65 20 74 68 61 74 20 69 74 20 69   Table that it i
2de0: 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e  ndexes..** Unlin
2df0: 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 54 61  king from the Ta
2e00: 62 6c 65 20 6d 75 73 74 20 62 65 20 64 6f 6e 65  ble must be done
2e10: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
2e20: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
2e30: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
2e40: 44 65 6c 65 74 65 49 6e 64 65 78 28 49 6e 64 65  DeleteIndex(Inde
2e50: 78 20 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a  x *p){.  Index *
2e60: 70 4f 6c 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68  pOld;.  const ch
2e70: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 2d 3e 7a  ar *zName = p->z
2e80: 4e 61 6d 65 3b 0a 0a 20 20 70 4f 6c 64 20 3d 20  Name;..  pOld = 
2e90: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
2ea0: 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 69  t(&p->pSchema->i
2eb0: 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 0a 20  dxHash, zName,. 
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2ee0: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
2ef0: 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
2f00: 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d  pOld==0 || pOld=
2f10: 3d 70 20 29 3b 0a 20 20 66 72 65 65 49 6e 64 65  =p );.  freeInde
2f20: 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  x(p);.}../*.** F
2f30: 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c  or the index cal
2f40: 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69  led zIdxName whi
2f50: 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74  ch is found in t
2f60: 68 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c  he database iDb,
2f70: 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20  .** unlike that 
2f80: 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54  index from its T
2f90: 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65  able then remove
2fa0: 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a   the index from.
2fb0: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  ** the index has
2fc0: 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65  h table and free
2fd0: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75   all memory stru
2fe0: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
2ff0: 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  d.** with the in
3000: 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  dex..*/.void sql
3010: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
3020: 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  eteIndex(sqlite3
3030: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
3040: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e  onst char *zIdxN
3050: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
3060: 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6c 65 6e  Index;.  int len
3070: 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 20  ;.  Hash *pHash 
3080: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  = &db->aDb[iDb].
3090: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
30a0: 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74  ;..  len = sqlit
30b0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 64 78 4e  e3Strlen30(zIdxN
30c0: 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d  ame);.  pIndex =
30d0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
30e0: 72 74 28 70 48 61 73 68 2c 20 7a 49 64 78 4e 61  rt(pHash, zIdxNa
30f0: 6d 65 2c 20 6c 65 6e 2c 20 30 29 3b 0a 20 20 69  me, len, 0);.  i
3100: 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
3110: 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61   if( pIndex->pTa
3120: 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e  ble->pIndex==pIn
3130: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  dex ){.      pIn
3140: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
3150: 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  dex = pIndex->pN
3160: 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
3170: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a        Index *p;.
3180: 20 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69        /* Justifi
3190: 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53  cation of ALWAYS
31a0: 28 29 3b 20 20 54 68 65 20 69 6e 64 65 78 20 6d  ();  The index m
31b0: 75 73 74 20 62 65 20 6f 6e 20 74 68 65 20 6c 69  ust be on the li
31c0: 73 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69  st of.      ** i
31d0: 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20  ndices. */.     
31e0: 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61   p = pIndex->pTa
31f0: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  ble->pIndex;.   
3200: 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
3210: 28 70 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 21  (p) && p->pNext!
3220: 3d 70 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 70  =pIndex ){ p = p
3230: 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20  ->pNext; }.     
3240: 20 69 66 28 20 41 4c 57 41 59 53 28 70 20 26 26   if( ALWAYS(p &&
3250: 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65   p->pNext==pInde
3260: 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  x) ){.        p-
3270: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d  >pNext = pIndex-
3280: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
3290: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e      }.    freeIn
32a0: 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d  dex(pIndex);.  }
32b0: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20  .  db->flags |= 
32c0: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
32d0: 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  nges;.}../*.** E
32e0: 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20  rase all schema 
32f0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
3300: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68   the in-memory h
3310: 61 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a  ash tables of.**
3320: 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
3330: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
3340: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  e is called to r
3350: 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a  eclaim memory.**
3360: 20 62 65 66 6f 72 65 20 74 68 65 20 64 61 74 61   before the data
3370: 62 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49 74  base closes.  It
3380: 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20   is also called 
3390: 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
33a0: 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65  k.** if there we
33b0: 72 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  re schema change
33c0: 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61  s during the tra
33d0: 6e 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20 61  nsaction or if a
33e0: 0a 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69  .** schema-cooki
33f0: 65 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75 72  e mismatch occur
3400: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3d  s..**.** If iDb=
3410: 3d 30 20 74 68 65 6e 20 72 65 73 65 74 20 74 68  =0 then reset th
3420: 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  e internal schem
3430: 61 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c  a tables for all
3440: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
3450: 65 73 2e 20 20 49 66 20 69 44 62 3e 3d 31 20 74  es.  If iDb>=1 t
3460: 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e  hen reset the in
3470: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f  ternal schema fo
3480: 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69  r only the.** si
3490: 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61  ngle file indica
34a0: 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
34b0: 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
34c0: 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20  lSchema(sqlite3 
34d0: 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  *db, int iDb){. 
34e0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 73 73   int i, j;.  ass
34f0: 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
3500: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20  Db<db->nDb );.. 
3510: 20 69 66 28 20 69 44 62 3d 3d 30 20 29 7b 0a 20   if( iDb==0 ){. 
3520: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
3530: 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 7d  nterAll(db);.  }
3540: 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c  .  for(i=iDb; i<
3550: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3560: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
3570: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
3580: 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 29  ( pDb->pSchema )
3590: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 69  {.      assert(i
35a0: 3d 3d 31 20 7c 7c 20 28 70 44 62 2d 3e 70 42 74  ==1 || (pDb->pBt
35b0: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
35c0: 48 6f 6c 64 73 4d 75 74 65 78 28 70 44 62 2d 3e  HoldsMutex(pDb->
35d0: 70 42 74 29 29 29 3b 0a 20 20 20 20 20 20 73 71  pBt)));.      sq
35e0: 6c 69 74 65 33 53 63 68 65 6d 61 46 72 65 65 28  lite3SchemaFree(
35f0: 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pDb->pSchema);. 
3600: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44 62     }.    if( iDb
3610: 3e 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d  >0 ) return;.  }
3620: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d  .  assert( iDb==
3630: 30 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  0 );.  db->flags
3640: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65   &= ~SQLITE_Inte
3650: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71 6c  rnChanges;.  sql
3660: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69  ite3VtabUnlockLi
3670: 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  st(db);.  sqlite
3680: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
3690: 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65  b);..  /* If one
36a0: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
36b0: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
36c0: 73 65 20 66 69 6c 65 73 20 68 61 73 20 62 65 65  se files has bee
36d0: 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20 74  n closed,.  ** t
36e0: 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 6d 20  hen remove them 
36f0: 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c 69 61  from the auxilia
3700: 72 79 20 64 61 74 61 62 61 73 65 20 6c 69 73 74  ry database list
3710: 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65 0a 20  .  We take the. 
3720: 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   ** opportunity 
3730: 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72 65 20  to do this here 
3740: 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6a 75  since we have ju
3750: 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c 20 6f  st deleted all o
3760: 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68 65 6d  f the.  ** schem
3770: 61 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  a hash tables an
3780: 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f 20 6e  d therefore do n
3790: 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20  ot have to make 
37a0: 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a  any changes.  **
37b0: 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73 65   to any of those
37c0: 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
37d0: 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d  for(i=j=2; i<db-
37e0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
37f0: 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d  struct Db *pDb =
3800: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20   &db->aDb[i];.  
3810: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d    if( pDb->pBt==
3820: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
3830: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 62  e3DbFree(db, pDb
3840: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
3850: 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  pDb->zName = 0;.
3860: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
3870: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c      }.    if( j<
3880: 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61  i ){.      db->a
3890: 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b  Db[j] = db->aDb[
38a0: 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b  i];.    }.    j+
38b0: 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  +;.  }.  memset(
38c0: 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20  &db->aDb[j], 0, 
38d0: 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65  (db->nDb-j)*size
38e0: 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b  of(db->aDb[j]));
38f0: 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a  .  db->nDb = j;.
3900: 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32    if( db->nDb<=2
3910: 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d   && db->aDb!=db-
3920: 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20  >aDbStatic ){.  
3930: 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62    memcpy(db->aDb
3940: 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c  Static, db->aDb,
3950: 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44   2*sizeof(db->aD
3960: 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69  b[0]));.    sqli
3970: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 64 62  te3DbFree(db, db
3980: 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e  ->aDb);.    db->
3990: 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61  aDb = db->aDbSta
39a0: 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  tic;.  }.}../*.*
39b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
39c0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
39d0: 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a  commit occurs..*
39e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
39f0: 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
3a00: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
3a10: 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  {.  db->flags &=
3a20: 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43   ~SQLITE_InternC
3a30: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
3a40: 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   Clear the colum
3a50: 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 61 20 74  n names from a t
3a60: 61 62 6c 65 20 6f 72 20 76 69 65 77 2e 0a 2a 2f  able or view..*/
3a70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
3a80: 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61  iteResetColumnNa
3a90: 6d 65 73 28 54 61 62 6c 65 20 2a 70 54 61 62 6c  mes(Table *pTabl
3aa0: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43  e){.  int i;.  C
3ab0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73  olumn *pCol;.  s
3ac0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 54 61  qlite3 *db = pTa
3ad0: 62 6c 65 2d 3e 64 62 4d 65 6d 3b 0a 20 20 74 65  ble->dbMem;.  te
3ae0: 73 74 63 61 73 65 28 20 64 62 3d 3d 30 20 29 3b  stcase( db==0 );
3af0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
3b00: 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70  e!=0 );.  if( (p
3b10: 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43  Col = pTable->aC
3b20: 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f  ol)!=0 ){.    fo
3b30: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d  r(i=0; i<pTable-
3b40: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
3b50: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
3b60: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
3b70: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
3b80: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
3b90: 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66  te(db, pCol->pDf
3ba0: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
3bb0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
3bc0: 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 20  l->zDflt);.     
3bd0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3be0: 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b  b, pCol->zType);
3bf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
3c00: 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a  Free(db, pCol->z
3c10: 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Coll);.    }.   
3c20: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3c30: 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29  b, pTable->aCol)
3c40: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e  ;.  }.  pTable->
3c50: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  aCol = 0;.  pTab
3c60: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a  le->nCol = 0;.}.
3c70: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
3c80: 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74  e memory data st
3c90: 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61  ructures associa
3ca0: 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76  ted with the giv
3cb0: 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f  en.** Table.  No
3cc0: 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
3cd0: 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69  e to disk by thi
3ce0: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
3cf0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
3d00: 73 74 20 64 65 6c 65 74 65 73 20 74 68 65 20 64  st deletes the d
3d10: 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20 20  ata structure.  
3d20: 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69  It does not unli
3d30: 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  nk.** the table 
3d40: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 66  data structure f
3d50: 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62  rom the hash tab
3d60: 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73  le.  But it does
3d70: 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f   destroy.** memo
3d80: 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f 66  ry structures of
3d90: 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64   the indices and
3da0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73   foreign keys as
3db0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a  sociated with .*
3dc0: 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  * the table..*/.
3dd0: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65  void sqlite3Dele
3de0: 74 65 54 61 62 6c 65 28 54 61 62 6c 65 20 2a 70  teTable(Table *p
3df0: 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20  Table){.  Index 
3e00: 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b  *pIndex, *pNext;
3e10: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
3e20: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
3e30: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20   ) return;.  db 
3e40: 3d 20 70 54 61 62 6c 65 2d 3e 64 62 4d 65 6d 3b  = pTable->dbMem;
3e50: 0a 20 20 74 65 73 74 63 61 73 65 28 20 64 62 3d  .  testcase( db=
3e60: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e  =0 );..  /* Do n
3e70: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 74 61  ot delete the ta
3e80: 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65  ble until the re
3e90: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65  ference count re
3ea0: 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20  aches zero. */. 
3eb0: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 2d 2d 3b   pTable->nRef--;
3ec0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
3ed0: 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  Ref>0 ){.    ret
3ee0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
3ef0: 74 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3d  t( pTable->nRef=
3f00: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  =0 );..  /* Dele
3f10: 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61  te all indices a
3f20: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
3f30: 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20  his table.  */. 
3f40: 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54   for(pIndex = pT
3f50: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49  able->pIndex; pI
3f60: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65  ndex; pIndex=pNe
3f70: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
3f80: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
3f90: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
3fa0: 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  ex->pSchema==pTa
3fb0: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  ble->pSchema );.
3fc0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
3fd0: 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a  eIndex(pIndex);.
3fe0: 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
3ff0: 20 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79   any foreign key
4000: 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  s attached to th
4010: 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73  is table. */.  s
4020: 71 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28 70  qlite3FkDelete(p
4030: 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65  Table);..  /* De
4040: 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73  lete the Table s
4050: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
4060: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 52 65  .  */.  sqliteRe
4070: 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  setColumnNames(p
4080: 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65  Table);.  sqlite
4090: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
40a0: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  le->zName);.  sq
40b0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
40c0: 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29  pTable->zColAff)
40d0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
40e0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62  tDelete(db, pTab
40f0: 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 23 69  le->pSelect);.#i
4100: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4110: 54 5f 43 48 45 43 4b 0a 20 20 73 71 6c 69 74 65  T_CHECK.  sqlite
4120: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
4130: 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b  pTable->pCheck);
4140: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
4150: 33 56 74 61 62 43 6c 65 61 72 28 70 54 61 62 6c  3VtabClear(pTabl
4160: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
4170: 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ree(db, pTable);
4180: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
4190: 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65   the given table
41a0: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
41b0: 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65  ables and the de
41c0: 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c  lete the.** tabl
41d0: 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  e structure with
41e0: 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73   all its indices
41f0: 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79   and foreign key
4200: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
4210: 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
4220: 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  eTable(sqlite3 *
4230: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e  db, int iDb, con
4240: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d  st char *zTabNam
4250: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
4260: 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73    Db *pDb;..  as
4270: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
4280: 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
4290: 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
42a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61 62  ;.  assert( zTab
42b0: 4e 61 6d 65 20 26 26 20 7a 54 61 62 4e 61 6d 65  Name && zTabName
42c0: 5b 30 5d 20 29 3b 0a 20 20 70 44 62 20 3d 20 26  [0] );.  pDb = &
42d0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
42e0: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
42f0: 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68  nsert(&pDb->pSch
4300: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54  ema->tblHash, zT
4310: 61 62 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  abName,.        
4320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4330: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
4340: 7a 54 61 62 4e 61 6d 65 29 2c 30 29 3b 0a 20 20  zTabName),0);.  
4350: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
4360: 6c 65 28 70 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  le(p);.  db->fla
4370: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
4380: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
4390: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b  *.** Given a tok
43a0: 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72  en, return a str
43b0: 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74  ing that consist
43c0: 73 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66  s of the text of
43d0: 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20   that.** token. 
43e0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
43f0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
4400: 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65  ng.** is obtaine
4410: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
4420: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
4430: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
4440: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
4450: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75  on..**.** Any qu
4460: 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 20 28 65  otation marks (e
4470: 78 3a 20 20 22 6e 61 6d 65 22 2c 20 27 6e 61 6d  x:  "name", 'nam
4480: 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60  e', [name], or `
4490: 6e 61 6d 65 60 29 20 74 68 61 74 0a 2a 2a 20 73  name`) that.** s
44a0: 75 72 72 6f 75 6e 64 20 74 68 65 20 62 6f 64 79  urround the body
44b0: 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 61 72   of the token ar
44c0: 65 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a  e removed..**.**
44d0: 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74 65   Tokens are ofte
44e0: 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20  n just pointers 
44f0: 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
4500: 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73  l SQL text and s
4510: 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30  o.** are not \00
4520: 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64  0 terminated and
4530: 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74   are not persist
4540: 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ent.  The return
4550: 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20  ed string.** is 
4560: 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20  \000 terminated 
4570: 61 6e 64 20 69 73 20 70 65 72 73 69 73 74 65 6e  and is persisten
4580: 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  t..*/.char *sqli
4590: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
45a0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f  (sqlite3 *db, To
45b0: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63  ken *pName){.  c
45c0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66  har *zName;.  if
45d0: 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
45e0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
45f0: 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61  StrNDup(db, (cha
4600: 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  r*)pName->z, pNa
4610: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69  me->n);.    sqli
4620: 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65  te3Dequote(zName
4630: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
4640: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  zName = 0;.  }. 
4650: 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
4660: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
4670: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
4680: 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64  able stored in d
4690: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69  atabase number i
46a0: 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  Db for.** writin
46b0: 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  g. The table is 
46c0: 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72  opened using cur
46d0: 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73  sor 0..*/.void s
46e0: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
46f0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20  Table(Parse *p, 
4700: 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
4710: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
4720: 56 64 62 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  Vdbe(p);.  sqlit
4730: 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69  e3TableLock(p, i
4740: 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  Db, MASTER_ROOT,
4750: 20 31 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45   1, SCHEMA_TABLE
4760: 28 69 44 62 29 29 3b 0a 20 20 73 71 6c 69 74 65  (iDb));.  sqlite
4770: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4780: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20  P_OpenWrite, 0, 
4790: 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69 44 62  MASTER_ROOT, iDb
47a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
47b0: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
47c0: 28 63 68 61 72 20 2a 29 35 2c 20 50 34 5f 49 4e  (char *)5, P4_IN
47d0: 54 33 32 29 3b 20 20 2f 2a 20 35 20 63 6f 6c 75  T32);  /* 5 colu
47e0: 6d 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66  mn table */.  if
47f0: 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a  ( p->nTab==0 ){.
4800: 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b      p->nTab = 1;
4810: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  .  }.}../*.** Pa
4820: 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f  rameter zName po
4830: 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65  ints to a nul-te
4840: 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72 20  rminated buffer 
4850: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
4860: 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61  ame.** of a data
4870: 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74  base ("main", "t
4880: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
4890: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
48a0: 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  db). This.** fun
48b0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
48c0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
48d0: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
48e0: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a   db->aDb[], or.*
48f0: 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  * -1 if the name
4900: 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66  d db cannot be f
4910: 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
4920: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73  ite3FindDbName(s
4930: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
4940: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
4950: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20    int i = -1;   
4960: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
4970: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66  e number */.  if
4980: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44  ( zName ){.    D
4990: 62 20 2a 70 44 62 3b 0a 20 20 20 20 69 6e 74 20  b *pDb;.    int 
49a0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
49b0: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n30(zName);.    
49c0: 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31  for(i=(db->nDb-1
49d0: 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b  ), pDb=&db->aDb[
49e0: 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  i]; i>=0; i--, p
49f0: 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28  Db--){.      if(
4a00: 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c   (!OMIT_TEMPDB |
4a10: 7c 20 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d 73  | i!=1 ) && n==s
4a20: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
4a30: 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20  Db->zName) && . 
4a40: 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69           0==sqli
4a50: 74 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d 3e  te3StrICmp(pDb->
4a60: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  zName, zName) ){
4a70: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4a80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4a90: 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  }.  return i;.}.
4aa0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e  ./*.** The token
4ab0: 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73   *pName contains
4ac0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   the name of a d
4ad0: 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20  atabase (either 
4ae0: 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65  "main" or.** "te
4af0: 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20  mp" or the name 
4b00: 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  of an attached d
4b10: 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  b). This routine
4b20: 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20   returns the.** 
4b30: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d  index of the nam
4b40: 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64  ed database in d
4b50: 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20  b->aDb[], or -1 
4b60: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20  if the named db 
4b70: 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
4b80: 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  st..*/.int sqlit
4b90: 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33  e3FindDb(sqlite3
4ba0: 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61   *db, Token *pNa
4bb0: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  me){.  int i;   
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
4be0: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a  atabase number *
4bf0: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
4c20: 20 77 65 20 61 72 65 20 73 65 61 72 63 68 69 6e   we are searchin
4c30: 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65  g for */.  zName
4c40: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
4c50: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
4c60: 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65  e);.  i = sqlite
4c70: 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
4c80: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
4c90: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
4ca0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  e);.  return i;.
4cb0: 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  }../* The table 
4cc0: 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67 67  or view or trigg
4cd0: 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65  er name is passe
4ce0: 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  d to this routin
4cf0: 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20  e via tokens.** 
4d00: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
4d10: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
4d20: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
4d30: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
4d40: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45  ample:.**.** CRE
4d50: 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79  ATE TABLE xxx.yy
4d60: 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20  y (...);.** .** 
4d70: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
4d80: 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20  et to "xxx" and 
4d90: 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e  pName2 "yyy". On
4da0: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
4db0: 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  if.** the table 
4dc0: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c  name is not full
4dd0: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65  y qualified, i.e
4de0: 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  .:.**.** CREATE 
4df0: 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a  TABLE yyy(...);.
4e00: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  **.** Then pName
4e10: 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79  1 is set to "yyy
4e20: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20  " and pName2 is 
4e30: 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ""..**.** This r
4e40: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
4e50: 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65  *ppUnqual pointe
4e60: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
4e70: 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20  e token (pName1 
4e80: 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68  or.** pName2) th
4e90: 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e  at stores the un
4ea0: 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20  qualified table 
4eb0: 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78  name.  The index
4ec0: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
4ed0: 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65 74  ase "xxx" is ret
4ee0: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
4ef0: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
4f00: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4f10: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  e,      /* Parsi
4f20: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
4f30: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
4f40: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
4f50: 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  1,      /* The "
4f60: 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  xxx" in the name
4f70: 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78   "xxx.yyy" or "x
4f80: 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  xx" */.  Token *
4f90: 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20  pName2,      /* 
4fa0: 54 68 65 20 22 79 79 79 22 20 69 6e 20 74 68 65  The "yyy" in the
4fb0: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
4fc0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e  */.  Token **pUn
4fd0: 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74  qual     /* Writ
4fe0: 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  e the unqualifie
4ff0: 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65  d object name he
5000: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  re */.){.  int i
5010: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
5020: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
5030: 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f  se holding the o
5040: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
5050: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
5060: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41  >db;..  if( ALWA
5070: 59 53 28 70 4e 61 6d 65 32 21 3d 30 29 20 26 26  YS(pName2!=0) &&
5080: 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a   pName2->n>0 ){.
5090: 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74      if( db->init
50a0: 2e 62 75 73 79 20 29 20 7b 0a 20 20 20 20 20 20  .busy ) {.      
50b0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
50c0: 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74  pParse, "corrupt
50d0: 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20   database");.   
50e0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
50f0: 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  +;.      return 
5100: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  -1;.    }.    *p
5110: 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b  Unqual = pName2;
5120: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
5130: 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61  e3FindDb(db, pNa
5140: 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44  me1);.    if( iD
5150: 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  b<0 ){.      sql
5160: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5170: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61  rse, "unknown da
5180: 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d  tabase %T", pNam
5190: 65 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  e1);.      pPars
51a0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
51b0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
51c0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
51d0: 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e  ssert( db->init.
51e0: 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e  iDb==0 || db->in
51f0: 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69  it.busy );.    i
5200: 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44  Db = db->init.iD
5210: 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20  b;.    *pUnqual 
5220: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20  = pName1;.  }.  
5230: 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f  return iDb;.}../
5240: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5250: 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65  e is used to che
5260: 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38 20  ck if the UTF-8 
5270: 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20  string zName is 
5280: 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61  a legal.** unqua
5290: 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20  lified name for 
52a0: 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a  a new schema obj
52b0: 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65  ect (table, inde
52c0: 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72  x, view or.** tr
52d0: 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65  igger). All name
52e0: 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65  s are legal exce
52f0: 70 74 20 74 68 6f 73 65 20 74 68 61 74 20 62 65  pt those that be
5300: 67 69 6e 20 77 69 74 68 20 74 68 65 20 73 74 72  gin with the str
5310: 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22  ing.** "sqlite_"
5320: 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65   (in upper, lowe
5330: 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29  r or mixed case)
5340: 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f  . This portion o
5350: 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a  f the namespace.
5360: 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64 20 66  ** is reserved f
5370: 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e  or internal use.
5380: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
5390: 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50  heckObjectName(P
53a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
53b0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
53c0: 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  {.  if( !pParse-
53d0: 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  >db->init.busy &
53e0: 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  & pParse->nested
53f0: 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26  ==0 .          &
5400: 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  & (pParse->db->f
5410: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72  lags & SQLITE_Wr
5420: 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20  iteSchema)==0.  
5430: 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
5440: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e  lite3StrNICmp(zN
5450: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
5460: 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  7) ){.    sqlite
5470: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5480: 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72  , "object name r
5490: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
54a0: 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a  rnal use: %s", z
54b0: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
54c0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
54d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
54e0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
54f0: 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74   Begin construct
5500: 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ing a new table 
5510: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
5520: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
5530: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
5540: 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f  of several actio
5550: 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20  n routines that 
5560: 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65  get called in re
5570: 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43  sponse.** to a C
5580: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
5590: 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69  ement.  In parti
55a0: 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74  cular, this rout
55b0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  ine is called.**
55c0: 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f   after seeing to
55d0: 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e  kens "CREATE" an
55e0: 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68  d "TABLE" and th
55f0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68  e table name. Th
5600: 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67  e isTemp.** flag
5610: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
5620: 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  table should be 
5630: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75  stored in the au
5640: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
5650: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64  .** file instead
5660: 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   of in the main 
5670: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
5680: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
5690: 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
56a0: 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20  n the "TEMP" or 
56b0: 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77  "TEMPORARY" keyw
56c0: 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65  ord occurs in be
56d0: 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20  tween.** CREATE 
56e0: 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  and TABLE..**.**
56f0: 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   The new table r
5700: 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c  ecord is initial
5710: 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20  ized and put in 
5720: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
5730: 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66  e..** As more of
5740: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
5750: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  E statement is p
5760: 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61  arsed, additiona
5770: 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74  l action.** rout
5780: 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c  ines will be cal
5790: 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20  led to add more 
57a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
57b0: 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41  his record..** A
57c0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
57d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
57e0: 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c  atement, the sql
57f0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72  ite3EndTable() r
5800: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
5810: 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  led to complete 
5820: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  the construction
5830: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
5840: 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69  e record..*/.voi
5850: 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61  d sqlite3StartTa
5860: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
5870: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65  arse,   /* Parse
5880: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
5890: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
58a0: 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
58b0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
58c0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
58d0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
58e0: 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70  2,   /* Second p
58f0: 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20  art of the name 
5900: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
5910: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
5920: 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72  Temp,      /* Tr
5930: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
5940: 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20  TEMP table */.  
5950: 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20  int isView,     
5960: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
5970: 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20   is a VIEW */.  
5980: 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20  int isVirtual,  
5990: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
59a0: 20 69 73 20 61 20 56 49 52 54 55 41 4c 20 74 61   is a VIRTUAL ta
59b0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45  ble */.  int noE
59c0: 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  rr        /* Do 
59d0: 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65  nothing if table
59e0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
59f0: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
5a00: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
5a10: 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65  Name = 0; /* The
5a20: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77   name of the new
5a30: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
5a40: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5a50: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ->db;.  Vdbe *v;
5a60: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
5a70: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
5a80: 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65  number to create
5a90: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f   the table in */
5aa0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b  .  Token *pName;
5ab0: 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
5ac0: 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  ed name of the t
5ad0: 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a  able to create *
5ae0: 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  /..  /* The tabl
5af0: 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74  e or view name t
5b00: 6f 20 63 72 65 61 74 65 20 69 73 20 70 61 73 73  o create is pass
5b10: 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ed to this routi
5b20: 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20  ne via tokens.  
5b30: 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e  ** pName1 and pN
5b40: 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62  ame2. If the tab
5b50: 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c  le name was full
5b60: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72  y qualified, for
5b70: 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   example:.  **. 
5b80: 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
5b90: 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a   xxx.yyy (...);.
5ba0: 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20    ** .  ** Then 
5bb0: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
5bc0: 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65   "xxx" and pName
5bd0: 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20  2 "yyy". On the 
5be0: 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20  other hand if.  
5bf0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  ** the table nam
5c00: 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71  e is not fully q
5c10: 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a  ualified, i.e.:.
5c20: 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45    **.  ** CREATE
5c30: 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b   TABLE yyy(...);
5c40: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
5c50: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
5c60: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
5c70: 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20  2 is ""..  **.  
5c80: 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f  ** The call belo
5c90: 77 20 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65  w sets the pName
5ca0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e   pointer to poin
5cb0: 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28  t at the token (
5cc0: 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70  pName1 or.  ** p
5cd0: 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72  Name2) that stor
5ce0: 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  es the unqualifi
5cf0: 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54  ed table name. T
5d00: 68 65 20 76 61 72 69 61 62 6c 65 20 69 44 62 20  he variable iDb 
5d10: 69 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74  is.  ** set to t
5d20: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
5d30: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 74 68  database that th
5d40: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
5d50: 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72  is to be.  ** cr
5d60: 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20  eated in..  */. 
5d70: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
5d80: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
5d90: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
5da0: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  , &pName);.  if(
5db0: 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b   iDb<0 ) return;
5dc0: 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d  .  if( !OMIT_TEM
5dd0: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 26 26  PDB && isTemp &&
5de0: 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a   iDb>1 ){.    /*
5df0: 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74   If creating a t
5e00: 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e  emp table, the n
5e10: 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71  ame may not be q
5e20: 75 61 6c 69 66 69 65 64 20 2a 2f 0a 20 20 20 20  ualified */.    
5e30: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
5e40: 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61  pParse, "tempora
5e50: 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75  ry table name mu
5e60: 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65  st be unqualifie
5e70: 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d");.    return;
5e80: 0a 20 20 7d 0a 20 20 69 66 28 20 21 4f 4d 49 54  .  }.  if( !OMIT
5e90: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
5ea0: 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20  p ) iDb = 1;..  
5eb0: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
5ec0: 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a  en = *pName;.  z
5ed0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
5ee0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
5ef0: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
5f00: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
5f10: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
5f20: 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  !=sqlite3CheckOb
5f30: 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  jectName(pParse,
5f40: 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67   zName) ){.    g
5f50: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
5f60: 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28  error;.  }.  if(
5f70: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31   db->init.iDb==1
5f80: 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23   ) isTemp = 1;.#
5f90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5fa0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
5fb0: 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 54 65  .  assert( (isTe
5fc0: 6d 70 20 26 20 31 29 3d 3d 69 73 54 65 6d 70 20  mp & 1)==isTemp 
5fd0: 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  );.  {.    int c
5fe0: 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ode;.    char *z
5ff0: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
6000: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ].zName;.    if(
6010: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
6020: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
6030: 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f  _INSERT, SCHEMA_
6040: 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30  TABLE(isTemp), 0
6050: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
6060: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
6070: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
6080: 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
6090: 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
60a0: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
60b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
60c0: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
60d0: 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20  _TEMP_VIEW;.    
60e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
60f0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
6100: 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20  REATE_VIEW;.    
6110: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
6120: 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
6130: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
6140: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
6150: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
6160: 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  TEMP_TABLE;.    
6170: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6180: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
6190: 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20  REATE_TABLE;.   
61a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
61b0: 66 28 20 21 69 73 56 69 72 74 75 61 6c 20 26 26  f( !isVirtual &&
61c0: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
61d0: 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
61e0: 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29  zName, 0, zDb) )
61f0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  {.      goto beg
6200: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
6210: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
6220: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
6230: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e   the new table n
6240: 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c  ame does not col
6250: 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65 78 69  lide with an exi
6260: 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78  sting.  ** index
6270: 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69   or table name i
6280: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
6290: 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65  ase.  Issue an e
62a0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a  rror message if.
62b0: 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20 54 68    ** it does. Th
62c0: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69  e exception is i
62d0: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
62e0: 62 65 69 6e 67 20 70 61 72 73 65 64 20 77 61 73  being parsed was
62f0: 20 70 61 73 73 65 64 0a 20 20 2a 2a 20 74 6f 20   passed.  ** to 
6300: 61 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61  an sqlite3_decla
6310: 72 65 5f 76 74 61 62 28 29 20 63 61 6c 6c 2e 20  re_vtab() call. 
6320: 49 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c  In that case onl
6330: 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
6340: 65 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79 70 65  es.  ** and type
6350: 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20  s will be used, 
6360: 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  so there is no n
6370: 65 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20  eed to test for 
6380: 6e 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a 20 63  namespace.  ** c
6390: 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  ollisions..  */.
63a0: 20 20 69 66 28 20 21 49 4e 5f 44 45 43 4c 41 52    if( !IN_DECLAR
63b0: 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 69 66  E_VTAB ){.    if
63c0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
63d0: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
63e0: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20  Parse) ){.      
63f0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
6400: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
6410: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
6420: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
6430: 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69  zName, db->aDb[i
6440: 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db].zName);.    
6450: 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20  if( pTable ){.  
6460: 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29      if( !noErr )
6470: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6480: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6490: 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65  , "table %T alre
64a0: 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61  ady exists", pNa
64b0: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
64c0: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
64d0: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
64e0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
64f0: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
6500: 61 6d 65 2c 20 30 29 21 3d 30 20 26 26 20 28 69  ame, 0)!=0 && (i
6510: 44 62 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e 69 6e  Db==0 || !db->in
6520: 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20  it.busy) ){.    
6530: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
6540: 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
6550: 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69   is already an i
6560: 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20  ndex named %s", 
6570: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
6580: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
6590: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
65a0: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
65b0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
65c0: 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
65d0: 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  ));.  if( pTable
65e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  ==0 ){.    db->m
65f0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
6600: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
6610: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
6620: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
6630: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67  ++;.    goto beg
6640: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
6650: 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e    }.  pTable->zN
6660: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70  ame = zName;.  p
6670: 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d  Table->iPKey = -
6680: 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63  1;.  pTable->pSc
6690: 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69  hema = db->aDb[i
66a0: 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70  Db].pSchema;.  p
66b0: 54 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b  Table->nRef = 1;
66c0: 0a 20 20 70 54 61 62 6c 65 2d 3e 64 62 4d 65 6d  .  pTable->dbMem
66d0: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
66e0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
66f0: 65 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65  e==0 );.  pParse
6700: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54  ->pNewTable = pT
6710: 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  able;..  /* If t
6720: 68 69 73 20 69 73 20 74 68 65 20 6d 61 67 69 63  his is the magic
6730: 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
6740: 20 74 61 62 6c 65 20 75 73 65 64 20 62 79 20 61   table used by a
6750: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20  utoincrement,.  
6760: 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61  ** then record a
6770: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
6780: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61   table in the ma
6790: 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75  in database stru
67a0: 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68  cture.  ** so th
67b0: 61 74 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69  at INSERT can fi
67c0: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 65 61 73  nd the table eas
67d0: 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  ily..  */.#ifnde
67e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
67f0: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66  TOINCREMENT.  if
6800: 28 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  ( !pParse->neste
6810: 64 20 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d  d && strcmp(zNam
6820: 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65  e, "sqlite_seque
6830: 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nce")==0 ){.    
6840: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d  pTable->pSchema-
6850: 3e 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c  >pSeqTab = pTabl
6860: 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
6870: 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
6880: 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68  ting the code th
6890: 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74  at will insert t
68a0: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
68b0: 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51  into.  ** the SQ
68c0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
68d0: 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74  e.  Note in part
68e0: 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d  icular that we m
68f0: 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a  ust go ahead.  *
6900: 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74  * and allocate t
6910: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
6920: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65   for the table e
6930: 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72  ntry now.  Befor
6940: 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41  e any.  ** PRIMA
6950: 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
6960: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61   keywords are pa
6970: 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79  rsed.  Those key
6980: 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65  words will cause
6990: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f  .  ** indices to
69a0: 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20   be created and 
69b0: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
69c0: 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72   must come befor
69d0: 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69  e the .  ** indi
69e0: 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ces.  Hence, the
69f0: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
6a00: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73  or the table mus
6a10: 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20  t be allocated. 
6a20: 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   ** now..  */.  
6a30: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
6a40: 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74  sy && (v = sqlit
6a50: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
6a60: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))!=0 ){.    int
6a70: 20 6a 31 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c   j1;.    int fil
6a80: 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74  eFormat;.    int
6a90: 20 72 65 67 31 2c 20 72 65 67 32 2c 20 72 65 67   reg1, reg2, reg
6aa0: 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  3;.    sqlite3Be
6ab0: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
6ac0: 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
6ad0: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
6ae0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
6af0: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 69 73 56  ABLE.    if( isV
6b00: 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20  irtual ){.      
6b10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6b20: 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b  0(v, OP_VBegin);
6b30: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
6b40: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
6b50: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63  e format and enc
6b60: 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74  oding in the dat
6b70: 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62  abase have not b
6b80: 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a  een set, .    **
6b90: 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20   set them now.. 
6ba0: 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 31 20 3d     */.    reg1 =
6bb0: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69   pParse->regRowi
6bc0: 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
6bd0: 65 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d 20 70  em;.    reg2 = p
6be0: 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20 3d  Parse->regRoot =
6bf0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
6c00: 0a 20 20 20 20 72 65 67 33 20 3d 20 2b 2b 70 50  .    reg3 = ++pP
6c10: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
6c20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6c30: 33 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b  3(v, OP_ReadCook
6c40: 69 65 2c 20 69 44 62 2c 20 72 65 67 33 2c 20 42  ie, iDb, reg3, B
6c50: 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  TREE_FILE_FORMAT
6c60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6c70: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
6c80: 44 62 29 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71  Db);.    j1 = sq
6c90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
6ca0: 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b  v, OP_If, reg3);
6cb0: 0a 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20  .    fileFormat 
6cc0: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
6cd0: 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65  QLITE_LegacyFile
6ce0: 46 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20  Fmt)!=0 ?.      
6cf0: 20 20 20 20 20 20 20 20 20 20 20 20 31 20 3a 20              1 : 
6d00: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f  SQLITE_MAX_FILE_
6d10: 46 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69  FORMAT;.    sqli
6d20: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6d30: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c   OP_Integer, fil
6d40: 65 46 6f 72 6d 61 74 2c 20 72 65 67 33 29 3b 0a  eFormat, reg3);.
6d50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6d60: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
6d70: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45  ookie, iDb, BTRE
6d80: 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 72  E_FILE_FORMAT, r
6d90: 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg3);.    sqlite
6da0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6db0: 50 5f 49 6e 74 65 67 65 72 2c 20 45 4e 43 28 64  P_Integer, ENC(d
6dc0: 62 29 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73  b), reg3);.    s
6dd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6de0: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
6df0: 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 54 45 58  , iDb, BTREE_TEX
6e00: 54 5f 45 4e 43 4f 44 49 4e 47 2c 20 72 65 67 33  T_ENCODING, reg3
6e10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6e20: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
6e30: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  );..    /* This 
6e40: 6a 75 73 74 20 63 72 65 61 74 65 73 20 61 20 70  just creates a p
6e50: 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f  lace-holder reco
6e60: 72 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  rd in the sqlite
6e70: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20  _master table.. 
6e80: 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64     ** The record
6e90: 20 63 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f   created does no
6ea0: 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69  t contain anythi
6eb0: 6e 67 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c  ng yet.  It will
6ec0: 20 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20   be replaced.   
6ed0: 20 2a 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20   ** by the real 
6ee0: 65 6e 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65  entry in code ge
6ef0: 6e 65 72 61 74 65 64 20 61 74 20 73 71 6c 69 74  nerated at sqlit
6f00: 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20  e3EndTable()..  
6f10: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
6f20: 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65  rowid for the ne
6f30: 77 20 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20  w entry is left 
6f40: 69 6e 20 72 65 67 69 73 74 65 72 20 70 50 61 72  in register pPar
6f50: 73 65 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20  se->regRowid..  
6f60: 20 20 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61    ** The root pa
6f70: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
6f80: 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6c 65   new table is le
6f90: 66 74 20 69 6e 20 72 65 67 20 70 50 61 72 73 65  ft in reg pParse
6fa0: 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a  ->regRoot..    *
6fb0: 2a 20 54 68 65 20 72 6f 77 69 64 20 61 6e 64 20  * The rowid and 
6fc0: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
6fd0: 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 65 64   values are need
6fe0: 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20 74  ed by the code t
6ff0: 68 61 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  hat.    ** sqlit
7000: 65 33 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20  e3EndTable will 
7010: 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f  generate..    */
7020: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
7030: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
7040: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
7050: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
7060: 41 42 4c 45 29 0a 20 20 20 20 69 66 28 20 69 73  ABLE).    if( is
7070: 56 69 65 77 20 7c 7c 20 69 73 56 69 72 74 75 61  View || isVirtua
7080: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
7090: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
70a0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
70b0: 65 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  eg2);.    }else.
70c0: 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20  #endif.    {.   
70d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
70e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74  dOp2(v, OP_Creat
70f0: 65 54 61 62 6c 65 2c 20 69 44 62 2c 20 72 65 67  eTable, iDb, reg
7100: 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  2);.    }.    sq
7110: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
7120: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62  able(pParse, iDb
7130: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7140: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
7150: 65 77 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 31  ewRowid, 0, reg1
7160: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7170: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
7180: 75 6c 6c 2c 20 30 2c 20 72 65 67 33 29 3b 0a 20  ull, 0, reg3);. 
7190: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
71a0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
71b0: 74 2c 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31  t, 0, reg3, reg1
71c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
71d0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
71e0: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
71f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7200: 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29  Op0(v, OP_Close)
7210: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d  ;.  }..  /* Norm
7220: 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72  al (non-error) r
7230: 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75  eturn. */.  retu
7240: 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20  rn;..  /* If an 
7250: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65  error occurs, we
7260: 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65   jump here */.be
7270: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a  gin_table_error:
7280: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
7290: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72  (db, zName);.  r
72a0: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
72b0: 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73  This macro is us
72c0: 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 77  ed to compare tw
72d0: 6f 20 73 74 72 69 6e 67 73 20 69 6e 20 61 20 63  o strings in a c
72e0: 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20  ase-insensitive 
72f0: 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73  manner..** It is
7300: 20 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72   slightly faster
7310: 20 74 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71   than calling sq
7320: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 29 20 64  lite3StrICmp() d
7330: 69 72 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20  irectly, but.** 
7340: 70 72 6f 64 75 63 65 73 20 6c 61 72 67 65 72 20  produces larger 
7350: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e  code..**.** WARN
7360: 49 4e 47 3a 20 54 68 69 73 20 6d 61 63 72 6f 20  ING: This macro 
7370: 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c  is not compatibl
7380: 65 20 77 69 74 68 20 74 68 65 20 73 74 72 63 6d  e with the strcm
7390: 70 28 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a  p() family. It.*
73a0: 2a 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69  * returns true i
73b0: 66 20 74 68 65 20 74 77 6f 20 73 74 72 69 6e 67  f the two string
73c0: 73 20 61 72 65 20 65 71 75 61 6c 2c 20 6f 74 68  s are equal, oth
73d0: 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f  erwise false..*/
73e0: 0a 23 64 65 66 69 6e 65 20 53 54 52 49 43 4d 50  .#define STRICMP
73f0: 28 78 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74 65  (x, y) (\.sqlite
7400: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28  3UpperToLower[*(
7410: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
7420: 28 78 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74  (x)]==   \.sqlit
7430: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  e3UpperToLower[*
7440: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
7450: 29 28 79 29 5d 20 20 20 20 20 5c 0a 26 26 20 73  )(y)]     \.&& s
7460: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 28 78  qlite3StrICmp((x
7470: 29 2b 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a  )+1,(y)+1)==0 ).
7480: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
7490: 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74   column to the t
74a0: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62  able currently b
74b0: 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
74c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  ..**.** The pars
74d0: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
74e0: 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65  utine once for e
74f0: 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61  ach column decla
7500: 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43  ration.** in a C
7510: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
7520: 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53  ement.  sqlite3S
7530: 74 61 72 74 54 61 62 6c 65 28 29 20 67 65 74 73  tartTable() gets
7540: 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74   called.** first
7550: 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67   to get things g
7560: 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73  oing.  Then this
7570: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
7580: 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63  ed for each.** c
7590: 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  olumn..*/.void s
75a0: 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28  qlite3AddColumn(
75b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
75c0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
75d0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
75e0: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
75f0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
7600: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
7610: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
7620: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
7630: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
7640: 75 72 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  urn;.#if SQLITE_
7650: 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28  MAX_COLUMN.  if(
7660: 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61   p->nCol+1>db->a
7670: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
7680: 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20  IT_COLUMN] ){.  
7690: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
76a0: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
76b0: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25  any columns on %
76c0: 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  s", p->zName);. 
76d0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
76e0: 65 6e 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c 69  endif.  z = sqli
76f0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
7700: 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  (db, pName);.  i
7710: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
7720: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
7730: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
7740: 20 20 69 66 28 20 53 54 52 49 43 4d 50 28 7a 2c    if( STRICMP(z,
7750: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d   p->aCol[i].zNam
7760: 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  e) ){.      sqli
7770: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
7780: 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63  se, "duplicate c
7790: 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c  olumn name: %s",
77a0: 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   z);.      sqlit
77b0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
77c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
77d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28     }.  }.  if( (
77e0: 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d  p->nCol & 0x7)==
77f0: 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  0 ){.    Column 
7800: 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20  *aNew;.    aNew 
7810: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
7820: 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70  oc(db,p->aCol,(p
7830: 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66  ->nCol+8)*sizeof
7840: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
7850: 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
7860: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
7870: 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
7880: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
7890: 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20  }.    p->aCol = 
78a0: 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c  aNew;.  }.  pCol
78b0: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e   = &p->aCol[p->n
78c0: 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  Col];.  memset(p
78d0: 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  Col, 0, sizeof(p
78e0: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70  ->aCol[0]));.  p
78f0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a  Col->zName = z;.
7900: 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20   .  /* If there 
7910: 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69  is no type speci
7920: 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61  fied, columns ha
7930: 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 61  ve the default a
7940: 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e 4f  ffinity.  ** 'NO
7950: 4e 45 27 2e 20 49 66 20 74 68 65 72 65 20 69 73  NE'. If there is
7960: 20 61 20 74 79 70 65 20 73 70 65 63 69 66 69 65   a type specifie
7970: 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33 41  d, then sqlite3A
7980: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77  ddColumnType() w
7990: 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c  ill.  ** be call
79a0: 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74 20 70  ed next to set p
79b0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f  Col->affinity co
79c0: 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20  rrectly..  */.  
79d0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
79e0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
79f0: 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d  ;.  p->nCol++;.}
7a00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
7a10: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
7a20: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
7a30: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
7a40: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
7a50: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
7a60: 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54  atement.  A "NOT
7a70: 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e   NULL" constrain
7a80: 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65  t has.** been se
7a90: 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20  en on a column. 
7aa0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
7ab0: 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66  ts the notNull f
7ac0: 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f  lag on.** the co
7ad0: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
7ae0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
7af0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
7b00: 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72  e3AddNotNull(Par
7b10: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
7b20: 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c  onError){.  Tabl
7b30: 65 20 2a 70 3b 0a 20 20 70 20 3d 20 70 50 61 72  e *p;.  p = pPar
7b40: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
7b50: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56   if( p==0 || NEV
7b60: 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20  ER(p->nCol<1) ) 
7b70: 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 61 43 6f  return;.  p->aCo
7b80: 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74  l[p->nCol-1].not
7b90: 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72  Null = (u8)onErr
7ba0: 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61  or;.}../*.** Sca
7bb0: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  n the column typ
7bc0: 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65  e name zType (le
7bd0: 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20  ngth nType) and 
7be0: 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73  return the.** as
7bf0: 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69 74  sociated affinit
7c00: 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  y type..**.** Th
7c10: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
7c20: 61 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65  a case-independe
7c30: 6e 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79  nt search of zTy
7c40: 70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73  pe for the .** s
7c50: 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65  ubstrings in the
7c60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
7c70: 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  . If one of the 
7c80: 73 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a  substrings is.**
7c90: 20 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72   found, the corr
7ca0: 65 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69  esponding affini
7cb0: 74 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ty is returned. 
7cc0: 49 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e  If zType contain
7cd0: 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s.** more than o
7ce0: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
7cf0: 69 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f  ings, entries to
7d00: 77 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20  ward the top of 
7d10: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61  .** the table ta
7d20: 6b 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72  ke priority. For
7d30: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79   example, if zTy
7d40: 70 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c  pe is 'BLOBINT',
7d50: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f   .** SQLITE_AFF_
7d60: 49 4e 54 45 47 45 52 20 69 73 20 72 65 74 75 72  INTEGER is retur
7d70: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74  ned..**.** Subst
7d80: 72 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e  ring     | Affin
7d90: 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ity.** ---------
7da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7db0: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27  -------.** 'INT'
7dc0: 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
7dd0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a  E_AFF_INTEGER.**
7de0: 20 27 43 48 41 52 27 20 20 20 20 20 20 20 20 7c   'CHAR'        |
7df0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
7e00: 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20  .** 'CLOB'      
7e10: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54    | SQLITE_AFF_T
7e20: 45 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20  EXT.** 'TEXT'   
7e30: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
7e40: 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27  F_TEXT.** 'BLOB'
7e50: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
7e60: 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a 20 27 52 45  _AFF_NONE.** 'RE
7e70: 41 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  AL'        | SQL
7e80: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20  ITE_AFF_REAL.** 
7e90: 27 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c 20  'FLOA'        | 
7ea0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
7eb0: 2a 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20 20  ** 'DOUB'       
7ec0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   | SQLITE_AFF_RE
7ed0: 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65  AL.**.** If none
7ee0: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
7ef0: 67 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  gs in the above 
7f00: 74 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c  table are found,
7f10: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  .** SQLITE_AFF_N
7f20: 55 4d 45 52 49 43 20 69 73 20 72 65 74 75 72 6e  UMERIC is return
7f30: 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  ed..*/.char sqli
7f40: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
7f50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 29  const char *zIn)
7f60: 7b 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20  {.  u32 h = 0;. 
7f70: 20 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49   char aff = SQLI
7f80: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
7f90: 0a 20 20 69 66 28 20 7a 49 6e 20 29 20 77 68 69  .  if( zIn ) whi
7fa0: 6c 65 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20  le( zIn[0] ){.  
7fb0: 20 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73    h = (h<<8) + s
7fc0: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
7fd0: 65 72 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d 3b  er[(*zIn)&0xff];
7fe0: 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20  .    zIn++;.    
7ff0: 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34  if( h==(('c'<<24
8000: 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27  )+('h'<<16)+('a'
8010: 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20  <<8)+'r') ){    
8020: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52           /* CHAR
8030: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
8040: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
8050: 20 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20   .    }else if( 
8060: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
8070: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
8080: 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'b') ){       /
8090: 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20  * CLOB */.      
80a0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
80b0: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
80c0: 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32   if( h==(('t'<<2
80d0: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78  4)+('e'<<16)+('x
80e0: 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20  '<<8)+'t') ){   
80f0: 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20      /* TEXT */. 
8100: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
8110: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
8120: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
8130: 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  b'<<24)+('l'<<16
8140: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20  )+('o'<<8)+'b') 
8150: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42           /* BLOB
8160: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 28   */.        && (
8170: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
8180: 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d  NUMERIC || aff==
8190: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 29  SQLITE_AFF_REAL)
81a0: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
81b0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
81c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
81d0: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
81e0: 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  INT.    }else if
81f0: 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b  ( h==(('r'<<24)+
8200: 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c  ('e'<<16)+('a'<<
8210: 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20 20  8)+'l')         
8220: 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20   /* REAL */.    
8230: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
8240: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
8250: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
8260: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
8270: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
8280: 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('f'<<24)+('l'<
8290: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61  <16)+('o'<<8)+'a
82a0: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ')          /* F
82b0: 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  LOA */.        &
82c0: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
82d0: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
82e0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
82f0: 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65  AFF_REAL;.    }e
8300: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64 27  lse if( h==(('d'
8310: 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b  <<24)+('o'<<16)+
8320: 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20 20  ('u'<<8)+'b')   
8330: 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a         /* DOUB *
8340: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
8350: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
8360: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
8370: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
8380: 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  EAL;.#endif.    
8390: 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30 78 30  }else if( (h&0x0
83a0: 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c  0FFFFFF)==(('i'<
83b0: 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74  <16)+('n'<<8)+'t
83c0: 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20  ') ){    /* INT 
83d0: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
83e0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
83f0: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
8400: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
8410: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
8420: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8430: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
8440: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
8450: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
8460: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
8470: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
8480: 74 2e 20 20 54 68 65 20 70 46 69 72 73 74 20 74  t.  The pFirst t
8490: 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69 72 73  oken is the firs
84a0: 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68  t.** token in th
84b0: 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f  e sequence of to
84c0: 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63 72 69  kens that descri
84d0: 62 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 74  be the type of t
84e0: 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72  he.** column cur
84f0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
8500: 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61  struction.   pLa
8510: 73 74 20 69 73 20 74 68 65 20 6c 61 73 74 20 74  st is the last t
8520: 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73  oken.** in the s
8530: 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68  equence.  Use th
8540: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  is information t
8550: 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74  o construct a st
8560: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e  ring.** that con
8570: 74 61 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61  tains the typena
8580: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
8590: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20   and store that 
85a0: 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79  string.** in zTy
85b0: 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c  pe..*/ .void sql
85c0: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70  ite3AddColumnTyp
85d0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
85e0: 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a   Token *pType){.
85f0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f    Table *p;.  Co
8600: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20 70  lumn *pCol;..  p
8610: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
8620: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
8630: 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f   || NEVER(p->nCo
8640: 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  l<1) ) return;. 
8650: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
8660: 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 61  [p->nCol-1];.  a
8670: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 7a 54 79  ssert( pCol->zTy
8680: 70 65 3d 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 2d  pe==0 );.  pCol-
8690: 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33  >zType = sqlite3
86a0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
86b0: 61 72 73 65 2d 3e 64 62 2c 20 70 54 79 70 65 29  arse->db, pType)
86c0: 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  ;.  pCol->affini
86d0: 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69  ty = sqlite3Affi
86e0: 6e 69 74 79 54 79 70 65 28 70 43 6f 6c 2d 3e 7a  nityType(pCol->z
86f0: 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Type);.}../*.** 
8700: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
8710: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  s the default va
8720: 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  lue for the most
8730: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
8740: 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65  column.** of the
8750: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
8760: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
8770: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75  ion..**.** Defau
8780: 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65 73 73  lt value express
8790: 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e  ions must be con
87a0: 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e  stant.  Raise an
87b0: 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68   exception if th
87c0: 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65  is.** is not the
87d0: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   case..**.** Thi
87e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
87f0: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
8800: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
8810: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
8820: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
8830: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  LE statement..*/
8840: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
8850: 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72  DefaultValue(Par
8860: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
8870: 53 70 61 6e 20 2a 70 53 70 61 6e 29 7b 0a 20 20  Span *pSpan){.  
8880: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75  Table *p;.  Colu
8890: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69  mn *pCol;.  sqli
88a0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
88b0: 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70 50 61 72  ->db;.  p = pPar
88c0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
88d0: 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20   if( p!=0 ){.   
88e0: 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f   pCol = &(p->aCo
88f0: 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20  l[p->nCol-1]);. 
8900: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45     if( !sqlite3E
8910: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
8920: 75 6e 63 74 69 6f 6e 28 70 53 70 61 6e 2d 3e 70  unction(pSpan->p
8930: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73  Expr) ){.      s
8940: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8950: 50 61 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20  Parse, "default 
8960: 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20  value of column 
8970: 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73  [%s] is not cons
8980: 74 61 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20  tant",.         
8990: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
89a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
89b0: 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 45 78  /* A copy of pEx
89c0: 70 72 20 69 73 20 75 73 65 64 20 69 6e 73 74 65  pr is used inste
89d0: 61 64 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ad of the origin
89e0: 61 6c 2c 20 61 73 20 70 45 78 70 72 20 63 6f 6e  al, as pExpr con
89f0: 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74  tains.      ** t
8a00: 6f 6b 65 6e 73 20 74 68 61 74 20 70 6f 69 6e 74  okens that point
8a10: 20 74 6f 20 76 6f 6c 61 74 69 6c 65 20 6d 65 6d   to volatile mem
8a20: 6f 72 79 2e 20 54 68 65 20 27 73 70 61 6e 27 20  ory. The 'span' 
8a30: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
8a40: 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65  n.      ** is re
8a50: 71 75 69 72 65 64 20 62 79 20 70 72 61 67 6d 61  quired by pragma
8a60: 20 74 61 62 6c 65 5f 69 6e 66 6f 2e 0a 20 20 20   table_info..   
8a70: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
8a80: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
8a90: 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  , pCol->pDflt);.
8aa0: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c        pCol->pDfl
8ab0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
8ac0: 75 70 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70 45  up(db, pSpan->pE
8ad0: 78 70 72 2c 20 45 58 50 52 44 55 50 5f 52 45 44  xpr, EXPRDUP_RED
8ae0: 55 43 45 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  UCE);.      sqli
8af0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
8b00: 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20  ol->zDflt);.    
8b10: 20 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 20 3d 20    pCol->zDflt = 
8b20: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
8b30: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61  (db, (char*)pSpa
8b40: 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20  n->zStart,.     
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b70: 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e  (int)(pSpan->zEn
8b80: 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72  d - pSpan->zStar
8b90: 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t));.    }.  }. 
8ba0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8bb0: 74 65 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70 45  te(db, pSpan->pE
8bc0: 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  xpr);.}../*.** D
8bd0: 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49  esignate the PRI
8be0: 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65  MARY KEY for the
8bf0: 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69   table.  pList i
8c00: 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65  s a list of name
8c10: 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73  s .** of columns
8c20: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70   that form the p
8c30: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
8c40: 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74  pList is NULL, t
8c50: 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20  hen the.** most 
8c60: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63  recently added c
8c70: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62  olumn of the tab
8c80: 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72  le is the primar
8c90: 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  y key..**.** A t
8ca0: 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74  able can have at
8cb0: 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72   most one primar
8cc0: 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74  y key.  If the t
8cd0: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
8ce0: 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65  .** a primary ke
8cf0: 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74  y (and this is t
8d00: 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72  he second primar
8d10: 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61  y key) then crea
8d20: 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a  te an.** error..
8d30: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49  **.** If the PRI
8d40: 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61  MARY KEY is on a
8d50: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77   single column w
8d60: 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73  hose datatype is
8d70: 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65   INTEGER,.** the
8d80: 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f  n we will try to
8d90: 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e   use that column
8da0: 20 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20   as the rowid.  
8db0: 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50  Set the Table.iP
8dc0: 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20  Key.** field of 
8dd0: 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
8de0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20  construction to 
8df0: 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  be the index of 
8e00: 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50  the.** INTEGER P
8e10: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
8e20: 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20  n.  Table.iPKey 
8e30: 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20  is set to -1 if 
8e40: 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49  there is.** no I
8e50: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
8e60: 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  EY..**.** If the
8e70: 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49   key is not an I
8e80: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
8e90: 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  EY, then create 
8ea0: 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65  a unique.** inde
8eb0: 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20  x for the key.  
8ec0: 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61  No index is crea
8ed0: 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20  ted for INTEGER 
8ee0: 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f  PRIMARY KEYs..*/
8ef0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
8f00: 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61  PrimaryKey(.  Pa
8f10: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
8f20: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
8f30: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
8f40: 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73   *pList,  /* Lis
8f50: 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73  t of field names
8f60: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
8f70: 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
8f80: 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
8f90: 20 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75   do with a uniqu
8fa0: 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a  eness conflict *
8fb0: 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c  /.  int autoInc,
8fc0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
8fd0: 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45   the AUTOINCREME
8fe0: 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  NT keyword is pr
8ff0: 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73  esent */.  int s
9000: 6f 72 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20  ortOrder     /* 
9010: 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72  SQLITE_SO_ASC or
9020: 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20   SQLITE_SO_DESC 
9030: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
9040: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
9050: 65 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20  ewTable;.  char 
9060: 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e  *zType = 0;.  in
9070: 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a  t iCol = -1, i;.
9080: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c    if( pTab==0 ||
9090: 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42   IN_DECLARE_VTAB
90a0: 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f   ) goto primary_
90b0: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20  key_exit;.  if( 
90c0: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
90d0: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
90e0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
90f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9100: 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c   .      "table \
9110: 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74  "%s\" has more t
9120: 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  han one primary 
9130: 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  key", pTab->zNam
9140: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69  e);.    goto pri
9150: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20  mary_key_exit;. 
9160: 20 7d 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c   }.  pTab->tabFl
9170: 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 50 72 69  ags |= TF_HasPri
9180: 6d 61 72 79 4b 65 79 3b 0a 20 20 69 66 28 20 70  maryKey;.  if( p
9190: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  List==0 ){.    i
91a0: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  Col = pTab->nCol
91b0: 20 2d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e   - 1;.    pTab->
91c0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69  aCol[iCol].isPri
91d0: 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  mKey = 1;.  }els
91e0: 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e{.    for(i=0; 
91f0: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
9200: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  i++){.      for(
9210: 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
9220: 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
9230: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
9240: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
9250: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
9260: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
9270: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
9280: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9290: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
92a0: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
92b0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
92c0: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
92d0: 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79  [iCol].isPrimKey
92e0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
92f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73    }.    if( pLis
9300: 74 2d 3e 6e 45 78 70 72 3e 31 20 29 20 69 43 6f  t->nExpr>1 ) iCo
9310: 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66  l = -1;.  }.  if
9320: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f  ( iCol>=0 && iCo
9330: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  l<pTab->nCol ){.
9340: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
9350: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
9360: 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54  pe;.  }.  if( zT
9370: 79 70 65 20 26 26 20 73 71 6c 69 74 65 33 53 74  ype && sqlite3St
9380: 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e  rICmp(zType, "IN
9390: 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20 20  TEGER")==0.     
93a0: 20 20 20 26 26 20 73 6f 72 74 4f 72 64 65 72 3d     && sortOrder=
93b0: 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29  =SQLITE_SO_ASC )
93c0: 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65  {.    pTab->iPKe
93d0: 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54  y = iCol;.    pT
93e0: 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75  ab->keyConf = (u
93f0: 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61  8)onError;.    a
9400: 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d  ssert( autoInc==
9410: 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20  0 || autoInc==1 
9420: 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62  );.    pTab->tab
9430: 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63  Flags |= autoInc
9440: 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e  *TF_Autoincremen
9450: 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61  t;.  }else if( a
9460: 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65  utoInc ){.#ifnde
9470: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
9480: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
9490: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
94a0: 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43  pParse, "AUTOINC
94b0: 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61  REMENT is only a
94c0: 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20  llowed on an ". 
94d0: 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 20 50        "INTEGER P
94e0: 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65  RIMARY KEY");.#e
94f0: 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
9500: 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
9510: 70 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  p = sqlite3Creat
9520: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30  eIndex(pParse, 0
9530: 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f  , 0, 0, pList, o
9540: 6e 45 72 72 6f 72 2c 20 30 2c 20 30 2c 20 73 6f  nError, 0, 0, so
9550: 72 74 4f 72 64 65 72 2c 20 30 29 3b 0a 20 20 20  rtOrder, 0);.   
9560: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
9570: 70 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 32  p->autoIndex = 2
9580: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
9590: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d  t = 0;.  }..prim
95a0: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20  ary_key_exit:.  
95b0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
95c0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
95d0: 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  , pList);.  retu
95e0: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rn;.}../*.** Add
95f0: 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e   a new CHECK con
9600: 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20 74  straint to the t
9610: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
9620: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
9630: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
9640: 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72  e3AddCheckConstr
9650: 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  aint(.  Parse *p
9660: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
9670: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
9680: 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45 78    Expr *pCheckEx
9690: 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63 6b  pr  /* The check
96a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29   expression */.)
96b0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
96c0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69  = pParse->db;.#i
96d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
96e0: 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65 20  T_CHECK.  Table 
96f0: 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  *pTab = pParse->
9700: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
9710: 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43   pTab && !IN_DEC
9720: 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20  LARE_VTAB ){.   
9730: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20   pTab->pCheck = 
9740: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
9750: 62 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c  b, pTab->pCheck,
9760: 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20   pCheckExpr);.  
9770: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
9780: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
9790: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 68 65 63  Delete(db, pChec
97a0: 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  kExpr);.  }.}../
97b0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c  *.** Set the col
97c0: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
97d0: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
97e0: 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c  ntly parsed tabl
97f0: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74  e column.** to t
9800: 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e  he CollSeq given
9810: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9820: 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28  3AddCollateType(
9830: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
9840: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
9850: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
9860: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c   i;.  char *zCol
9870: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
9880: 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65  /* Dequoted name
9890: 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   of collation se
98a0: 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69  quence */.  sqli
98b0: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
98c0: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
98d0: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
98e0: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
98f0: 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61  ol-1;.  db = pPa
9900: 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c  rse->db;.  zColl
9910: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
9920: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b  omToken(db, pTok
9930: 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c  en);.  if( !zCol
9940: 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69  l ) return;..  i
9950: 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  f( sqlite3Locate
9960: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
9970: 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e  zColl) ){.    In
9980: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 70  dex *pIdx;.    p
9990: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20  ->aCol[i].zColl 
99a0: 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20  = zColl;.  .    
99b0: 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
99c0: 20 69 73 20 64 65 63 6c 61 72 65 64 20 61 73 20   is declared as 
99d0: 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20  "<name> PRIMARY 
99e0: 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70  KEY COLLATE <typ
99f0: 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  e>",.    ** then
9a00: 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61   an index may ha
9a10: 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  ve been created 
9a20: 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62  on this column b
9a30: 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  efore the.    **
9a40: 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20   collation type 
9a50: 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65  was added. Corre
9a60: 63 74 20 74 68 69 73 20 69 66 20 69 74 20 69 73  ct this if it is
9a70: 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a   the case..    *
9a80: 2f 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  /.    for(pIdx=p
9a90: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
9aa0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
9ab0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
9ac0: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d   pIdx->nColumn==
9ad0: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
9ae0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
9af0: 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==i ){.        p
9b00: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d  Idx->azColl[0] =
9b10: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
9b20: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
9b30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
9b40: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9b50: 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  zColl);.  }.}../
9b60: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
9b70: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 63  on returns the c
9b80: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
9b90: 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e  e for database n
9ba0: 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e  ative text.** en
9bb0: 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65  coding identifie
9bc0: 64 20 62 79 20 74 68 65 20 73 74 72 69 6e 67 20  d by the string 
9bd0: 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e  zName, length nN
9be0: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ame..**.** If th
9bf0: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
9c00: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69  ation sequence i
9c10: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c  s not available,
9c20: 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   or not availabl
9c30: 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61  e.** in the data
9c40: 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f  base native enco
9c50: 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74  ding, the collat
9c60: 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69  ion factory is i
9c70: 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71  nvoked to.** req
9c80: 75 65 73 74 20 69 74 2e 20 49 66 20 74 68 65 20  uest it. If the 
9c90: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
9ca0: 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c  y does not suppl
9cb0: 79 20 73 75 63 68 20 61 20 73 65 71 75 65 6e 63  y such a sequenc
9cc0: 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65  e,.** and the se
9cd0: 71 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61  quence is availa
9ce0: 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74  ble in another t
9cf0: 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ext encoding, th
9d00: 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65  en that is.** re
9d10: 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a  turned instead..
9d20: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73  **.** If no vers
9d30: 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75  ions of the requ
9d40: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  ested collations
9d50: 20 73 65 71 75 65 6e 63 65 20 61 72 65 20 61 76   sequence are av
9d60: 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61  ailable, or.** a
9d70: 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63  nother error occ
9d80: 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
9d90: 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72  urned and an err
9da0: 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69 74 74  or message writt
9db0: 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73  en into.** pPars
9dc0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
9dd0: 75 74 69 6e 65 20 69 73 20 61 20 77 72 61 70 70  utine is a wrapp
9de0: 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
9df0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20  3FindCollSeq(). 
9e00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
9e10: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c   invokes the col
9e20: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69  lation factory i
9e30: 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c  f the named coll
9e40: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
9e50: 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e  found.** and gen
9e60: 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20  erates an error 
9e70: 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53  message..**.** S
9e80: 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33  ee also: sqlite3
9e90: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73  FindCollSeq(), s
9ea0: 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71  qlite3GetCollSeq
9eb0: 28 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73  ().*/.CollSeq *s
9ec0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
9ed0: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
9ee0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
9ef0: 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Name){.  sqlite3
9f00: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
9f10: 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e  b;.  u8 enc = EN
9f20: 43 28 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74  C(db);.  u8 init
9f30: 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  busy = db->init.
9f40: 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  busy;.  CollSeq 
9f50: 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c  *pColl;..  pColl
9f60: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
9f70: 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a  llSeq(db, enc, z
9f80: 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b  Name, initbusy);
9f90: 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79  .  if( !initbusy
9fa0: 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21   && (!pColl || !
9fb0: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a  pColl->xCmp) ){.
9fc0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
9fd0: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 64 62  te3GetCollSeq(db
9fe0: 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e  , enc, pColl, zN
9ff0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ame);.    if( !p
a000: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Coll ){.      sq
a010: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
a020: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 63  arse, "no such c
a030: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
a040: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
a050: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
a060: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f  urn pColl;.}.../
a070: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
a080: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63  de that will inc
a090: 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d  rement the schem
a0a0: 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20  a cookie..**.** 
a0b0: 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  The schema cooki
a0c0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
a0d0: 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20  ermine when the 
a0e0: 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a  schema for the.*
a0f0: 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  * database chang
a100: 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68 20  es.  After each 
a110: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74  schema change, t
a120: 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a  he cookie value.
a130: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65  ** changes.  Whe
a140: 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72 73  n a process firs
a150: 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68 65  t reads the sche
a160: 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74 68  ma it records th
a170: 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68  e.** cookie.  Th
a180: 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76  ereafter, whenev
a190: 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63  er it goes to ac
a1a0: 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
a1b0: 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20  e,.** it checks 
a1c0: 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61  the cookie to ma
a1d0: 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68 65  ke sure the sche
a1e0: 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67  ma has not chang
a1f0: 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77  ed.** since it w
a200: 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a  as last read..**
a210: 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73  .** This plan is
a220: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
a230: 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49  bullet-proof.  I
a240: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
a250: 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20  r.** the schema 
a260: 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70  to change multip
a270: 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72  le times and for
a280: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62   the cookie to b
a290: 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f  e.** set back to
a2a0: 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42   prior value.  B
a2b0: 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ut schema change
a2c0: 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74  s are infrequent
a2d0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62  .** and the prob
a2e0: 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69  ability of hitti
a2f0: 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b  ng the same cook
a300: 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79  ie value is only
a310: 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20  .** 1 chance in 
a320: 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20  2^32.  So we're 
a330: 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a  safe enough..*/.
a340: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e  void sqlite3Chan
a350: 67 65 43 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a  geCookie(Parse *
a360: 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29  pParse, int iDb)
a370: 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c  {.  int r1 = sql
a380: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
a390: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
a3a0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
a3b0: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  db;.  Vdbe *v = 
a3c0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
a3d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a3e0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
a3f0: 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  , db->aDb[iDb].p
a400: 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63  Schema->schema_c
a410: 6f 6f 6b 69 65 2b 31 2c 20 72 31 29 3b 0a 20 20  ookie+1, r1);.  
a420: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a430: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
a440: 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 53 43  e, iDb, BTREE_SC
a450: 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 72 31  HEMA_VERSION, r1
a460: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
a470: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
a480: 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e, r1);.}../*.**
a490: 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d   Measure the num
a4a0: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
a4b0: 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70  s needed to outp
a4c0: 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  ut the given.** 
a4d0: 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65  identifier.  The
a4e0: 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64   number returned
a4f0: 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75   includes any qu
a500: 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74  otes used.** but
a510: 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64   does not includ
a520: 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69  e the null termi
a530: 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nator..**.** The
a540: 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e   estimate is con
a550: 73 65 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d  servative.  It m
a560: 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
a570: 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72  hat what is.** r
a580: 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f  eally needed..*/
a590: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e  .static int iden
a5a0: 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68  tLength(const ch
a5b0: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b  ar *z){.  int n;
a5c0: 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20  .  for(n=0; *z; 
a5d0: 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69  n++, z++){.    i
a5e0: 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b  f( *z=='"' ){ n+
a5f0: 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72  +; }.  }.  retur
a600: 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  n n + 2;.}../*.*
a610: 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61  * The first para
a620: 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
a630: 65 72 20 74 6f 20 61 6e 20 6f 75 74 70 75 74 20  er to an output 
a640: 62 75 66 66 65 72 2e 20 54 68 65 20 73 65 63 6f  buffer. The seco
a650: 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  nd .** parameter
a660: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
a670: 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74   an integer that
a680: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6f 66   contains the of
a690: 66 73 65 74 20 61 74 0a 2a 2a 20 77 68 69 63 68  fset at.** which
a6a0: 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74   to write into t
a6b0: 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
a6c0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
a6d0: 63 6f 70 69 65 73 20 74 68 65 0a 2a 2a 20 6e 75  copies the.** nu
a6e0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l-terminated str
a6f0: 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ing pointed to b
a700: 79 20 74 68 65 20 74 68 69 72 64 20 70 61 72 61  y the third para
a710: 6d 65 74 65 72 2c 20 7a 53 69 67 6e 65 64 49 64  meter, zSignedId
a720: 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68 65 20 73  ent,.** to the s
a730: 70 65 63 69 66 69 65 64 20 6f 66 66 73 65 74 20  pecified offset 
a740: 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 61 6e  in the buffer an
a750: 64 20 75 70 64 61 74 65 73 20 2a 70 49 64 78 20  d updates *pIdx 
a760: 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20 74  to refer.** to t
a770: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 61 66  he first byte af
a780: 74 65 72 20 74 68 65 20 6c 61 73 74 20 62 79 74  ter the last byt
a790: 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65  e written before
a7a0: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a   returning..** .
a7b0: 2a 2a 20 49 66 20 74 68 65 20 73 74 72 69 6e 67  ** If the string
a7c0: 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 20 63 6f   zSignedIdent co
a7d0: 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20  nsists entirely 
a7e0: 6f 66 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69 63  of alpha-numeric
a7f0: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 2c 20  .** characters, 
a800: 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77  does not begin w
a810: 69 74 68 20 61 20 64 69 67 69 74 20 61 6e 64 20  ith a digit and 
a820: 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20 6b 65  is not an SQL ke
a830: 79 77 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e 20 69  yword,.** then i
a840: 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 74  t is copied to t
a850: 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
a860: 20 65 78 61 63 74 6c 79 20 61 73 20 69 74 20 69   exactly as it i
a870: 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  s. Otherwise,.**
a880: 20 69 74 20 69 73 20 71 75 6f 74 65 64 20 75 73   it is quoted us
a890: 69 6e 67 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  ing double-quote
a8a0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
a8b0: 64 20 69 64 65 6e 74 50 75 74 28 63 68 61 72 20  d identPut(char 
a8c0: 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63  *z, int *pIdx, c
a8d0: 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e  har *zSignedIden
a8e0: 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  t){.  unsigned c
a8f0: 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75  har *zIdent = (u
a900: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53  nsigned char*)zS
a910: 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e  ignedIdent;.  in
a920: 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74  t i, j, needQuot
a930: 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a  e;.  i = *pIdx;.
a940: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65  .  for(j=0; zIde
a950: 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nt[j]; j++){.   
a960: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73 61   if( !sqlite3Isa
a970: 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20  lnum(zIdent[j]) 
a980: 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f  && zIdent[j]!='_
a990: 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ' ) break;.  }. 
a9a0: 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 73 71 6c   needQuote = sql
a9b0: 69 74 65 33 49 73 64 69 67 69 74 28 7a 49 64 65  ite3Isdigit(zIde
a9c0: 6e 74 5b 30 5d 29 20 7c 7c 20 73 71 6c 69 74 65  nt[0]) || sqlite
a9d0: 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64  3KeywordCode(zId
a9e0: 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a  ent, j)!=TK_ID;.
a9f0: 20 20 69 66 28 20 21 6e 65 65 64 51 75 6f 74 65    if( !needQuote
aa00: 20 29 7b 0a 20 20 20 20 6e 65 65 64 51 75 6f 74   ){.    needQuot
aa10: 65 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20  e = zIdent[j];. 
aa20: 20 7d 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75   }..  if( needQu
aa30: 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  ote ) z[i++] = '
aa40: 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  "';.  for(j=0; z
aa50: 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  Ident[j]; j++){.
aa60: 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64      z[i++] = zId
aa70: 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  ent[j];.    if( 
aa80: 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29  zIdent[j]=='"' )
aa90: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
aaa0: 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f   }.  if( needQuo
aab0: 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  te ) z[i++] = '"
aac0: 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20  ';.  z[i] = 0;. 
aad0: 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f   *pIdx = i;.}../
aae0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
aaf0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
ab00: 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61  tement appropria
ab10: 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  te for the given
ab20: 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f  .** table.  Memo
ab30: 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74  ry to hold the t
ab40: 65 78 74 20 6f 66 20 74 68 65 20 73 74 61 74 65  ext of the state
ab50: 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64  ment is obtained
ab60: 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  .** from sqliteM
ab70: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
ab80: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
ab90: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
aba0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  n..*/.static cha
abb0: 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74  r *createTableSt
abc0: 6d 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  mt(sqlite3 *db, 
abd0: 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Table *p){.  int
abe0: 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72   i, k, n;.  char
abf0: 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20   *zStmt;.  char 
ac00: 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a  *zSep, *zSep2, *
ac10: 7a 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  zEnd;.  Column *
ac20: 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  pCol;.  n = 0;. 
ac30: 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61   for(pCol = p->a
ac40: 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e  Col, i=0; i<p->n
ac50: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
ac60: 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e  ){.    n += iden
ac70: 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e  tLength(pCol->zN
ac80: 61 6d 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20  ame) + 5;.  }.  
ac90: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
aca0: 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  (p->zName);.  if
acb0: 28 20 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a  ( n<50 ){ .    z
acc0: 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53  Sep = "";.    zS
acd0: 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a  ep2 = ",";.    z
ace0: 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c  End = ")";.  }el
acf0: 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  se{.    zSep = "
ad00: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32  \n  ";.    zSep2
ad10: 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20   = ",\n  ";.    
ad20: 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20  zEnd = "\n)";.  
ad30: 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a  }.  n += 35 + 6*
ad40: 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74  p->nCol;.  zStmt
ad50: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
ad60: 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53 74  ( n );.  if( zSt
ad70: 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  mt==0 ){.    db-
ad80: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
ad90: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  1;.    return 0;
ada0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
adb0: 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74  nprintf(n, zStmt
adc0: 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  , "CREATE TABLE 
add0: 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65  ");.  k = sqlite
ade0: 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29  3Strlen30(zStmt)
adf0: 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74  ;.  identPut(zSt
ae00: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65  mt, &k, p->zName
ae10: 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20  );.  zStmt[k++] 
ae20: 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f  = '(';.  for(pCo
ae30: 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20  l=p->aCol, i=0; 
ae40: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  i<p->nCol; i++, 
ae50: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61  pCol++){.    sta
ae60: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
ae70: 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20   const azType[] 
ae80: 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  = {.        /* S
ae90: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20  QLITE_AFF_TEXT  
aea0: 20 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20 20    */ " TEXT",.  
aeb0: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
aec0: 41 46 46 5f 4e 4f 4e 45 20 20 20 20 2a 2f 20 22  AFF_NONE    */ "
aed0: 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51  ",.        /* SQ
aee0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
aef0: 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20   */ " NUM",.    
af00: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
af10: 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20 49  F_INTEGER */ " I
af20: 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  NT",.        /* 
af30: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
af40: 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20     */ " REAL".  
af50: 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e    };.    int len
af60: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
af70: 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73 71   *zType;..    sq
af80: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
af90: 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  -k, &zStmt[k], z
afa0: 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73  Sep);.    k += s
afb0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26  qlite3Strlen30(&
afc0: 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a  zStmt[k]);.    z
afd0: 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20  Sep = zSep2;.   
afe0: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
aff0: 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65   &k, pCol->zName
b000: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
b010: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51  Col->affinity-SQ
b020: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 3e 3d  LITE_AFF_TEXT >=
b030: 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74   0 );.    assert
b040: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
b050: 2d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  -SQLITE_AFF_TEXT
b060: 20 3c 20 73 69 7a 65 6f 66 28 61 7a 54 79 70 65   < sizeof(azType
b070: 29 2f 73 69 7a 65 6f 66 28 61 7a 54 79 70 65 5b  )/sizeof(azType[
b080: 30 5d 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63  0]) );.    testc
b090: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
b0a0: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
b0b0: 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65 73 74  TEXT );.    test
b0c0: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
b0d0: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
b0e0: 5f 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 74 65 73  _NONE );.    tes
b0f0: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
b100: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
b110: 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20  F_NUMERIC );.   
b120: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
b130: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
b140: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
b150: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
b160: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
b170: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29  QLITE_AFF_REAL )
b180: 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79 70 65  ;.    .    zType
b190: 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e   = azType[pCol->
b1a0: 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c 49 54  affinity - SQLIT
b1b0: 45 5f 41 46 46 5f 54 45 58 54 5d 3b 0a 20 20 20  E_AFF_TEXT];.   
b1c0: 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74   len = sqlite3St
b1d0: 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20  rlen30(zType);. 
b1e0: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
b1f0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
b200: 45 5f 41 46 46 5f 4e 4f 4e 45 20 0a 20 20 20 20  E_AFF_NONE .    
b210: 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c 2d          || pCol-
b220: 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74  >affinity==sqlit
b230: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a  e3AffinityType(z
b240: 54 79 70 65 29 20 29 3b 0a 20 20 20 20 6d 65 6d  Type) );.    mem
b250: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
b260: 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  Type, len);.    
b270: 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73  k += len;.    as
b280: 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20  sert( k<=n );.  
b290: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  }.  sqlite3_snpr
b2a0: 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74  intf(n-k, &zStmt
b2b0: 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29  [k], "%s", zEnd)
b2c0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74  ;.  return zStmt
b2d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
b2e0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
b2f0: 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20  d to report the 
b300: 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74  final ")" that t
b310: 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43  erminates.** a C
b320: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
b330: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
b340: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
b350: 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69   that other acti
b360: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65  on routines have
b370: 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a   been building.*
b380: 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  * is added to th
b390: 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  e internal hash 
b3a0: 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67  tables, assuming
b3b0: 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a   no errors have.
b3c0: 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a  ** occurred..**.
b3d0: 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20  ** An entry for 
b3e0: 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64  the table is mad
b3f0: 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20  e in the master 
b400: 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75  table on disk, u
b410: 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73  nless.** this is
b420: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
b430: 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62  le or db->init.b
b440: 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62  usy==1.  When db
b450: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a  ->init.busy==1.*
b460: 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  * it means we ar
b470: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  e reading the sq
b480: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
b490: 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  e because we jus
b4a0: 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74  t.** connected t
b4b0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  o the database o
b4c0: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71  r because the sq
b4d0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
b4e0: 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c  e has.** recentl
b4f0: 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68  y changed, so th
b500: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73  e entry for this
b510: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
b520: 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20  xists in.** the 
b530: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
b540: 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  ble.  We do not 
b550: 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69  want to create i
b560: 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49  t again..**.** I
b570: 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72  f the pSelect ar
b580: 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
b590: 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  LL, it means tha
b5a0: 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
b5b0: 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  * was called to 
b5c0: 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67  create a table g
b5d0: 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20  enerated from a 
b5e0: 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c  .** "CREATE TABL
b5f0: 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20  E ... AS SELECT 
b600: 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20  ..." statement. 
b610: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   The column name
b620: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  s of.** the new 
b630: 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68  table will match
b640: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
b650: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  of the SELECT..*
b660: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e  /.void sqlite3En
b670: 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  dTable(.  Parse 
b680: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
b690: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
b6a0: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
b6b0: 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20  Cons,           
b6c0: 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e  /* The ',' token
b6d0: 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20   after the last 
b6e0: 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a  column defn. */.
b6f0: 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20    Token *pEnd,  
b700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
b710: 20 66 69 6e 61 6c 20 27 29 27 20 74 6f 6b 65 6e   final ')' token
b720: 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
b730: 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ABLE */.  Select
b740: 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20   *pSelect       
b750: 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d    /* Select from
b760: 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41   a "CREATE ... A
b770: 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a  S SELECT" */.){.
b780: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71    Table *p;.  sq
b790: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
b7a0: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
b7b0: 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d  b;..  if( (pEnd=
b7c0: 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30  =0 && pSelect==0
b7d0: 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ) || db->mallocF
b7e0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
b7f0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 70  urn;.  }.  p = p
b800: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
b810: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
b820: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
b830: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
b840: 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a   || !pSelect );.
b850: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
b860: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
b870: 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a  , p->pSchema);..
b880: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b890: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52  MIT_CHECK.  /* R
b8a0: 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20  esolve names in 
b8b0: 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  all CHECK constr
b8c0: 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73  aint expressions
b8d0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
b8e0: 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 53 72  pCheck ){.    Sr
b8f0: 63 4c 69 73 74 20 73 53 72 63 3b 20 20 20 20 20  cList sSrc;     
b900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b910: 20 46 61 6b 65 20 53 72 63 4c 69 73 74 20 66 6f   Fake SrcList fo
b920: 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  r pParse->pNewTa
b930: 62 6c 65 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43  ble */.    NameC
b940: 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20  ontext sNC;     
b950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
b960: 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
b970: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
b980: 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28   */..    memset(
b990: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
b9a0: 73 4e 43 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  sNC));.    memse
b9b0: 74 28 26 73 53 72 63 2c 20 30 2c 20 73 69 7a 65  t(&sSrc, 0, size
b9c0: 6f 66 28 73 53 72 63 29 29 3b 0a 20 20 20 20 73  of(sSrc));.    s
b9d0: 53 72 63 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20  Src.nSrc = 1;.  
b9e0: 20 20 73 53 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d    sSrc.a[0].zNam
b9f0: 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  e = p->zName;.  
ba00: 20 20 73 53 72 63 2e 61 5b 30 5d 2e 70 54 61 62    sSrc.a[0].pTab
ba10: 20 3d 20 70 3b 0a 20 20 20 20 73 53 72 63 2e 61   = p;.    sSrc.a
ba20: 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31  [0].iCursor = -1
ba30: 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65  ;.    sNC.pParse
ba40: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73   = pParse;.    s
ba50: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 26 73  NC.pSrcList = &s
ba60: 53 72 63 3b 0a 20 20 20 20 73 4e 43 2e 69 73 43  Src;.    sNC.isC
ba70: 68 65 63 6b 20 3d 20 31 3b 0a 20 20 20 20 69 66  heck = 1;.    if
ba80: 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  ( sqlite3Resolve
ba90: 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20  ExprNames(&sNC, 
baa0: 70 2d 3e 70 43 68 65 63 6b 29 20 29 7b 0a 20 20  p->pCheck) ){.  
bab0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
bac0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
bad0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
bae0: 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a  OMIT_CHECK) */..
baf0: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
bb00: 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69  init.busy is 1 i
bb10: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
bb20: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
bb30: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
bb40: 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22  ite_master" or "
bb50: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
bb60: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
bb70: 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64   disk..  ** So d
bb80: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
bb90: 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20  he disk again.  
bba0: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
bbb0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
bbc0: 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
bbd0: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69  from the db->ini
bbe0: 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  t.newTnum field.
bbf0: 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62    (The page numb
bc00: 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  er.  ** should h
bc10: 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65  ave been put the
bc20: 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  re by the sqlite
bc30: 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29  OpenCb routine.)
bc40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
bc50: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
bc60: 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69   p->tnum = db->i
bc70: 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d  nit.newTnum;.  }
bc80: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e  ..  /* If not in
bc90: 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e  itializing, then
bca0: 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64   create a record
bcb0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
bcc0: 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53  le.  ** in the S
bcd0: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
bce0: 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  le of the databa
bcf0: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  se..  **.  ** If
bd00: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f   this is a TEMPO
bd10: 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74  RARY table, writ
bd20: 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f  e the entry into
bd30: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20   the auxiliary. 
bd40: 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64   ** file instead
bd50: 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   of into the mai
bd60: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
bd70: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
bd80: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
bd90: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62    int n;.    Vdb
bda0: 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a  e *v;.    char *
bdb0: 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69  zType;    /* "vi
bdc0: 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a  ew" or "table" *
bdd0: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  /.    char *zTyp
bde0: 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20  e2;   /* "VIEW" 
bdf0: 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20  or "TABLE" */.  
be00: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20    char *zStmt;  
be10: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
be20: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72   CREATE TABLE or
be30: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
be40: 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76  tement */..    v
be50: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
be60: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
be70: 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
be80: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71   return;..    sq
be90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
bea0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b  v, OP_Close, 0);
beb0: 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a  ..    /* .    **
bec0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70   Initialize zTyp
bed0: 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69  e for the new vi
bee0: 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20  ew or table..   
bef0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
bf00: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
bf10: 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20     /* A regular 
bf20: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a  table */.      z
bf30: 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a  Type = "table";.
bf40: 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22        zType2 = "
bf50: 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20  TABLE";.#ifndef 
bf60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
bf70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
bf80: 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20    /* A view */. 
bf90: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69       zType = "vi
bfa0: 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  ew";.      zType
bfb0: 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64  2 = "VIEW";.#end
bfc0: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
bfd0: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52   If this is a CR
bfe0: 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53  EATE TABLE xx AS
bff0: 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65   SELECT ..., exe
c000: 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a  cute the SELECT.
c010: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
c020: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65   to populate the
c030: 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20   new table. The 
c040: 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
c050: 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20   for the.    ** 
c060: 6e 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20  new table is in 
c070: 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d  register pParse-
c080: 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a  >regRoot..    **
c090: 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65  .    ** Once the
c0a0: 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e   SELECT has been
c0b0: 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65   coded by sqlite
c0c0: 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73  3Select(), it is
c0d0: 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69   in a.    ** sui
c0e0: 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71  table state to q
c0f0: 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  uery for the col
c100: 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79  umn names and ty
c110: 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20  pes to be used. 
c120: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77     ** by the new
c130: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20   table..    **. 
c140: 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63     ** A shared-c
c150: 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ache write-lock 
c160: 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
c170: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
c180: 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a  new table,.    *
c190: 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f  * as a schema-lo
c1a0: 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ck must have alr
c1b0: 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e  eady been obtain
c1c0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e  ed to create it.
c1d0: 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20   Since.    ** a 
c1e0: 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c  schema-lock excl
c1f0: 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64  udes all other d
c200: 61 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74  atabase users, t
c210: 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f  he write-lock wo
c220: 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65  uld.    ** be re
c230: 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a  dundant..    */.
c240: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
c250: 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  ){.      SelectD
c260: 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20  est dest;.      
c270: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a  Table *pSelTab;.
c280: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
c290: 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a  arse->nTab==1);.
c2a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c2b0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
c2c0: 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50 61 72  enWrite, 1, pPar
c2d0: 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62  se->regRoot, iDb
c2e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c2f0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
c300: 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  1);.      pParse
c310: 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20  ->nTab = 2;.    
c320: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
c330: 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
c340: 52 54 5f 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20  RT_Table, 1);.  
c350: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
c360: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
c370: 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  t, &dest);.     
c380: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c390: 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
c3a0: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  1);.      if( pP
c3b0: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b  arse->nErr==0 ){
c3c0: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
c3d0: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
c3e0: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
c3f0: 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  se, pSelect);.  
c400: 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61        if( pSelTa
c410: 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  b==0 ) return;. 
c420: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
c430: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
c440: 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70       p->nCol = p
c450: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
c460: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20        p->aCol = 
c470: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
c480: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e         pSelTab->
c490: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
c4a0: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
c4b0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
c4c0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
c4d0: 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20  pSelTab);.      
c4e0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
c4f0: 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70  Compute the comp
c500: 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
c510: 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e   CREATE statemen
c520: 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65  t */.    if( pSe
c530: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 53  lect ){.      zS
c540: 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61 62 6c  tmt = createTabl
c550: 65 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a 20 20  eStmt(db, p);.  
c560: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
c570: 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 2d 3e 7a   = (int)(pEnd->z
c580: 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65   - pParse->sName
c590: 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20  Token.z) + 1;.  
c5a0: 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69      zStmt = sqli
c5b0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a  te3MPrintf(db, .
c5c0: 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
c5d0: 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70  E %s %.*s", zTyp
c5e0: 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73  e2, n, pParse->s
c5f0: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20  NameToken.z.    
c600: 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
c610: 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68  /* A slot for th
c620: 65 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72  e record has alr
c630: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
c640: 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20  ted in the .    
c650: 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ** SQLITE_MASTER
c660: 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74   table.  We just
c670: 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65 20   need to update 
c680: 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61  that slot with a
c690: 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  ll.    ** the in
c6a0: 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20  formation we've 
c6b0: 63 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a  collected..    *
c6c0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  /.    sqlite3Nes
c6d0: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
c6e0: 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25  .      "UPDATE %
c6f0: 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20  Q.%s ".         
c700: 22 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20  "SET type='%s', 
c710: 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d  name=%Q, tbl_nam
c720: 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23  e=%Q, rootpage=#
c730: 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20  %d, sql=%Q ".   
c740: 20 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64      "WHERE rowid
c750: 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d  =#%d",.      db-
c760: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
c770: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
c780: 62 29 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c  b),.      zType,
c790: 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c  .      p->zName,
c7a0: 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c  .      p->zName,
c7b0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
c7c0: 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53  egRoot,.      zS
c7d0: 74 6d 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73  tmt,.      pPars
c7e0: 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20  e->regRowid.    
c7f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
c800: 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b  Free(db, zStmt);
c810: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
c820: 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
c830: 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
c840: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
c850: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a  INCREMENT.    /*
c860: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
c870: 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61   we need to crea
c880: 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71  te an sqlite_seq
c890: 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a  uence table for.
c8a0: 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74      ** keeping t
c8b0: 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72  rack of autoincr
c8c0: 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20  ement keys..    
c8d0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 61  */.    if( p->ta
c8e0: 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
c8f0: 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20  increment ){.   
c900: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
c910: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20  ->aDb[iDb];.    
c920: 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
c930: 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29  ma->pSeqTab==0 )
c940: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
c950: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
c960: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22  rse,.          "
c970: 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e  CREATE TABLE %Q.
c980: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28  sqlite_sequence(
c990: 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20  name,seq)",.    
c9a0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
c9b0: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
c9c0: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
c9d0: 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65  ..    /* Reparse
c9e0: 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75   everything to u
c9f0: 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e  pdate our intern
ca00: 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72  al data structur
ca10: 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  es */.    sqlite
ca20: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
ca30: 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69  P_ParseSchema, i
ca40: 44 62 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  Db, 0, 0,.      
ca50: 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
ca60: 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27  (db, "tbl_name='
ca70: 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29 2c 20  %q'",p->zName), 
ca80: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
ca90: 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  ...  /* Add the 
caa0: 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d  table to the in-
cab0: 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
cac0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
cad0: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  abase..  */.  if
cae0: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
caf0: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f  ){.    Table *pO
cb00: 6c 64 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a  ld;.    Schema *
cb10: 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63  pSchema = p->pSc
cb20: 68 65 6d 61 3b 0a 20 20 20 20 70 4f 6c 64 20 3d  hema;.    pOld =
cb30: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
cb40: 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c  rt(&pSchema->tbl
cb50: 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a  Hash, p->zName,.
cb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
cb80: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e  ite3Strlen30(p->
cb90: 7a 4e 61 6d 65 29 2c 70 29 3b 0a 20 20 20 20 69  zName),p);.    i
cba0: 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20  f( pOld ){.     
cbb0: 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64   assert( p==pOld
cbc0: 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d   );  /* Malloc m
cbd0: 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
cbe0: 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65 72  inside HashInser
cbf0: 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d  t() */.      db-
cc00: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
cc10: 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  1;.      return;
cc20: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
cc30: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30  e->pNewTable = 0
cc40: 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65  ;.    db->nTable
cc50: 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67  ++;.    db->flag
cc60: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
cc70: 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e  rnChanges;..#ifn
cc80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cc90: 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69  ALTERTABLE.    i
cca0: 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29  f( !p->pSelect )
ccb0: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
ccc0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e  ar *zName = (con
ccd0: 73 74 20 63 68 61 72 20 2a 29 70 50 61 72 73 65  st char *)pParse
cce0: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a  ->sNameToken.z;.
ccf0: 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b        int nName;
cd00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
cd10: 70 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73  pSelect && pCons
cd20: 20 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20   && pEnd );.    
cd30: 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d    if( pCons->z==
cd40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  0 ){.        pCo
cd50: 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20  ns = pEnd;.     
cd60: 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d   }.      nName =
cd70: 20 28 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68   (int)((const ch
cd80: 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20  ar *)pCons->z - 
cd90: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d  zName);.      p-
cda0: 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20  >addColOffset = 
cdb0: 31 33 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38  13 + sqlite3Utf8
cdc0: 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e  CharLen(zName, n
cdd0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Name);.    }.#en
cde0: 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  dif.  }.}..#ifnd
cdf0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
ce00: 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  IEW./*.** The pa
ce10: 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
ce20: 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72  routine in order
ce30: 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
ce40: 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71   VIEW.*/.void sq
ce50: 6c 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28  lite3CreateView(
ce60: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
ce70: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  ,     /* The par
ce80: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
ce90: 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c    Token *pBegin,
cea0: 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41       /* The CREA
ceb0: 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
cec0: 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65  gins the stateme
ced0: 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nt */.  Token *p
cee0: 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68  Name1,     /* Th
cef0: 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c  e token that hol
cf00: 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ds the name of t
cf10: 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  he view */.  Tok
cf20: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
cf30: 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
cf40: 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
cf50: 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
cf60: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
cf70: 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54  t,   /* A SELECT
cf80: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
cf90: 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
cfa0: 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  new view */.  in
cfb0: 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20  t isTemp,       
cfc0: 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54   /* TRUE for a T
cfd0: 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f  EMPORARY view */
cfe0: 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20  .  int noErr    
cff0: 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73        /* Suppres
d000: 73 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  s error messages
d010: 20 69 66 20 56 49 45 57 20 61 6c 72 65 61 64 79   if VIEW already
d020: 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20   exists */.){.  
d030: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
d040: 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n;.  const char 
d050: 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64  *z;.  Token sEnd
d060: 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  ;.  DbFixer sFix
d070: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  ;.  Token *pName
d080: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73  ;.  int iDb;.  s
d090: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
d0a0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
d0b0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29  pParse->nVar>0 )
d0c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
d0d0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70  orMsg(pParse, "p
d0e0: 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f  arameters are no
d0f0: 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65  t allowed in vie
d100: 77 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ws");.    sqlite
d110: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
d120: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
d130: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
d140: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
d150: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
d160: 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20  pName2, isTemp, 
d170: 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20  1, 0, noErr);.  
d180: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
d190: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
d1a0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
d1b0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
d1c0: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72   pSelect);.    r
d1d0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
d1e0: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
d1f0: 72 3d 3d 30 20 29 3b 20 2f 2a 20 49 66 20 73 71  r==0 ); /* If sq
d200: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 20  lite3StartTable 
d210: 72 65 74 75 72 6e 20 6e 6f 6e 2d 4e 55 4c 4c 20  return non-NULL 
d220: 74 68 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20  then.           
d230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d240: 20 20 2a 2a 20 74 68 65 72 65 20 63 6f 75 6c 64    ** there could
d250: 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 61   not have been a
d260: 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 73 71 6c  n error */.  sql
d270: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
d280: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
d290: 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
d2a0: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
d2b0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
d2c0: 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  , p->pSchema);. 
d2d0: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 49   if( sqlite3FixI
d2e0: 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73  nit(&sFix, pPars
d2f0: 65 2c 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20  e, iDb, "view", 
d300: 70 4e 61 6d 65 29 0a 20 20 20 20 26 26 20 73 71  pName).    && sq
d310: 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28 26  lite3FixSelect(&
d320: 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29 0a 20  sFix, pSelect). 
d330: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
d340: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
d350: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
d360: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
d370: 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  Make a copy of t
d380: 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54  he entire SELECT
d390: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
d3a0: 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
d3b0: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c  ..  ** This will
d3c0: 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45   force all the E
d3d0: 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75  xpr.token.z valu
d3e0: 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63  es to be dynamic
d3f0: 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  ally.  ** alloca
d400: 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e 20  ted rather than 
d410: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70  point to the inp
d420: 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63  ut string - whic
d430: 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a  h means that.  *
d440: 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73  * they will pers
d450: 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63 75  ist after the cu
d460: 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78  rrent sqlite3_ex
d470: 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e  ec() call return
d480: 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65  s..  */.  p->pSe
d490: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
d4a0: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53 65 6c  lectDup(db, pSel
d4b0: 65 63 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44  ect, EXPRDUP_RED
d4c0: 55 43 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  UCE);.  sqlite3S
d4d0: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
d4e0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20  pSelect);.  if( 
d4f0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d500: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
d510: 20 20 7d 0a 20 20 69 66 28 20 21 64 62 2d 3e 69    }.  if( !db->i
d520: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
d530: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
d540: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
d550: 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , p);.  }..  /* 
d560: 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f  Locate the end o
d570: 66 20 74 68 65 20 43 52 45 41 54 45 20 56 49 45  f the CREATE VIE
d580: 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61  W statement.  Ma
d590: 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f  ke sEnd point to
d5a0: 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20  .  ** the end.. 
d5b0: 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61   */.  sEnd = pPa
d5c0: 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b  rse->sLastToken;
d5d0: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 73 45  .  if( ALWAYS(sE
d5e0: 6e 64 2e 7a 5b 30 5d 21 3d 30 29 20 26 26 20 73  nd.z[0]!=0) && s
d5f0: 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b  End.z[0]!=';' ){
d600: 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73  .    sEnd.z += s
d610: 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e  End.n;.  }.  sEn
d620: 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28  d.n = 0;.  n = (
d630: 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70 42  int)(sEnd.z - pB
d640: 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 7a 20 3d 20  egin->z);.  z = 
d650: 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69  pBegin->z;.  whi
d660: 6c 65 28 20 41 4c 57 41 59 53 28 6e 3e 30 29 20  le( ALWAYS(n>0) 
d670: 26 26 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  && sqlite3Isspac
d680: 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d  e(z[n-1]) ){ n--
d690: 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26  ; }.  sEnd.z = &
d6a0: 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e  z[n-1];.  sEnd.n
d6b0: 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20   = 1;..  /* Use 
d6c0: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
d6d0: 29 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65  ) to add the vie
d6e0: 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f  w to the SQLITE_
d6f0: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a  MASTER table */.
d700: 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c    sqlite3EndTabl
d710: 65 28 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45  e(pParse, 0, &sE
d720: 6e 64 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  nd, 0);.  return
d730: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
d740: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
d750: 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
d760: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
d770: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
d780: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
d790: 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68  LTABLE)./*.** Th
d7a0: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
d7b0: 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c  e pTable is real
d7c0: 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c  ly a VIEW.  Fill
d7d0: 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66   in the names of
d7e0: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  .** the columns 
d7f0: 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74  of the view in t
d800: 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74  he pTable struct
d810: 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ure.  Return the
d820: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
d830: 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72  rors.  If an err
d840: 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65  or is seen leave
d850: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
d860: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
d870: 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
d880: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
d890: 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50  nNames(Parse *pP
d8a0: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
d8b0: 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ble){.  Table *p
d8c0: 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66  SelTab;   /* A f
d8d0: 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77  ake table from w
d8e0: 68 69 63 68 20 77 65 20 67 65 74 20 74 68 65 20  hich we get the 
d8f0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
d900: 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20  Select *pSel;   
d910: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65    /* Copy of the
d920: 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70   SELECT that imp
d930: 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77  lements the view
d940: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d   */.  int nErr =
d950: 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   0;     /* Numbe
d960: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
d970: 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74  untered */.  int
d980: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   n;            /
d990: 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f  * Temporarily ho
d9a0: 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  lds the number o
d9b0: 66 20 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e  f cursors assign
d9c0: 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ed */.  sqlite3 
d9d0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
d9e0: 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  ;  /* Database c
d9f0: 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61  onnection for ma
da00: 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a 20  lloc errors */. 
da10: 20 69 6e 74 20 28 2a 78 41 75 74 68 29 28 76 6f   int (*xAuth)(vo
da20: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68  id*,int,const ch
da30: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ar*,const char*,
da40: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
da50: 74 20 63 68 61 72 2a 29 3b 0a 0a 20 20 61 73 73  t char*);..  ass
da60: 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a  ert( pTable );..
da70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
da80: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
da90: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 74  .  if( sqlite3Vt
daa0: 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50  abCallConnect(pP
dab0: 61 72 73 65 2c 20 70 54 61 62 6c 65 29 20 29 7b  arse, pTable) ){
dac0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
dad0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
dae0: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
daf0: 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30  able) ) return 0
db00: 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ;.#endif..#ifnde
db10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
db20: 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69  EW.  /* A positi
db30: 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68  ve nCol means th
db40: 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20  e columns names 
db50: 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72  for this view ar
db60: 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b  e.  ** already k
db70: 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nown..  */.  if(
db80: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20   pTable->nCol>0 
db90: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
dba0: 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * A negative nCo
dbb0: 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d  l is a special m
dbc0: 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68  arker meaning th
dbd0: 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e  at we are curren
dbe0: 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20  tly.  ** trying 
dbf0: 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63  to compute the c
dc00: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66  olumn names.  If
dc10: 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72   we enter this r
dc20: 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a  outine with.  **
dc30: 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   a negative nCol
dc40: 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f  , it means two o
dc50: 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72  r more views for
dc60: 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74  m a loop, like t
dc70: 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  his:.  **.  **  
dc80: 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f     CREATE VIEW o
dc90: 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  ne AS SELECT * F
dca0: 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20  ROM two;.  **   
dcb0: 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77    CREATE VIEW tw
dcc0: 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  o AS SELECT * FR
dcd0: 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a  OM one;.  **.  *
dce0: 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20  * Actually, the 
dcf0: 65 72 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e  error above is n
dd00: 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f 72 20  ow caught prior 
dd10: 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69 73  to reaching this
dd20: 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74   point..  ** But
dd30: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
dd40: 65 73 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70  est is still imp
dd50: 6f 72 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65  ortant as it doe
dd60: 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69  s come up.  ** i
dd70: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  n the following:
dd80: 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20  .  ** .  **     
dd90: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69  CREATE TABLE mai
dda0: 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20  n.ex1(a);.  **  
ddb0: 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20 56     CREATE TEMP V
ddc0: 49 45 57 20 65 78 31 20 41 53 20 53 45 4c 45 43  IEW ex1 AS SELEC
ddd0: 54 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20  T a FROM ex1;.  
dde0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  **     SELECT * 
ddf0: 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20  FROM temp.ex1;. 
de00: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
de10: 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ->nCol<0 ){.    
de20: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
de30: 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73  pParse, "view %s
de40: 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64   is circularly d
de50: 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d  efined", pTable-
de60: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
de70: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 1;.  }.  ass
de80: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  ert( pTable->nCo
de90: 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  l>=0 );..  /* If
dea0: 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
deb0: 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65  , it means we ne
dec0: 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
ded0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20  e table names.. 
dee0: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
def0: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
df00: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
df10: 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64  ct() will expand
df20: 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c   any.  ** "*" el
df30: 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65  ements in the re
df40: 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65  sults set of the
df50: 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61   view and will a
df60: 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20  ssign cursors.  
df70: 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e  ** to the elemen
df80: 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ts of the FROM c
df90: 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65 20 64  lause.  But we d
dfa0: 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65  o not want these
dfb0: 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f   changes.  ** to
dfc0: 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20   be permanent.  
dfd0: 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  So the computati
dfe0: 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20  on is done on a 
dff0: 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
e000: 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  CT.  ** statemen
e010: 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
e020: 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20  he view..  */.  
e030: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
e040: 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65  pSelect );.  pSe
e050: 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  l = sqlite3Selec
e060: 74 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d  tDup(db, pTable-
e070: 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
e080: 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20  if( pSel ){.    
e090: 75 38 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69  u8 enableLookasi
e0a0: 64 65 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  de = db->lookasi
e0b0: 64 65 2e 62 45 6e 61 62 6c 65 64 3b 0a 20 20 20  de.bEnabled;.   
e0c0: 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61   n = pParse->nTa
e0d0: 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72  b;.    sqlite3Sr
e0e0: 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
e0f0: 72 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  rs(pParse, pSel-
e100: 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62  >pSrc);.    pTab
e110: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20  le->nCol = -1;. 
e120: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
e130: 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 23  .bEnabled = 0;.#
e140: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e150: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
e160: 0a 20 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d  .    xAuth = db-
e170: 3e 78 41 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e  >xAuth;.    db->
e180: 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 70  xAuth = 0;.    p
e190: 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
e1a0: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
e1b0: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b  t(pParse, pSel);
e1c0: 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d  .    db->xAuth =
e1d0: 20 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20   xAuth;.#else.  
e1e0: 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
e1f0: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
e200: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
e210: 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64  l);.#endif.    d
e220: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
e230: 61 62 6c 65 64 20 3d 20 65 6e 61 62 6c 65 4c 6f  abled = enableLo
e240: 6f 6b 61 73 69 64 65 3b 0a 20 20 20 20 70 50 61  okaside;.    pPa
e250: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20  rse->nTab = n;. 
e260: 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 20 29     if( pSelTab )
e270: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
e280: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20  pTable->aCol==0 
e290: 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  );.      pTable-
e2a0: 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
e2b0: 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61  >nCol;.      pTa
e2c0: 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c  ble->aCol = pSel
e2d0: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
e2e0: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
e2f0: 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61   0;.      pSelTa
e300: 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
e310: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
e320: 54 61 62 6c 65 28 70 53 65 6c 54 61 62 29 3b 0a  Table(pSelTab);.
e330: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53        pTable->pS
e340: 63 68 65 6d 61 2d 3e 66 6c 61 67 73 20 7c 3d 20  chema->flags |= 
e350: 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b  DB_UnresetViews;
e360: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e370: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
e380: 20 30 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b   0;.      nErr++
e390: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
e3a0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
e3b0: 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 7d 20 65  db, pSel);.  } e
e3c0: 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b  lse {.    nErr++
e3d0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
e3e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
e3f0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45 72   */.  return nEr
e400: 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  r;  .}.#endif /*
e410: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
e420: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
e430: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
e440: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
e450: 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) */..#ifndef SQ
e460: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f  LITE_OMIT_VIEW./
e470: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63  *.** Clear the c
e480: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d  olumn names from
e490: 20 65 76 65 72 79 20 56 49 45 57 20 69 6e 20 64   every VIEW in d
e4a0: 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a  atabase idx..*/.
e4b0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
e4c0: 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73  teViewResetAll(s
e4d0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
e4e0: 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  idx){.  HashElem
e4f0: 20 2a 69 3b 0a 20 20 69 66 28 20 21 44 62 48 61   *i;.  if( !DbHa
e500: 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  sProperty(db, id
e510: 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
e520: 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ws) ) return;.  
e530: 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
e540: 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69  First(&db->aDb[i
e550: 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  dx].pSchema->tbl
e560: 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74  Hash); i;i=sqlit
e570: 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
e580: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
e590: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
e5a0: 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  i);.    if( pTab
e5b0: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
e5c0: 20 20 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f     sqliteResetCo
e5d0: 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b  lumnNames(pTab);
e5e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43  .    }.  }.  DbC
e5f0: 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c  learProperty(db,
e600: 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
e610: 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a  Views);.}.#else.
e620: 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56  # define sqliteV
e630: 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29  iewResetAll(A,B)
e640: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
e650: 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
e660: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
e670: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
e680: 20 74 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a   the VDBE to adj
e690: 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ust the internal
e6a0: 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20   schema.** used 
e6b0: 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74  by SQLite when t
e6c0: 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d  he btree layer m
e6d0: 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f  oves a table roo
e6e0: 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72  t page. The.** r
e6f0: 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61  oot-page of a ta
e700: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20  ble or index in 
e710: 64 61 74 61 62 61 73 65 20 69 44 62 20 68 61 73  database iDb has
e720: 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46   changed from iF
e730: 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a  rom.** to iTo..*
e740: 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31 37 32  *.** Ticket #172
e750: 38 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c 20 74  8:  The symbol t
e760: 61 62 6c 65 20 6d 69 67 68 74 20 73 74 69 6c 6c  able might still
e770: 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61   contain informa
e780: 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65  tion.** on table
e790: 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73  s and/or indices
e7a0: 20 74 68 61 74 20 61 72 65 20 74 68 65 20 70 72   that are the pr
e7b0: 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 64  ocess of being d
e7c0: 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f  eleted..** If yo
e7d0: 75 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f  u are unlucky, o
e7e0: 6e 65 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65  ne of those dele
e7f0: 74 65 64 20 69 6e 64 69 63 65 73 20 6f 72 20 74  ted indices or t
e800: 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68  ables might.** h
e810: 61 76 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f  ave the same roo
e820: 74 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20  tpage number as 
e830: 74 68 65 20 72 65 61 6c 20 74 61 62 6c 65 20 6f  the real table o
e840: 72 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a  r index that is.
e850: 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20  ** being moved. 
e860: 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73 74   So we cannot st
e870: 6f 70 20 73 65 61 72 63 68 69 6e 67 20 61 66 74  op searching aft
e880: 65 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  er the first mat
e890: 63 68 20 0a 2a 2a 20 62 65 63 61 75 73 65 20 74  ch .** because t
e8a0: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 6d  he first match m
e8b0: 69 67 68 74 20 62 65 20 66 6f 72 20 6f 6e 65 20  ight be for one 
e8c0: 6f 66 20 74 68 65 20 64 65 6c 65 74 65 64 20 69  of the deleted i
e8d0: 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62  ndices.** or tab
e8e0: 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74 68 65 20  les and not the 
e8f0: 74 61 62 6c 65 2f 69 6e 64 65 78 20 74 68 61 74  table/index that
e900: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 62 65 69   is actually bei
e910: 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20  ng moved..** We 
e920: 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f  must continue lo
e930: 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20  oping until all 
e940: 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63  tables and indic
e950: 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70  es with.** rootp
e960: 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20  age==iFrom have 
e970: 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 74  been converted t
e980: 6f 20 68 61 76 65 20 61 20 72 6f 6f 74 70 61 67  o have a rootpag
e990: 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f  e of iTo.** in o
e9a0: 72 64 65 72 20 74 6f 20 62 65 20 63 65 72 74 61  rder to be certa
e9b0: 69 6e 20 74 68 61 74 20 77 65 20 67 6f 74 20 74  in that we got t
e9c0: 68 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f  he right one..*/
e9d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e9e0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
e9f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74  void sqlite3Root
ea00: 50 61 67 65 4d 6f 76 65 64 28 44 62 20 2a 70 44  PageMoved(Db *pD
ea10: 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  b, int iFrom, in
ea20: 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c  t iTo){.  HashEl
ea30: 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73  em *pElem;.  Has
ea40: 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 70 48 61  h *pHash;..  pHa
ea50: 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65  sh = &pDb->pSche
ea60: 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66  ma->tblHash;.  f
ea70: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
ea80: 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b  ashFirst(pHash);
ea90: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
eaa0: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
eab0: 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  em)){.    Table 
eac0: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
ead0: 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
eae0: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75     if( pTab->tnu
eaf0: 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  m==iFrom ){.    
eb00: 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69    pTab->tnum = i
eb10: 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  To;.    }.  }.  
eb20: 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53  pHash = &pDb->pS
eb30: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a  chema->idxHash;.
eb40: 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
eb50: 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73  teHashFirst(pHas
eb60: 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
eb70: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
eb80: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64  pElem)){.    Ind
eb90: 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74  ex *pIdx = sqlit
eba0: 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
ebb0: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  ;.    if( pIdx->
ebc0: 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  tnum==iFrom ){. 
ebd0: 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20       pIdx->tnum 
ebe0: 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  = iTo;.    }.  }
ebf0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
ec00: 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65   Write code to e
ec10: 72 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 77  rase the table w
ec20: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54  ith root-page iT
ec30: 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61  able from databa
ec40: 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20  se iDb..** Also 
ec50: 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f  write code to mo
ec60: 64 69 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f  dify the sqlite_
ec70: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
ec80: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
ec90: 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61  .** if a root-pa
eca0: 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61  ge of another ta
ecb0: 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20  ble is moved by 
ecc0: 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20  the btree-layer 
ecd0: 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e  whilst.** erasin
ece0: 67 20 69 54 61 62 6c 65 20 28 74 68 69 73 20 63  g iTable (this c
ecf0: 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  an happen with a
ed00: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
ed10: 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61  tabase)..*/ .sta
ed20: 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79  tic void destroy
ed30: 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a  RootPage(Parse *
ed40: 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62  pParse, int iTab
ed50: 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  le, int iDb){.  
ed60: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
ed70: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
ed80: 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c  ;.  int r1 = sql
ed90: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
eda0: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
edb0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
edc0: 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c  P_Destroy, iTabl
edd0: 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20 20 73  e, r1, iDb);.  s
ede0: 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
edf0: 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20  Parse);.#ifndef 
ee00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
ee10: 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44  VACUUM.  /* OP_D
ee20: 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e  estroy stores an
ee30: 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20   in integer r1. 
ee40: 49 66 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a  If this integer.
ee50: 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f    ** is non-zero
ee60: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
ee70: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
ee80: 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76  r of a table mov
ee90: 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74  ed to.  ** locat
eea0: 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20  ion iTable. The 
eeb0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d  following code m
eec0: 6f 64 69 66 69 65 73 20 74 68 65 20 73 71 6c 69  odifies the sqli
eed0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
eee0: 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20  to.  ** reflect 
eef0: 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this..  **.  ** 
ef00: 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68  The "#NNN" in th
ef10: 65 20 53 51 4c 20 69 73 20 61 20 73 70 65 63 69  e SQL is a speci
ef20: 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74  al constant that
ef30: 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72 20   means whatever 
ef40: 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e  value.  ** is in
ef50: 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20   register NNN.  
ef60: 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75 6c 65  See grammar rule
ef70: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
ef80: 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53 54 45  h the TK_REGISTE
ef90: 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72  R.  ** token for
efa0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
efb0: 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  rmation..  */.  
efc0: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
efd0: 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
efe0: 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 53   "UPDATE %Q.%s S
eff0: 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57  ET rootpage=%d W
f000: 48 45 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f  HERE #%d AND roo
f010: 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20  tpage=#%d",.    
f020: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
f030: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
f040: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
f050: 69 54 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b  iTable, r1, r1);
f060: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
f070: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
f080: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a  pParse, r1);.}..
f090: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45  /*.** Write VDBE
f0a0: 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74   code to erase t
f0b0: 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c  able pTab and al
f0c0: 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64  l associated ind
f0d0: 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a  ices on disk..**
f0e0: 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20   Code to update 
f0f0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
f100: 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74  r tables and int
f110: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66  ernal schema def
f120: 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63  initions.** in c
f130: 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20  ase a root-page 
f140: 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f  belonging to ano
f150: 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f  ther table is mo
f160: 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  ved by the btree
f170: 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73   layer.** is als
f180: 6f 20 61 64 64 65 64 20 28 74 68 69 73 20 63 61  o added (this ca
f190: 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e  n happen with an
f1a0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
f1b0: 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  abase)..*/.stati
f1c0: 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61  c void destroyTa
f1d0: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
f1e0: 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  e, Table *pTab){
f1f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
f200: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
f210: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
f220: 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
f230: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
f240: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
f250: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64 65 73  >pSchema);.  des
f260: 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
f270: 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  rse, pTab->tnum,
f280: 20 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64   iDb);.  for(pId
f290: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
f2a0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
f2b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73  >pNext){.    des
f2c0: 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
f2d0: 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  rse, pIdx->tnum,
f2e0: 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65   iDb);.  }.#else
f2f0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
f300: 61 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74  abase may be aut
f310: 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65  o-vacuum capable
f320: 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54   (if SQLITE_OMIT
f330: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a  _AUTOVACUUM.  **
f340: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29   is not defined)
f350: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70  , then it is imp
f360: 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f  ortant to call O
f370: 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65  P_Destroy on the
f380: 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  .  ** table and 
f390: 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73  index root-pages
f3a0: 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74   in order, start
f3b0: 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d  ing with the num
f3c0: 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c  erically .  ** l
f3d0: 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
f3e0: 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75   number. This gu
f3f0: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f  arantees that no
f400: 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70  ne of the root-p
f410: 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20  ages.  ** to be 
f420: 64 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c  destroyed is rel
f430: 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72  ocated by an ear
f440: 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e  lier OP_Destroy.
f450: 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a   i.e. if the.  *
f460: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65  * following were
f470: 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a   coded:.  **.  *
f480: 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30  * OP_Destroy 4 0
f490: 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f  .  ** ....  ** O
f4a0: 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20  P_Destroy 5 0.  
f4b0: 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74  **.  ** and root
f4c0: 20 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64   page 5 happened
f4d0: 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65   to be the large
f4e0: 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  st root-page num
f4f0: 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ber in the.  ** 
f500: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72  database, then r
f510: 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64  oot page 5 would
f520: 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67   be moved to pag
f530: 65 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a  e 4 by the .  **
f540: 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30   "OP_Destroy 4 0
f550: 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75  " opcode. The su
f560: 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73  bsequent "OP_Des
f570: 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20  troy 5 0" would 
f580: 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d  hit.  ** a free-
f590: 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  list page..  */.
f5a0: 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61    int iTab = pTa
f5b0: 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69  b->tnum;.  int i
f5c0: 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a  Destroyed = 0;..
f5d0: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
f5e0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
f5f0: 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20     int iLargest 
f600: 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44  = 0;..    if( iD
f610: 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69  estroyed==0 || i
f620: 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29  Tab<iDestroyed )
f630: 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74  {.      iLargest
f640: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20   = iTab;.    }. 
f650: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
f660: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
f670: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
f680: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64  ){.      int iId
f690: 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a  x = pIdx->tnum;.
f6a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
f6b0: 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  dx->pSchema==pTa
f6c0: 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  b->pSchema );.  
f6d0: 20 20 20 20 69 66 28 20 28 69 44 65 73 74 72 6f      if( (iDestro
f6e0: 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c  yed==0 || (iIdx<
f6f0: 69 44 65 73 74 72 6f 79 65 64 29 29 20 26 26 20  iDestroyed)) && 
f700: 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b  iIdx>iLargest ){
f710: 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67 65 73  .        iLarges
f720: 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20  t = iIdx;.      
f730: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
f740: 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20  iLargest==0 ){. 
f750: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
f760: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
f770: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
f780: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
f790: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
f7a0: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 64  Schema);.      d
f7b0: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
f7c0: 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c  Parse, iLargest,
f7d0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65   iDb);.      iDe
f7e0: 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65  stroyed = iLarge
f7f0: 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  st;.    }.  }.#e
f800: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif.}../*.** Th
f810: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
f820: 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77  lled to do the w
f830: 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41  ork of a DROP TA
f840: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
f850: 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e  * pName is the n
f860: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
f870: 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a   to be dropped..
f880: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
f890: 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  ropTable(Parse *
f8a0: 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
f8b0: 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69  *pName, int isVi
f8c0: 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a  ew, int noErr){.
f8d0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
f8e0: 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
f8f0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
f900: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
f910: 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
f920: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
f930: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
f940: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  able;.  }.  asse
f950: 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
f960: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
f970: 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
f980: 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  );.  pTab = sqli
f990: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
f9a0: 50 61 72 73 65 2c 20 69 73 56 69 65 77 2c 20 0a  Parse, isView, .
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9c0: 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 61 6d              pNam
f9d0: 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70  e->a[0].zName, p
f9e0: 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
f9f0: 62 61 73 65 29 3b 0a 0a 20 20 69 66 28 20 70 54  base);..  if( pT
fa00: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ab==0 ){.    if(
fa10: 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20   noErr ){.      
fa20: 73 71 6c 69 74 65 33 45 72 72 6f 72 43 6c 65 61  sqlite3ErrorClea
fa30: 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  r(pParse);.    }
fa40: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
fa50: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
fa60: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
fa70: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
fa80: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
fa90: 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
faa0: 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
fab0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61 62  );..  /* If pTab
fac0: 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74 61   is a virtual ta
fad0: 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77 47 65  ble, call ViewGe
fae0: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 74  tColumnNames() t
faf0: 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20 69 74  o ensure.  ** it
fb00: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   is initialized.
fb10: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69  .  */.  if( IsVi
fb20: 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20 73  rtual(pTab) && s
fb30: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
fb40: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
fb50: 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67 6f   pTab) ){.    go
fb60: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
fb70: 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  le;.  }.#ifndef 
fb80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
fb90: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
fba0: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
fbb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
fbc0: 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
fbd0: 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  iDb);.    const 
fbe0: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
fbf0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
fc00: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
fc10: 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20 20 20 69  zArg2 = 0;.    i
fc20: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
fc30: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
fc40: 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
fc50: 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20   0, zDb)){.     
fc60: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
fc70: 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  table;.    }.   
fc80: 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20   if( isView ){. 
fc90: 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
fca0: 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
fcb0: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
fcc0: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
fcd0: 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  MP_VIEW;.      }
fce0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
fcf0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
fd00: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23  _VIEW;.      }.#
fd10: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fd20: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
fd30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73      }else if( Is
fd40: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
fd50: 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51  .      code = SQ
fd60: 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45  LITE_DROP_VTABLE
fd70: 3b 0a 20 20 20 20 20 20 7a 41 72 67 32 20 3d 20  ;.      zArg2 = 
fd80: 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
fd90: 28 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d 6f 64  (db, pTab)->pMod
fda0: 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a  ->zName;.#endif.
fdb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fdc0: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
fdd0: 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
fde0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
fdf0: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
fe00: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
fe10: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
fe20: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41  = SQLITE_DROP_TA
fe30: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  BLE;.      }.   
fe40: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
fe50: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
fe60: 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e  se, code, pTab->
fe70: 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44  zName, zArg2, zD
fe80: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
fe90: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
fea0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
feb0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
fec0: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
fed0: 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e  DELETE, pTab->zN
fee0: 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
fef0: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
ff00: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
ff10: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  }.  }.#endif.  i
ff20: 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
ff30: 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
ff40: 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
ff50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
ff60: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
ff70: 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f  "table %s may no
ff80: 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70  t be dropped", p
ff90: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
ffa0: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
ffb0: 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e  table;.  }..#ifn
ffc0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ffd0: 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65  VIEW.  /* Ensure
ffe0: 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e   DROP TABLE is n
fff0: 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65  ot used on a vie
10000 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57  w, and DROP VIEW
10010 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a   is not used.  *
10020 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20  * on a table..  
10030 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77 20  */.  if( isView 
10040 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
10050 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
10060 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
10070 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41 42  e, "use DROP TAB
10080 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62  LE to delete tab
10090 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  le %s", pTab->zN
100a0 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
100b0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
100c0 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65    }.  if( !isVie
100d0 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
100e0 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
100f0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
10100 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57  , "use DROP VIEW
10110 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20   to delete view 
10120 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
10130 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
10140 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
10150 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
10160 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
10170 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20  emove the table 
10180 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20  from the master 
10190 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69  table.  ** on di
101a0 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  sk..  */.  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 69 66 28 20 76 20 29  arse);.  if( v )
101d0 7b 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a 70  {.    Trigger *p
101e0 54 72 69 67 67 65 72 3b 0a 20 20 20 20 44 62 20  Trigger;.    Db 
101f0 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
10200 69 44 62 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb];.    sqlite
10210 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
10220 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
10230 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
10240 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
10250 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
10260 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
10270 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10280 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
10290 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a  _VBegin);.    }.
102a0 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
102b0 65 33 46 6b 44 72 6f 70 54 61 62 6c 65 28 70 50  e3FkDropTable(pP
102c0 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61  arse, pName, pTa
102d0 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70  b);..    /* Drop
102e0 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73   all triggers as
102f0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
10300 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
10310 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 20 20  opped. Code.    
10320 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  ** is generated 
10330 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65  to remove entrie
10340 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61  s from sqlite_ma
10350 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 20 20  ster and/or.    
10360 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  ** sqlite_temp_m
10370 61 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65  aster if require
10380 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54  d..    */.    pT
10390 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33  rigger = sqlite3
103a0 54 72 69 67 67 65 72 4c 69 73 74 28 70 50 61 72  TriggerList(pPar
103b0 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 77  se, pTab);.    w
103c0 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29  hile( pTrigger )
103d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
103e0 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
103f0 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
10400 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 70   || .          p
10410 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61  Trigger->pSchema
10420 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ==db->aDb[1].pSc
10430 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 73 71  hema );.      sq
10440 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72  lite3DropTrigger
10450 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69  Ptr(pParse, pTri
10460 67 67 65 72 29 3b 0a 20 20 20 20 20 20 70 54 72  gger);.      pTr
10470 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72  igger = pTrigger
10480 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a  ->pNext;.    }..
10490 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
104a0 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
104b0 54 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  T.    /* Remove 
104c0 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74  any entries of t
104d0 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
104e0 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61  ce table associa
104f0 74 65 64 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  ted with.    ** 
10500 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
10510 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73  dropped. This is
10520 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65   done before the
10530 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65   table is droppe
10540 64 0a 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20  d.    ** at the 
10550 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20  btree level, in 
10560 63 61 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  case the sqlite_
10570 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e  sequence table n
10580 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  eeds to.    ** m
10590 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20  ove as a result 
105a0 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e  of the drop (can
105b0 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d   happen in auto-
105c0 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20  vacuum mode)..  
105d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61    */.    if( pTa
105e0 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
105f0 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29  _Autoincrement )
10600 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e  {.      sqlite3N
10610 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
10620 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  e,.        "DELE
10630 54 45 20 46 52 4f 4d 20 25 73 2e 73 71 6c 69 74  TE FROM %s.sqlit
10640 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45  e_sequence WHERE
10650 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20   name=%Q",.     
10660 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70     pDb->zName, p
10670 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  Tab->zName.     
10680 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   );.    }.#endif
10690 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c  ..    /* Drop al
106a0 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  l SQLITE_MASTER 
106b0 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
106c0 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66  entries that ref
106d0 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  er to the.    **
106e0 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67   table. The prog
106f0 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74  ram name loops t
10700 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65  hrough the maste
10710 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65  r table and dele
10720 74 65 73 0a 20 20 20 20 2a 2a 20 65 76 65 72 79  tes.    ** every
10730 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72 73   row that refers
10740 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74   to a table of t
10750 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
10760 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20  the one being.  
10770 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72    ** dropped. Tr
10780 69 67 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c  iggers are handl
10790 65 64 20 73 65 70 65 72 61 74 65 6c 79 20 62 65  ed seperately be
107a0 63 61 75 73 65 20 61 20 74 72 69 67 67 65 72 20  cause a trigger 
107b0 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63 72  can be.    ** cr
107c0 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d  eated in the tem
107d0 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  p database that 
107e0 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
107f0 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 20  e in another.   
10800 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20   ** database..  
10810 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
10820 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
10830 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 44 45  se, .        "DE
10840 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
10850 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25  WHERE tbl_name=%
10860 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69  Q and type!='tri
10870 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20  gger'",.        
10880 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45  pDb->zName, SCHE
10890 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70  MA_TABLE(iDb), p
108a0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
108b0 20 20 2f 2a 20 44 72 6f 70 20 61 6e 79 20 73 74    /* Drop any st
108c0 61 74 69 73 74 69 63 73 20 66 72 6f 6d 20 74 68  atistics from th
108d0 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74  e sqlite_stat1 t
108e0 61 62 6c 65 2c 20 69 66 20 69 74 20 65 78 69 73  able, if it exis
108f0 74 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  ts */.    if( sq
10900 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
10910 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31  b, "sqlite_stat1
10920 22 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  ", db->aDb[iDb].
10930 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
10940 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
10950 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
10960 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
10970 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 31 20  %Q.sqlite_stat1 
10980 57 48 45 52 45 20 74 62 6c 3d 25 51 22 2c 20 70  WHERE tbl=%Q", p
10990 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  Db->zName, pTab-
109a0 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a  >zName.      );.
109b0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
109c0 69 73 56 69 65 77 20 26 26 20 21 49 73 56 69 72  isView && !IsVir
109d0 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
109e0 20 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65      destroyTable
109f0 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
10a00 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
10a10 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 65  move the table e
10a20 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65  ntry from SQLite
10a30 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  's internal sche
10a40 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20  ma and modify.  
10a50 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20    ** the schema 
10a60 63 6f 6f 6b 69 65 2e 0a 20 20 20 20 2a 2f 0a 20  cookie..    */. 
10a70 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
10a80 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
10a90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10aa0 34 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79  4(v, OP_VDestroy
10ab0 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61  , iDb, 0, 0, pTa
10ac0 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
10ad0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
10ae0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
10af0 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20  DropTable, iDb, 
10b00 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  0, 0, pTab->zNam
10b10 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 0);.    sqlit
10b20 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
10b30 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d  Parse, iDb);.  }
10b40 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  .  sqliteViewRes
10b50 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a  etAll(db, iDb);.
10b60 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65  .exit_drop_table
10b70 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
10b80 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61  stDelete(db, pNa
10b90 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  me);.}../*.** Th
10ba0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
10bb0 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
10bc0 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79   new foreign key
10bd0 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a   on the table.**
10be0 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
10bf0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
10c00 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69  pFromCol determi
10c10 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e  nes which column
10c20 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72  s.** in the curr
10c30 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20  ent table point 
10c40 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  to the foreign k
10c50 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c  ey.  If pFromCol
10c60 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e  ==0 then.** conn
10c70 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74  ect the key to t
10c80 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69  he last column i
10c90 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73  nserted.  pTo is
10ca0 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20   the name of.** 
10cb0 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72 72  the table referr
10cc0 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69  ed to.  pToCol i
10cd0 73 20 61 20 6c 69 73 74 20 6f 66 20 74 61 62 6c  s a list of tabl
10ce0 65 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 0a  es in the other.
10cf0 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20 74 68 61  ** pTo table tha
10d00 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  t the foreign ke
10d10 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c  y points to.  fl
10d20 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ags contains all
10d30 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
10d40 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69  about the confli
10d50 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
10d60 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66 69  gorithms specifi
10d70 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20  ed.** in the ON 
10d80 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54  DELETE, ON UPDAT
10d90 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20  E and ON INSERT 
10da0 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  clauses..**.** A
10db0 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65  n FKey structure
10dc0 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
10dd0 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
10de0 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  le currently.** 
10df0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
10e00 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  on in the pParse
10e10 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c  ->pNewTable fiel
10e20 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  d..**.** The for
10e30 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20  eign key is set 
10e40 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72  for IMMEDIATE pr
10e50 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62  ocessing.  A sub
10e60 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20  sequent call.** 
10e70 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72 46  to sqlite3DeferF
10e80 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68  oreignKey() migh
10e90 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f  t change this to
10ea0 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f   DEFERRED..*/.vo
10eb0 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
10ec0 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61  ForeignKey(.  Pa
10ed0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
10ee0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
10ef0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
10f00 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20  ist *pFromCol,  
10f10 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
10f20 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f  is table that po
10f30 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62  int to other tab
10f40 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
10f50 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  To,          /* 
10f60 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65  Name of the othe
10f70 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  r table */.  Exp
10f80 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20  rList *pToCol,  
10f90 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
10fa0 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
10fb0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
10fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
10fd0 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
10fe0 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a   algorithms. */.
10ff0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
11000 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23   = pParse->db;.#
11010 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11020 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
11030 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30   FKey *pFKey = 0
11040 3b 0a 20 20 46 4b 65 79 20 2a 70 4e 65 78 74 54  ;.  FKey *pNextT
11050 6f 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  o;.  Table *p = 
11060 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
11070 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  e;.  int nByte;.
11080 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
11090 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  Col;.  char *z;.
110a0 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d  .  assert( pTo!=
110b0 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  0 );.  if( p==0 
110c0 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
110d0 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  AB ) goto fk_end
110e0 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
110f0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
11100 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  Col = p->nCol-1;
11110 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 69  .    if( NEVER(i
11120 43 6f 6c 3c 30 29 20 29 20 67 6f 74 6f 20 66 6b  Col<0) ) goto fk
11130 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54  _end;.    if( pT
11140 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
11150 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
11160 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
11170 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69  g(pParse, "forei
11180 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20  gn key on %s".  
11190 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20         " should 
111a0 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f  reference only o
111b0 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ne column of tab
111c0 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20  le %T",.        
111d0 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a   p->aCol[iCol].z
111e0 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20  Name, pTo);.    
111f0 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
11200 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20     }.    nCol = 
11210 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
11220 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
11230 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c  >nExpr!=pFromCol
11240 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73  ->nExpr ){.    s
11250 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
11260 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
11270 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
11280 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  s in foreign key
11290 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
112a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a  the number of ".
112b0 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73          "columns
112c0 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63   in the referenc
112d0 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20  ed table");.    
112e0 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d  goto fk_end;.  }
112f0 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  else{.    nCol =
11300 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72   pFromCol->nExpr
11310 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
11320 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b  sizeof(*pFKey) +
11330 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66   (nCol-1)*sizeof
11340 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29  (pFKey->aCol[0])
11350 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20   + pTo->n + 1;. 
11360 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20   if( pToCol ){. 
11370 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
11380 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  oCol->nExpr; i++
11390 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  ){.      nByte +
113a0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
113b0 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  0(pToCol->a[i].z
113c0 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d  Name) + 1;.    }
113d0 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73  .  }.  pFKey = s
113e0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
113f0 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a  ro(db, nByte );.
11400 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29    if( pFKey==0 )
11410 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  {.    goto fk_en
11420 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e  d;.  }.  pFKey->
11430 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b  pFrom = p;.  pFK
11440 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20  ey->pNextFrom = 
11450 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20  p->pFKey;.  z = 
11460 28 63 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e 61  (char*)&pFKey->a
11470 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b  Col[nCol];.  pFK
11480 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d  ey->zTo = z;.  m
11490 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c  emcpy(z, pTo->z,
114a0 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54   pTo->n);.  z[pT
114b0 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  o->n] = 0;.  sql
114c0 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a  ite3Dequote(z);.
114d0 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b    z += pTo->n+1;
114e0 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d  .  pFKey->nCol =
114f0 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72   nCol;.  if( pFr
11500 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
11510 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69  pFKey->aCol[0].i
11520 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  From = p->nCol-1
11530 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
11540 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
11550 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
11560 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
11570 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  ; j<p->nCol; j++
11580 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
11590 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d  qlite3StrICmp(p-
115a0 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[j].zName, 
115b0 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
115c0 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
115d0 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
115e0 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a  l[i].iFrom = j;.
115f0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
11600 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11610 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d   }.      if( j>=
11620 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  p->nCol ){.     
11630 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
11640 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
11650 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63        "unknown c
11660 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20  olumn \"%s\" in 
11670 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
11680 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20  nition", .      
11690 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b      pFromCol->a[
116a0 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
116b0 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
116c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
116d0 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  }.  if( pToCol )
116e0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
116f0 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
11700 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74     int n = sqlit
11710 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f  e3Strlen30(pToCo
11720 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  l->a[i].zName);.
11730 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
11740 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20  l[i].zCol = z;. 
11750 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70       memcpy(z, p
11760 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
11770 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e  e, n);.      z[n
11780 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b  ] = 0;.      z +
11790 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  = n+1;.    }.  }
117a0 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65  .  pFKey->isDefe
117b0 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65  rred = 0;.  pFKe
117c0 79 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 20 3d 20  y->aAction[0] = 
117d0 28 75 38 29 28 66 6c 61 67 73 20 26 20 30 78 66  (u8)(flags & 0xf
117e0 66 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  f);            /
117f0 2a 20 4f 4e 20 44 45 4c 45 54 45 20 61 63 74 69  * ON DELETE acti
11800 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 61  on */.  pFKey->a
11810 41 63 74 69 6f 6e 5b 31 5d 20 3d 20 28 75 38 29  Action[1] = (u8)
11820 28 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26  ((flags >> 8 ) &
11830 20 30 78 66 66 29 3b 20 20 20 20 2f 2a 20 4f 4e   0xff);    /* ON
11840 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e 20 2a   UPDATE action *
11850 2f 0a 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20 28  /..  pNextTo = (
11860 46 4b 65 79 20 2a 29 73 71 6c 69 74 65 33 48 61  FKey *)sqlite3Ha
11870 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63  shInsert(&p->pSc
11880 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c 20  hema->fkeyHash, 
11890 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54  .      pFKey->zT
118a0 6f 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  o, sqlite3Strlen
118b0 33 30 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2c 20  30(pFKey->zTo), 
118c0 28 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20 20  (void *)pFKey.  
118d0 29 3b 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f  );.  if( pNextTo
118e0 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 64  ==pFKey ){.    d
118f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11900 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b  = 1;.    goto fk
11910 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
11920 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20 20 20 61  pNextTo ){.    a
11930 73 73 65 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e  ssert( pNextTo->
11940 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20  pPrevTo==0 );.  
11950 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f    pFKey->pNextTo
11960 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20   = pNextTo;.    
11970 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f  pNextTo->pPrevTo
11980 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20   = pFKey;.  }.. 
11990 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72   /* Link the for
119a0 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20  eign key to the 
119b0 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73  table as the las
119c0 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70  t step..  */.  p
119d0 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b  ->pFKey = pFKey;
119e0 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66  .  pFKey = 0;..f
119f0 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33  k_end:.  sqlite3
11a00 44 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79  DbFree(db, pFKey
11a10 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  );.#endif /* !de
11a20 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
11a30 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a  T_FOREIGN_KEY) *
11a40 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  /.  sqlite3ExprL
11a50 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 46  istDelete(db, pF
11a60 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  romCol);.  sqlit
11a70 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
11a80 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a  (db, pToCol);.}.
11a90 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
11aa0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
11ab0 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20  en an INITIALLY 
11ac0 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49  IMMEDIATE or INI
11ad0 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
11ae0 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65  ** clause is see
11af0 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66  n as part of a f
11b00 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
11b10 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65  ition.  The isDe
11b20 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65  ferred.** parame
11b30 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49  ter is 1 for INI
11b40 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20  TIALLY DEFERRED 
11b50 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41  and 0 for INITIA
11b60 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a  LLY IMMEDIATE..*
11b70 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f  * The behavior o
11b80 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
11b90 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65  tly created fore
11ba0 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73  ign key is adjus
11bb0 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  ted.** according
11bc0 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
11bd0 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  te3DeferForeignK
11be0 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ey(Parse *pParse
11bf0 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64  , int isDeferred
11c00 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
11c10 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
11c20 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  EY.  Table *pTab
11c30 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b  ;.  FKey *pFKey;
11c40 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70  .  if( (pTab = p
11c50 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
11c60 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d  )==0 || (pFKey =
11c70 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30   pTab->pFKey)==0
11c80 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
11c90 65 72 74 28 20 69 73 44 65 66 65 72 72 65 64 3d  ert( isDeferred=
11ca0 3d 30 20 7c 7c 20 69 73 44 65 66 65 72 72 65 64  =0 || isDeferred
11cb0 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d  ==1 ); /* EV: R-
11cc0 33 30 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20  30323-21917 */. 
11cd0 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72   pFKey->isDeferr
11ce0 65 64 20 3d 20 28 75 38 29 69 73 44 65 66 65 72  ed = (u8)isDefer
11cf0 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  red;.#endif.}../
11d00 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
11d10 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61  de that will era
11d20 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e  se and refill in
11d30 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73  dex *pIdx.  This
11d40 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69   is.** used to i
11d50 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c  nitialize a newl
11d60 79 20 63 72 65 61 74 65 64 20 69 6e 64 65 78 20  y created index 
11d70 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20  or to recompute 
11d80 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
11d90 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65  f an index in re
11da0 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e  sponse to a REIN
11db0 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  DEX command..**.
11dc0 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67  ** if memRootPag
11dd0 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76  e is not negativ
11de0 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
11df0 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65   the index is ne
11e00 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20  wly.** created. 
11e10 20 54 68 65 20 72 65 67 69 73 74 65 72 20 73 70   The register sp
11e20 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f  ecified by memRo
11e30 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  otPage contains 
11e40 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
11e50 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
11e60 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f  ndex.  If memRoo
11e70 74 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  tPage is negativ
11e80 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69  e, then.** the i
11e90 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
11ea0 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20  sts and must be 
11eb0 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 62  cleared before b
11ec0 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e  eing refilled an
11ed0 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61  d.** the root pa
11ee0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
11ef0 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20   index is taken 
11f00 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75  from pIndex->tnu
11f10 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
11f20 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49  d sqlite3RefillI
11f30 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
11f40 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  se, Index *pInde
11f50 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61  x, int memRootPa
11f60 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ge){.  Table *pT
11f70 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61  ab = pIndex->pTa
11f80 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62  ble;  /* The tab
11f90 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64 65 78  le that is index
11fa0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ed */.  int iTab
11fb0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
11fc0 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20  +;     /* Btree 
11fd0 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  cursor used for 
11fe0 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49  pTab */.  int iI
11ff0 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
12000 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65  b++;     /* Btre
12010 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f  e cursor used fo
12020 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  r pIndex */.  in
12030 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20  t addr1;        
12040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12050 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f  Address of top o
12060 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  f loop */.  int 
12070 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  tnum;           
12080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
12090 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65 78  ot page of index
120a0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
120b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120c0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
120d0 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
120e0 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
120f0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
12100 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ey;             
12110 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66      /* KeyInfo f
12120 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  or index */.  in
12130 74 20 72 65 67 49 64 78 4b 65 79 3b 20 20 20 20  t regIdxKey;    
12140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12150 52 65 67 69 73 74 65 72 73 20 63 6f 6e 74 61 69  Registers contai
12160 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 6b  ning the index k
12170 65 79 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  ey */.  int regR
12180 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20  ecord;          
12190 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
121a0 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d  er holding assem
121b0 62 6c 69 65 64 20 69 6e 64 65 78 20 72 65 63 6f  blied index reco
121c0 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  rd */.  sqlite3 
121d0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
121e0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61  ;      /* The da
121f0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
12200 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d  n */.  int iDb =
12210 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
12220 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
12230 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66  ->pSchema);..#if
12240 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12250 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
12260 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
12270 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
12280 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49  LITE_REINDEX, pI
12290 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a  ndex->zName, 0,.
122a0 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
122b0 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20 20  b].zName ) ){.  
122c0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
122d0 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69  ndif..  /* Requi
122e0 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  re a write-lock 
122f0 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  on the table to 
12300 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70 65  perform this ope
12310 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  ration */.  sqli
12320 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
12330 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
12340 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a  tnum, 1, pTab->z
12350 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71  Name);..  v = sq
12360 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
12370 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
12380 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
12390 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20   memRootPage>=0 
123a0 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d 65  ){.    tnum = me
123b0 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65 6c  mRootPage;.  }el
123c0 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70  se{.    tnum = p
123d0 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20  Index->tnum;.   
123e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
123f0 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20  p2(v, OP_Clear, 
12400 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a  tnum, iDb);.  }.
12410 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
12420 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61  IndexKeyinfo(pPa
12430 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  rse, pIndex);.  
12440 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12450 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  4(v, OP_OpenWrit
12460 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20 69  e, iIdx, tnum, i
12470 44 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  Db, .           
12480 20 20 20 20 20 20 20 20 20 28 63 68 61 72 20 2a           (char *
12490 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46  )pKey, P4_KEYINF
124a0 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 69 66  O_HANDOFF);.  if
124b0 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30  ( memRootPage>=0
124c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
124d0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31  dbeChangeP5(v, 1
124e0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
124f0 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
12500 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61  , iTab, iDb, pTa
12510 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  b, OP_OpenRead);
12520 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
12530 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12540 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
12550 20 30 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64   0);.  regRecord
12560 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
12570 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
12580 72 65 67 49 64 78 4b 65 79 20 3d 20 73 71 6c 69  regIdxKey = sqli
12590 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78  te3GenerateIndex
125a0 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49 6e 64  Key(pParse, pInd
125b0 65 78 2c 20 69 54 61 62 2c 20 72 65 67 52 65 63  ex, iTab, regRec
125c0 6f 72 64 2c 20 31 29 3b 0a 20 20 69 66 28 20 70  ord, 1);.  if( p
125d0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
125e0 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 63  OE_None ){.    c
125f0 6f 6e 73 74 20 69 6e 74 20 72 65 67 52 6f 77 69  onst int regRowi
12600 64 20 3d 20 72 65 67 49 64 78 4b 65 79 20 2b 20  d = regIdxKey + 
12610 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pIndex->nColumn;
12620 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6a  .    const int j
12630 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
12640 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
12650 32 3b 0a 20 20 20 20 76 6f 69 64 20 2a 20 63 6f  2;.    void * co
12660 6e 73 74 20 70 52 65 67 4b 65 79 20 3d 20 53 51  nst pRegKey = SQ
12670 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
12680 72 65 67 49 64 78 4b 65 79 29 3b 0a 0a 20 20 20  regIdxKey);..   
12690 20 2f 2a 20 54 68 65 20 72 65 67 69 73 74 65 72   /* The register
126a0 73 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68  s accessed by th
126b0 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 20 6f 70  e OP_IsUnique op
126c0 63 6f 64 65 20 77 65 72 65 20 61 6c 6c 6f 63 61  code were alloca
126d0 74 65 64 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67  ted.    ** using
126e0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
126f0 61 6e 67 65 28 29 20 69 6e 73 69 64 65 20 6f 66  ange() inside of
12700 20 74 68 65 20 73 71 6c 69 74 65 33 47 65 6e 65   the sqlite3Gene
12710 72 61 74 65 49 6e 64 65 78 4b 65 79 28 29 0a 20  rateIndexKey(). 
12720 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65     ** call above
12730 2e 20 4a 75 73 74 20 62 65 66 6f 72 65 20 74 68  . Just before th
12740 61 74 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  at function was 
12750 66 72 65 65 64 20 74 68 65 79 20 77 65 72 65 20  freed they were 
12760 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
12770 28 6d 61 64 65 20 61 76 61 69 6c 61 62 6c 65 20  (made available 
12780 74 6f 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  to the compiler 
12790 66 6f 72 20 72 65 75 73 65 29 20 75 73 69 6e 67  for reuse) using
127a0 20 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33   .    ** sqlite3
127b0 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
127c0 28 29 2e 20 53 6f 20 69 6e 20 73 6f 6d 65 20 77  (). So in some w
127d0 61 79 73 20 68 61 76 69 6e 67 20 74 68 65 20 4f  ays having the O
127e0 50 5f 49 73 55 6e 69 71 75 65 0a 20 20 20 20 2a  P_IsUnique.    *
127f0 2a 20 6f 70 63 6f 64 65 20 75 73 65 20 74 68 65  * opcode use the
12800 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 77   values stored w
12810 69 74 68 69 6e 20 73 65 65 6d 73 20 64 61 6e 67  ithin seems dang
12820 65 72 6f 75 73 2e 20 48 6f 77 65 76 65 72 2c 20  erous. However, 
12830 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 77 65 20  since.    ** we 
12840 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 61 74  can be sure that
12850 20 6e 6f 20 6f 74 68 65 72 20 74 65 6d 70 20 72   no other temp r
12860 65 67 69 73 74 65 72 73 20 68 61 76 65 20 62 65  egisters have be
12870 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  en allocated.   
12880 20 2a 2a 20 73 69 6e 63 65 20 73 71 6c 69 74 65   ** since sqlite
12890 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
128a0 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  e() was called, 
128b0 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 64 6f  it is safe to do
128c0 20 73 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   so..    */.    
128d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
128e0 34 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71 75 65  4(v, OP_IsUnique
128f0 2c 20 69 49 64 78 2c 20 6a 32 2c 20 72 65 67 52  , iIdx, j2, regR
12900 6f 77 69 64 2c 20 70 52 65 67 4b 65 79 2c 20 50  owid, pRegKey, P
12910 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 73 71  4_INT32);.    sq
12920 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
12930 69 6e 74 28 0a 20 20 20 20 20 20 20 20 70 50 61  int(.        pPa
12940 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 22  rse, OE_Abort, "
12950 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20  indexed columns 
12960 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c  are not unique",
12970 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d   P4_STATIC);.  }
12980 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
12990 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
129a0 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67 52  sert, iIdx, regR
129b0 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
129c0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
129d0 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
129e0 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65  ESULT);.  sqlite
129f0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
12a00 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
12a10 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
12a20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
12a30 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b  xt, iTab, addr1+
12a40 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
12a50 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
12a60 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r1);.  sqlite3Vd
12a70 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
12a80 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20 73  lose, iTab);.  s
12a90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
12aa0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49  (v, OP_Close, iI
12ab0 64 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  dx);.}../*.** Cr
12ac0 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78  eate a new index
12ad0 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c   for an SQL tabl
12ae0 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65  e.  pName1.pName
12af0 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  2 is the name of
12b00 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61   the index .** a
12b10 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74  nd pTblList is t
12b20 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
12b30 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
12b40 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74  be indexed.  Bot
12b50 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55  h will .** be NU
12b60 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79  LL for a primary
12b70 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78   key or an index
12b80 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64   that is created
12b90 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a   to satisfy a.**
12ba0 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
12bb0 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61  nt.  If pTable a
12bc0 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55  nd pIndex are NU
12bd0 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e  LL, use pParse->
12be0 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20  pNewTable.** as 
12bf0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
12c00 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65  indexed.  pParse
12c10 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61  ->pNewTable is a
12c20 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a   table that is.*
12c30 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  * currently bein
12c40 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  g constructed by
12c50 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
12c60 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
12c70 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
12c80 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
12c90 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73  e indexed.  pLis
12ca0 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  t will be NULL i
12cb0 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70  f this.** is a p
12cc0 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e  rimary key or un
12cd0 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20  ique-constraint 
12ce0 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
12cf0 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a  nt column added.
12d00 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ** to the table 
12d10 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
12d20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a  construction.  .
12d30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 64  **.** If the ind
12d40 65 78 20 69 73 20 63 72 65 61 74 65 64 20 73 75  ex is created su
12d50 63 63 65 73 73 66 75 6c 6c 79 2c 20 72 65 74 75  ccessfully, retu
12d60 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
12d70 74 68 65 20 6e 65 77 20 49 6e 64 65 78 0a 2a 2a  the new Index.**
12d80 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 69 73   structure. This
12d90 20 69 73 20 75 73 65 64 20 62 79 20 73 71 6c 69   is used by sqli
12da0 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79  te3AddPrimaryKey
12db0 28 29 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 69  () to mark the i
12dc0 6e 64 65 78 0a 2a 2a 20 61 73 20 74 68 65 20 74  ndex.** as the t
12dd0 61 62 6c 65 73 20 70 72 69 6d 61 72 79 20 6b 65  ables primary ke
12de0 79 20 28 49 6e 64 65 78 2e 61 75 74 6f 49 6e 64  y (Index.autoInd
12df0 65 78 3d 3d 32 29 2e 0a 2a 2f 0a 49 6e 64 65 78  ex==2)..*/.Index
12e00 20 2a 73 71 6c 69 74 65 33 43 72 65 61 74 65 49   *sqlite3CreateI
12e10 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
12e20 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c  Parse,     /* Al
12e30 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  l information ab
12e40 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a  out this parse *
12e50 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
12e60 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  1,     /* First 
12e70 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
12e80 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
12e90 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
12ea0 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e  e2,     /* Secon
12eb0 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20  d part of index 
12ec0 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c  name. May be NUL
12ed0 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  L */.  SrcList *
12ee0 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62  pTblName, /* Tab
12ef0 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65  le to index. Use
12f00 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
12f10 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70  le if 0 */.  Exp
12f20 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
12f30 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c  /* A list of col
12f40 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
12f50 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ed */.  int onEr
12f60 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45  ror,       /* OE
12f70 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72  _Abort, OE_Ignor
12f80 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f  e, OE_Replace, o
12f90 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54  r OE_None */.  T
12fa0 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20  oken *pStart,   
12fb0 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
12fc0 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
12fd0 73 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  s this statement
12fe0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e   */.  Token *pEn
12ff0 64 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  d,       /* The 
13000 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73 20  ")" that closes 
13010 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58  the CREATE INDEX
13020 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
13030 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20  int sortOrder,  
13040 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72     /* Sort order
13050 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20   of primary key 
13060 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c  when pList==NULL
13070 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45   */.  int ifNotE
13080 78 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74  xist     /* Omit
13090 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20   error if index 
130a0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
130b0 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 52  /.){.  Index *pR
130c0 65 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50  et = 0;     /* P
130d0 6f 69 6e 74 65 72 20 74 6f 20 72 65 74 75 72 6e  ointer to return
130e0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
130f0 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61  b = 0;     /* Ta
13100 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
13110 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
13120 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54  ndex = 0;   /* T
13130 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63  he index to be c
13140 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72  reated */.  char
13150 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20   *zName = 0;    
13160 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
13170 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e  index */.  int n
13180 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
13190 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
131a0 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65  racters in zName
131b0 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   */.  int i, j;.
131c0 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20    Token nullId; 
131d0 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 74         /* Fake t
131e0 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74  oken for an empt
131f0 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44  y ID list */.  D
13200 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20  bFixer sFix;    
13210 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67      /* For assig
13220 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61  ning database na
13230 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f  mes to pTable */
13240 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
13250 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20  Mask;   /* 1 to 
13260 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e  honor DESC in in
13270 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72  dex.  0 to ignor
13280 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  e. */.  sqlite3 
13290 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
132a0 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  ;.  Db *pDb;    
132b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
132c0 73 70 65 63 69 66 69 63 20 74 61 62 6c 65 20 63  specific table c
132d0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e  ontaining the in
132e0 64 65 78 65 64 20 64 61 74 61 62 61 73 65 20 2a  dexed database *
132f0 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
13300 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
13310 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
13320 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  e that is being 
13330 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b  written */.  Tok
13340 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20  en *pName = 0;  
13350 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64    /* Unqualified
13360 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
13370 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  ex to create */.
13380 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
13390 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65  t_item *pListIte
133a0 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  m; /* For loopin
133b0 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a  g over pList */.
133c0 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e    int nCol;.  in
133d0 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20  t nExtra = 0;.  
133e0 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a 0a 20  char *zExtra;.. 
133f0 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74 3d   assert( pStart=
13400 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30 20 29 3b  =0 || pEnd!=0 );
13410 20 2f 2a 20 70 45 6e 64 20 6d 75 73 74 20 62 65   /* pEnd must be
13420 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 70 53 74   non-NULL if pSt
13430 61 72 74 20 69 73 20 2a 2f 0a 20 20 61 73 73 65  art is */.  asse
13440 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
13450 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e  ==0 );      /* N
13460 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68  ever called with
13470 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f   prior errors */
13480 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
13490 63 46 61 69 6c 65 64 20 7c 7c 20 49 4e 5f 44 45  cFailed || IN_DE
134a0 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20  CLARE_VTAB ){.  
134b0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
134c0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
134d0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
134e0 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
134f0 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
13500 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
13510 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  _index;.  }..  /
13520 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
13530 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
13540 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65   be indexed.  Re
13550 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f  turn early if no
13560 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
13570 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
13580 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74  ){..    /* Use t
13590 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65  he two-part inde
135a0 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  x name to determ
135b0 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ine the database
135c0 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72   .    ** to sear
135d0 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ch for the table
135e0 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c  . 'Fix' the tabl
135f0 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64  e name to this d
13600 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  b.    ** before 
13610 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74  looking up the t
13620 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
13630 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20   assert( pName1 
13640 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20  && pName2 );.   
13650 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
13660 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
13670 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
13680 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  , &pName);.    i
13690 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20  f( iDb<0 ) goto 
136a0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
136b0 78 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  x;..#ifndef SQLI
136c0 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20  TE_OMIT_TEMPDB. 
136d0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64     /* If the ind
136e0 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75  ex name was unqu
136f0 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69  alified, check i
13700 66 20 74 68 65 20 74 68 65 20 74 61 62 6c 65 0a  f the the table.
13710 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70      ** is a temp
13720 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73   table. If so, s
13730 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
13740 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20  to 1. Do not do 
13750 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69  this.    ** if i
13760 6e 69 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61  nitialising a da
13770 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20  tabase schema.. 
13780 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64     */.    if( !d
13790 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
137a0 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c        pTab = sql
137b0 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75  ite3SrcListLooku
137c0 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61  p(pParse, pTblNa
137d0 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  me);.      if( p
137e0 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70  Name2->n==0 && p
137f0 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63  Tab && pTab->pSc
13800 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d  hema==db->aDb[1]
13810 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  .pSchema ){.    
13820 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20      iDb = 1;.   
13830 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
13840 66 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  f..    if( sqlit
13850 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
13860 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69   pParse, iDb, "i
13870 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 20 26 26  ndex", pName) &&
13880 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13890 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78  FixSrcList(&sFix
138a0 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20 20  , pTblName).    
138b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61  ){.      /* Beca
138c0 75 73 65 20 74 68 65 20 70 61 72 73 65 72 20 63  use the parser c
138d0 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61  onstructs pTblNa
138e0 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  me from a single
138f0 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20   identifier,.   
13900 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78     ** sqlite3Fix
13910 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65  SrcList can neve
13920 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20  r fail. */.     
13930 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20   assert(0);.    
13940 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  }.    pTab = sql
13950 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
13960 70 50 61 72 73 65 2c 20 30 2c 20 70 54 62 6c 4e  pParse, 0, pTblN
13970 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
13980 20 0a 20 20 20 20 20 20 20 20 70 54 62 6c 4e 61   .        pTblNa
13990 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
139a0 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54  se);.    if( !pT
139b0 61 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  ab || db->malloc
139c0 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78  Failed ) goto ex
139d0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
139e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
139f0 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
13a00 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
13a10 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
13a20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d   assert( pName==
13a30 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  0 );.    pTab = 
13a40 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
13a50 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62  e;.    if( !pTab
13a60 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
13a70 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
13a80 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
13a90 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
13aa0 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
13ab0 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  }.  pDb = &db->a
13ac0 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65  Db[iDb];..  asse
13ad0 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
13ae0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
13af0 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66  >nErr==0 );.  if
13b00 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
13b10 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22  p(pTab->zName, "
13b20 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20  sqlite_", 7)==0 
13b30 0a 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d  .       && memcm
13b40 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37  p(&pTab->zName[7
13b50 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c 39 29  ],"altertab_",9)
13b60 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
13b70 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13b80 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
13b90 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
13ba0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
13bb0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
13bc0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
13bd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13be0 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70  MIT_VIEW.  if( p
13bf0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
13c00 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13c10 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65  Msg(pParse, "vie
13c20 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  ws may not be in
13c30 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74  dexed");.    got
13c40 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
13c50 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  dex;.  }.#endif.
13c60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13c70 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
13c80 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
13c90 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  (pTab) ){.    sq
13ca0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13cb0 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74  arse, "virtual t
13cc0 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
13cd0 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20   indexed");.    
13ce0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
13cf0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64  _index;.  }.#end
13d00 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69  if..  /*.  ** Fi
13d10 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nd the name of t
13d20 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20  he index.  Make 
13d30 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
13d40 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65  t already anothe
13d50 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20  r.  ** index or 
13d60 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  table with the s
13d70 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a  ame name.  .  **
13d80 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a  .  ** Exception:
13d90 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64    If we are read
13da0 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ing the names of
13db0 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63   permanent indic
13dc0 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  es from the.  **
13dd0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
13de0 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f  able (because so
13df0 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
13e00 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68   changed the sch
13e10 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e  ema) and.  ** on
13e20 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e  e of the index n
13e30 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69  ames collides wi
13e40 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  th the name of a
13e50 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
13e60 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20   or.  ** index, 
13e70 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e  then we will con
13e80 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73  tinue to process
13e90 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a   this index..  *
13ea0 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d  *.  ** If pName=
13eb0 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  =0 it means that
13ec0 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61   we are.  ** dea
13ed0 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d  ling with a prim
13ee0 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55  ary key or UNIQU
13ef0 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57  E constraint.  W
13f00 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74  e have to invent
13f10 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61   our.  ** own na
13f20 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  me..  */.  if( p
13f30 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d  Name ){.    zNam
13f40 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
13f50 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
13f60 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  me);.    if( zNa
13f70 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  me==0 ) goto exi
13f80 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
13f90 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
13fa0 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  K!=sqlite3CheckO
13fb0 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
13fc0 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
13fd0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
13fe0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
13ff0 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
14000 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20  t.busy ){.      
14010 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
14020 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
14030 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0)!=0 ){.       
14040 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
14050 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
14060 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62  is already a tab
14070 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  le named %s", zN
14080 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
14090 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
140a0 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
140b0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
140c0 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
140d0 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61   zName, pDb->zNa
140e0 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
140f0 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20  if( !ifNotExist 
14100 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
14110 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
14120 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72  e, "index %s alr
14130 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e  eady exists", zN
14140 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
14150 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
14160 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
14170 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
14180 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20  nt n;.    Index 
14190 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28  *pLoop;.    for(
141a0 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64  pLoop=pTab->pInd
141b0 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20  ex, n=1; pLoop; 
141c0 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65  pLoop=pLoop->pNe
141d0 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a  xt, n++){}.    z
141e0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
141f0 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74  rintf(db, "sqlit
14200 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25  e_autoindex_%s_%
14210 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  d", pTab->zName,
14220 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61   n);.    if( zNa
14230 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  me==0 ){.      g
14240 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
14250 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
14260 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
14270 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
14280 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65  o create an inde
14290 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  x..  */.#ifndef 
142a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
142b0 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
142c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
142d0 62 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a  b = pDb->zName;.
142e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
142f0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
14300 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
14310 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
14320 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  ), 0, zDb) ){.  
14330 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
14340 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
14350 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45  }.    i = SQLITE
14360 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20  _CREATE_INDEX;. 
14370 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
14380 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20  PDB && iDb==1 ) 
14390 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
143a0 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  E_TEMP_INDEX;.  
143b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
143c0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69  hCheck(pParse, i
143d0 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  , zName, pTab->z
143e0 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
143f0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
14400 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
14410 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
14420 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20  /* If pList==0, 
14430 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f  it means this ro
14440 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
14450 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61   to make a prima
14460 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20  ry.  ** key out 
14470 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  of the last colu
14480 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  mn added to the 
14490 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
144a0 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53  truction..  ** S
144b0 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20  o create a fake 
144c0 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65  list to simulate
144d0 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   this..  */.  if
144e0 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
144f0 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61    nullId.z = pTa
14500 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
14510 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol-1].zName;.   
14520 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 71 6c 69   nullId.n = sqli
14530 74 65 33 53 74 72 6c 65 6e 33 30 28 28 63 68 61  te3Strlen30((cha
14540 72 2a 29 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20  r*)nullId.z);.  
14550 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
14560 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
14570 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20  pParse, 0, 0);. 
14580 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
14590 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
145a0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 73 71  te_index;.    sq
145b0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
145c0 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4c 69  Name(pParse, pLi
145d0 73 74 2c 20 26 6e 75 6c 6c 49 64 2c 20 30 29 3b  st, &nullId, 0);
145e0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  .    pList->a[0]
145f0 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  .sortOrder = (u8
14600 29 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a  )sortOrder;.  }.
14610 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
14620 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20   how many bytes 
14630 6f 66 20 73 70 61 63 65 20 61 72 65 20 72 65 71  of space are req
14640 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65  uired to store e
14650 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73  xplicitly.  ** s
14660 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69  pecified collati
14670 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
14680 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
14690 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
146a0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
146b0 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74  r *pExpr = pList
146c0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
146d0 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20    if( pExpr ){. 
146e0 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
146f0 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f  oll = pExpr->pCo
14700 6c 6c 3b 0a 20 20 20 20 20 20 2f 2a 20 45 69 74  ll;.      /* Eit
14710 68 65 72 20 70 43 6f 6c 6c 21 3d 30 20 6f 72 20  her pColl!=0 or 
14720 74 68 65 72 65 20 77 61 73 20 61 6e 20 4f 4f 4d  there was an OOM
14730 20 66 61 69 6c 75 72 65 2e 20 20 42 75 74 20 69   failure.  But i
14740 66 20 61 6e 20 4f 4f 4d 0a 20 20 20 20 20 20 2a  f an OOM.      *
14750 2a 20 66 61 69 6c 75 72 65 20 77 65 20 68 61 76  * failure we hav
14760 65 20 71 75 69 74 20 62 65 66 6f 72 65 20 72 65  e quit before re
14770 61 63 68 69 6e 67 20 74 68 69 73 20 70 6f 69 6e  aching this poin
14780 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  t. */.      if( 
14790 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 29 7b  ALWAYS(pColl) ){
147a0 0a 20 20 20 20 20 20 20 20 6e 45 78 74 72 61 20  .        nExtra 
147b0 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33 53  += (1 + sqlite3S
147c0 74 72 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e 7a  trlen30(pColl->z
147d0 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Name));.      }.
147e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
147f0 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  ** Allocate t
14800 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  he index structu
14810 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d  re. .  */.  nNam
14820 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
14830 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 43  n30(zName);.  nC
14840 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ol = pList->nExp
14850 72 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  r;.  pIndex = sq
14860 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
14870 6f 28 64 62 2c 20 0a 20 20 20 20 20 20 73 69 7a  o(db, .      siz
14880 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 20 20 20  eof(Index) +    
14890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
148a0 65 78 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f  ex structure  */
148b0 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e  .      sizeof(in
148c0 74 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20  t)*nCol +       
148d0 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43      /* Index.aiC
148e0 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20  olumn   */.     
148f0 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 43   sizeof(int)*(nC
14900 6f 6c 2b 31 29 20 2b 20 20 20 20 20 20 20 2f 2a  ol+1) +       /*
14910 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 20   Index.aiRowEst 
14920 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f    */.      sizeo
14930 66 28 63 68 61 72 20 2a 29 2a 6e 43 6f 6c 20 2b  f(char *)*nCol +
14940 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
14950 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20  .azColl     */. 
14960 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29 2a       sizeof(u8)*
14970 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20  nCol +          
14980 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74    /* Index.aSort
14990 4f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 6e  Order */.      n
149a0 4e 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20  Name + 1 +      
149b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
149c0 6e 64 65 78 2e 7a 4e 61 6d 65 20 20 20 20 20 20  ndex.zName      
149d0 2a 2f 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20  */.      nExtra 
149e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149f0 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
14a00 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
14a10 73 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20  s */.  );.  if( 
14a20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
14a30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
14a40 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
14a50 20 20 7d 0a 20 20 70 49 6e 64 65 78 2d 3e 61 7a    }.  pIndex->az
14a60 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29 28  Coll = (char**)(
14a70 26 70 49 6e 64 65 78 5b 31 5d 29 3b 0a 20 20 70  &pIndex[1]);.  p
14a80 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20  Index->aiColumn 
14a90 3d 20 28 69 6e 74 20 2a 29 28 26 70 49 6e 64 65  = (int *)(&pInde
14aa0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29  x->azColl[nCol])
14ab0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f  ;.  pIndex->aiRo
14ac0 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  wEst = (unsigned
14ad0 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 69 43   *)(&pIndex->aiC
14ae0 6f 6c 75 6d 6e 5b 6e 43 6f 6c 5d 29 3b 0a 20 20  olumn[nCol]);.  
14af0 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
14b00 65 72 20 3d 20 28 75 38 20 2a 29 28 26 70 49 6e  er = (u8 *)(&pIn
14b10 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 5b 6e 43  dex->aiRowEst[nC
14b20 6f 6c 2b 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78  ol+1]);.  pIndex
14b30 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 20  ->zName = (char 
14b40 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 53 6f 72  *)(&pIndex->aSor
14b50 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 29 3b 0a 20  tOrder[nCol]);. 
14b60 20 7a 45 78 74 72 61 20 3d 20 28 63 68 61 72 20   zExtra = (char 
14b70 2a 29 28 26 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  *)(&pIndex->zNam
14b80 65 5b 6e 4e 61 6d 65 2b 31 5d 29 3b 0a 20 20 6d  e[nName+1]);.  m
14b90 65 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e  emcpy(pIndex->zN
14ba0 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  ame, zName, nNam
14bb0 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  e+1);.  pIndex->
14bc0 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20  pTable = pTab;. 
14bd0 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
14be0 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
14bf0 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  .  pIndex->onErr
14c00 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72  or = (u8)onError
14c10 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f  ;.  pIndex->auto
14c20 49 6e 64 65 78 20 3d 20 28 75 38 29 28 70 4e 61  Index = (u8)(pNa
14c30 6d 65 3d 3d 30 29 3b 0a 20 20 70 49 6e 64 65 78  me==0);.  pIndex
14c40 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e  ->pSchema = db->
14c50 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
14c60 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
14c70 20 73 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c   see if we shoul
14c80 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71  d honor DESC req
14c90 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63  uests on index c
14ca0 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66  olumns.  */.  if
14cb0 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
14cc0 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29  file_format>=4 )
14cd0 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d  {.    sortOrderM
14ce0 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48  ask = -1;   /* H
14cf0 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d  onor DESC */.  }
14d00 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72  else{.    sortOr
14d10 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  derMask = 0;    
14d20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a  /* Ignore DESC *
14d30 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e  /.  }..  /* Scan
14d40 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   the names of th
14d50 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
14d60 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
14d70 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f  exed and.  ** lo
14d80 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  ad the column in
14d90 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49  dices into the I
14da0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
14db0 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
14dc0 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c  .  ** if any col
14dd0 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  umn is not found
14de0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f  ..  **.  ** TODO
14df0 3a 20 20 41 64 64 20 61 20 74 65 73 74 20 74 6f  :  Add a test to
14e00 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
14e10 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20  the same column 
14e20 69 73 20 6e 6f 74 20 6e 61 6d 65 64 0a 20 20 2a  is not named.  *
14e30 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  * more than once
14e40 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65   within the same
14e50 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68   index.  Only th
14e60 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65  e first instance
14e70 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6c   of.  ** the col
14e80 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72 20 62 65  umn will ever be
14e90 20 75 73 65 64 20 62 79 20 74 68 65 20 6f 70 74   used by the opt
14ea0 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65 20 74 68  imizer.  Note th
14eb0 61 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  at using the.  *
14ec0 2a 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 6d 6f  * same column mo
14ed0 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 63 61 6e  re than once can
14ee0 6e 6f 74 20 62 65 20 61 6e 20 65 72 72 6f 72 20  not be an error 
14ef0 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75  because that wou
14f00 6c 64 20 0a 20 20 2a 2a 20 62 72 65 61 6b 20 62  ld .  ** break b
14f10 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
14f20 62 69 6c 69 74 79 20 2d 20 69 74 20 6e 65 65 64  bility - it need
14f30 73 20 74 6f 20 62 65 20 61 20 77 61 72 6e 69 6e  s to be a warnin
14f40 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  g..  */.  for(i=
14f50 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69  0, pListItem=pLi
14f60 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e  st->a; i<pList->
14f70 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73  nExpr; i++, pLis
14f80 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63 6f  tItem++){.    co
14f90 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e 61  nst char *zColNa
14fa0 6d 65 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e  me = pListItem->
14fb0 7a 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 75 6d  zName;.    Colum
14fc0 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 20 20  n *pTabCol;.    
14fd0 69 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f 72  int requestedSor
14fe0 74 4f 72 64 65 72 3b 0a 20 20 20 20 63 68 61 72  tOrder;.    char
14ff0 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *zColl;        
15000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
15010 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
15020 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 66 6f   name */..    fo
15030 72 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70  r(j=0, pTabCol=p
15040 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61  Tab->aCol; j<pTa
15050 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54  b->nCol; j++, pT
15060 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20  abCol++){.      
15070 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
15080 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61  mp(zColName, pTa
15090 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20  bCol->zName)==0 
150a0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
150b0 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e     if( j>=pTab->
150c0 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  nCol ){.      sq
150d0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
150e0 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
150f0 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61  has no column na
15100 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20  med %s",.       
15110 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43   pTab->zName, zC
15120 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67  olName);.      g
15130 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
15140 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
15150 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
15160 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 2f 2a  n[i] = j;.    /*
15170 20 4a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 6f   Justification o
15180 66 20 74 68 65 20 41 4c 57 41 59 53 28 70 4c 69  f the ALWAYS(pLi
15190 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70  stItem->pExpr->p
151a0 43 6f 6c 6c 29 3a 20 20 42 65 63 61 75 73 65 20  Coll):  Because 
151b0 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 77 61  of.    ** the wa
151c0 79 20 74 68 65 20 22 69 64 78 6c 69 73 74 22 20  y the "idxlist" 
151d0 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 69 73 20  non-terminal is 
151e0 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74  constructed by t
151f0 68 65 20 70 61 72 73 65 72 2c 0a 20 20 20 20 2a  he parser,.    *
15200 2a 20 69 66 20 70 4c 69 73 74 49 74 65 6d 2d 3e  * if pListItem->
15210 70 45 78 70 72 20 69 73 20 6e 6f 74 20 6e 75 6c  pExpr is not nul
15220 6c 20 74 68 65 6e 20 65 69 74 68 65 72 20 70 4c  l then either pL
15230 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
15240 70 43 6f 6c 6c 0a 20 20 20 20 2a 2a 20 6d 75 73  pColl.    ** mus
15250 74 20 65 78 69 73 74 20 6f 72 20 65 6c 73 65 20  t exist or else 
15260 74 68 65 72 65 20 6d 75 73 74 20 68 61 76 65 20  there must have 
15270 62 65 65 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  been an OOM erro
15280 72 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65  r.  But if there
15290 0a 20 20 20 20 2a 2a 20 77 61 73 20 61 6e 20 4f  .    ** was an O
152a0 4f 4d 20 65 72 72 6f 72 2c 20 77 65 20 77 6f 75  OM error, we wou
152b0 6c 64 20 6e 65 76 65 72 20 72 65 61 63 68 20 74  ld never reach t
152c0 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20  his point. */.  
152d0 20 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d    if( pListItem-
152e0 3e 70 45 78 70 72 20 26 26 20 41 4c 57 41 59 53  >pExpr && ALWAYS
152f0 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70  (pListItem->pExp
15300 72 2d 3e 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  r->pColl) ){.   
15310 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20     int nColl;.  
15320 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73      zColl = pLis
15330 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43  tItem->pExpr->pC
15340 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  oll->zName;.    
15350 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    nColl = sqlite
15360 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29  3Strlen30(zColl)
15370 20 2b 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   + 1;.      asse
15380 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c  rt( nExtra>=nCol
15390 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  l );.      memcp
153a0 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c  y(zExtra, zColl,
153b0 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a   nColl);.      z
153c0 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20  Coll = zExtra;. 
153d0 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e       zExtra += n
153e0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74  Coll;.      nExt
153f0 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20  ra -= nColl;.   
15400 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43   }else{.      zC
15410 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  oll = pTab->aCol
15420 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].zColl;.     
15430 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 7b 0a 20   if( !zColl ){. 
15440 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 64         zColl = d
15450 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 2d 3e 7a 4e  b->pDfltColl->zN
15460 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
15470 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e   }.    if( !db->
15480 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73 71  init.busy && !sq
15490 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
154a0 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  eq(pParse, zColl
154b0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
154c0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
154d0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  x;.    }.    pIn
154e0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d  dex->azColl[i] =
154f0 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75   zColl;.    requ
15500 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d  estedSortOrder =
15510 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74   pListItem->sort
15520 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72 64 65  Order & sortOrde
15530 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65  rMask;.    pInde
15540 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
15550 20 3d 20 28 75 38 29 72 65 71 75 65 73 74 65 64   = (u8)requested
15560 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 20  SortOrder;.  }. 
15570 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52   sqlite3DefaultR
15580 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 0a  owEst(pIndex);..
15590 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72    if( pTab==pPar
155a0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b  se->pNewTable ){
155b0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  .    /* This rou
155c0 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61  tine has been ca
155d0 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
155e0 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
155f0 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65  x as a.    ** re
15600 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52  sult of a PRIMAR
15610 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
15620 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75  clause on a colu
15630 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f  mn definition, o
15640 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41  r.    ** a PRIMA
15650 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
15660 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e   clause followin
15670 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66  g the column def
15680 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  initions..    **
15690 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20   i.e. one of:.  
156a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41    **.    ** CREA
156b0 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52 49  TE TABLE t(x PRI
156c0 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20  MARY KEY, y);.  
156d0 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
156e0 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45  E t(x, y, UNIQUE
156f0 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a  (x, y));.    **.
15700 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61      ** Either wa
15710 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  y, check to see 
15720 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  if the table alr
15730 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61 6e  eady has such an
15740 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a   index. If.    *
15750 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68  * so, don't both
15760 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69 73  er creating this
15770 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20   one. This only 
15780 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a  applies to.    *
15790 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
157a0 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e  created indices.
157b0 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73   Users can do as
157c0 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68 0a   they wish with.
157d0 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20      ** explicit 
157e0 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a  indices..    **.
157f0 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55      ** Two UNIQU
15800 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59  E or PRIMARY KEY
15810 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
15820 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 69   considered equi
15830 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61  valent.    ** (a
15840 6e 64 20 74 68 75 73 20 73 75 70 70 72 65 73 73  nd thus suppress
15850 69 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  ing the second o
15860 6e 65 29 20 65 76 65 6e 20 69 66 20 74 68 65 79  ne) even if they
15870 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a   have different.
15880 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65      ** sort orde
15890 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rs..    **.    *
158a0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
158b0 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69  ifferent collati
158c0 6e 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20  ng sequences or 
158d0 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  if the columns o
158e0 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e  f.    ** the con
158f0 73 74 72 61 69 6e 74 20 6f 63 63 75 72 20 69 6e  straint occur in
15900 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72   different order
15910 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73  s, then the cons
15920 74 72 61 69 6e 74 73 20 61 72 65 0a 20 20 20 20  traints are.    
15930 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69  ** considered di
15940 73 74 69 6e 63 74 20 61 6e 64 20 62 6f 74 68 20  stinct and both 
15950 72 65 73 75 6c 74 20 69 6e 20 73 65 70 61 72 61  result in separa
15960 74 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  te indices..    
15970 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
15980 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
15990 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
159a0 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
159b0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
159c0 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t k;.      asser
159d0 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  t( pIdx->onError
159e0 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20  !=OE_None );.   
159f0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
15a00 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20  >autoIndex );.  
15a10 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
15a20 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  ex->onError!=OE_
15a30 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20 69  None );..      i
15a40 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  f( pIdx->nColumn
15a50 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  !=pIndex->nColum
15a60 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
15a70 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
15a80 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b  Idx->nColumn; k+
15a90 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
15aa0 74 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20  t char *z1;.    
15ab0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
15ac0 7a 32 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z2;.        if( 
15ad0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  pIdx->aiColumn[k
15ae0 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  ]!=pIndex->aiCol
15af0 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a  umn[k] ) break;.
15b00 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 49 64          z1 = pId
15b10 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
15b20 20 20 20 20 20 20 7a 32 20 3d 20 70 49 6e 64 65        z2 = pInde
15b30 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
15b40 20 20 20 20 20 20 69 66 28 20 7a 31 21 3d 7a 32        if( z1!=z2
15b50 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
15b60 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65  mp(z1, z2) ) bre
15b70 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
15b80 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e    if( k==pIdx->n
15b90 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
15ba0 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
15bb0 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45  ror!=pIndex->onE
15bc0 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rror ){.        
15bd0 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72    /* This constr
15be0 61 69 6e 74 20 63 72 65 61 74 65 73 20 74 68 65  aint creates the
15bf0 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61   same index as a
15c00 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
15c10 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
15c20 74 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65  t specified some
15c30 77 68 65 72 65 20 69 6e 20 74 68 65 20 43 52 45  where in the CRE
15c40 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
15c50 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ent..          *
15c60 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e  * However the ON
15c70 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
15c80 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e  s are different.
15c90 20 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20   If both this . 
15ca0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
15cb0 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70  traint and the p
15cc0 72 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65  revious equivale
15cd0 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  nt constraint ha
15ce0 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20  ve explicit.    
15cf0 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46        ** ON CONF
15d00 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74 68 69  LICT clauses thi
15d10 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f  s is an error. O
15d20 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68  therwise, use th
15d30 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  e.          ** e
15d40 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
15d50 69 65 64 20 62 65 68 61 76 69 6f 75 72 20 66 6f  ied behaviour fo
15d60 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  r the index..   
15d70 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
15d80 20 20 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e      if( !(pIdx->
15d90 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
15da0 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f  ult || pIndex->o
15db0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
15dc0 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lt) ){.         
15dd0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15de0 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
15df0 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e              "con
15e00 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46  flicting ON CONF
15e10 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73 70 65  LICT clauses spe
15e20 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20  cified", 0);.   
15e30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15e40 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45     if( pIdx->onE
15e50 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
15e60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15e70 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20  pIdx->onError = 
15e80 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b  pIndex->onError;
15e90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15ea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
15eb0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
15ec0 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
15ed0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c     }.  }..  /* L
15ee0 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65  ink the new Inde
15ef0 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  x structure to i
15f00 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20  ts table and to 
15f10 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69  the other.  ** i
15f20 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
15f30 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20  e structures. . 
15f40 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
15f50 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49  it.busy ){.    I
15f60 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d  ndex *p;.    p =
15f70 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
15f80 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68  rt(&pIndex->pSch
15f90 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20  ema->idxHash, . 
15fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fb0 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d           pIndex-
15fc0 3e 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53  >zName, sqlite3S
15fd0 74 72 6c 65 6e 33 30 28 70 49 6e 64 65 78 2d 3e  trlen30(pIndex->
15fe0 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  zName),.        
15ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16000 20 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69    pIndex);.    i
16010 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73  f( p ){.      as
16020 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20  sert( p==pIndex 
16030 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75  );  /* Malloc mu
16040 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a  st have failed *
16050 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  /.      db->mall
16060 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
16070 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
16080 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
16090 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  }.    db->flags 
160a0 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
160b0 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28  Changes;.    if(
160c0 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
160d0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e        pIndex->tn
160e0 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
160f0 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d  wTnum;.    }.  }
16100 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
16110 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30  ->init.busy is 0
16120 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65   then create the
16130 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20   index on disk. 
16140 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c   This.  ** invol
16150 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65 20  ves writing the 
16160 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d  index into the m
16170 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
16180 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20  filling in the. 
16190 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74   ** index with t
161a0 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
161b0 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a   contents..  **.
161c0 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69    ** The db->ini
161d0 74 2e 62 75 73 79 20 69 73 20 30 20 77 68 65 6e  t.busy is 0 when
161e0 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74 20   the user first 
161f0 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45 20  enters a CREATE 
16200 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d  INDEX .  ** comm
16210 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62  and.  db->init.b
16220 75 73 79 20 69 73 20 31 20 77 68 65 6e 20 61 20  usy is 1 when a 
16230 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
16240 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45  ed and .  ** CRE
16250 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
16260 65 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f 75  ents are read ou
16270 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  t of the master 
16280 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20  table.  In.  ** 
16290 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 20  the latter case 
162a0 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
162b0 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b  y exists on disk
162c0 2c 20 77 68 69 63 68 20 69 73 20 77 68 79 0a 20  , which is why. 
162d0 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   ** we don't wan
162e0 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 69 74  t to recreate it
162f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
16300 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  TblName==0 it me
16310 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69  ans this index i
16320 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61  s generated as a
16330 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a   primary key.  *
16340 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  * or UNIQUE cons
16350 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41  traint of a CREA
16360 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
16370 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74  nt.  Since the t
16380 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75  able.  ** has ju
16390 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  st been created,
163a0 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   it contains no 
163b0 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64  data and the ind
163c0 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ex initializatio
163d0 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20  n.  ** step can 
163e0 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  be skipped..  */
163f0 0a 20 20 65 6c 73 65 7b 20 2f 2a 20 69 66 28 20  .  else{ /* if( 
16400 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
16410 20 29 20 2a 2f 0a 20 20 20 20 56 64 62 65 20 2a   ) */.    Vdbe *
16420 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  v;.    char *zSt
16430 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d  mt;.    int iMem
16440 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
16450 6d 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  m;..    v = sqli
16460 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
16470 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
16480 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
16490 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 0a 20 20 20  ate_index;...   
164a0 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72   /* Create the r
164b0 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20  ootpage for the 
164c0 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20  index.    */.   
164d0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
164e0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
164f0 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20  se, 1, iDb);.   
16500 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16510 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49  p2(v, OP_CreateI
16520 6e 64 65 78 2c 20 69 44 62 2c 20 69 4d 65 6d 29  ndex, iDb, iMem)
16530 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72  ;..    /* Gather
16540 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
16550 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
16560 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
16570 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65   into.    ** the
16580 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a   zStmt variable.
16590 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
165a0 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 61  Start ){.      a
165b0 73 73 65 72 74 28 20 70 45 6e 64 21 3d 30 20 29  ssert( pEnd!=0 )
165c0 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d  ;.      /* A nam
165d0 65 64 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e  ed index with an
165e0 20 65 78 70 6c 69 63 69 74 20 43 52 45 41 54 45   explicit CREATE
165f0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
16600 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   */.      zStmt 
16610 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
16620 28 64 62 2c 20 22 43 52 45 41 54 45 25 73 20 49  (db, "CREATE%s I
16630 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20  NDEX %.*s",.    
16640 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f      onError==OE_
16650 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e  None ? "" : " UN
16660 49 51 55 45 22 2c 0a 20 20 20 20 20 20 20 20 70  IQUE",.        p
16670 45 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e  End->z - pName->
16680 7a 20 2b 20 31 2c 0a 20 20 20 20 20 20 20 20 70  z + 1,.        p
16690 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65  Name->z);.    }e
166a0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
166b0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
166c0 20 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52   created by a PR
166d0 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
166e0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  QUE constraint *
166f0 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74  /.      /* zStmt
16700 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
16710 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20  f(""); */.      
16720 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  zStmt = 0;.    }
16730 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20  ..    /* Add an 
16740 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f  entry in sqlite_
16750 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20  master for this 
16760 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20  index.    */.   
16770 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
16780 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
16790 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
167a0 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27  O %Q.%s VALUES('
167b0 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64  index',%Q,%Q,#%d
167c0 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20  ,%Q);",.        
167d0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
167e0 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
167f0 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70  (iDb),.        p
16800 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  Index->zName,.  
16810 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
16820 65 2c 0a 20 20 20 20 20 20 20 20 69 4d 65 6d 2c  e,.        iMem,
16830 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20  .        zStmt. 
16840 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
16850 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d  3DbFree(db, zStm
16860 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c  t);..    /* Fill
16870 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20   the index with 
16880 64 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65  data and reparse
16890 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64   the schema. Cod
168a0 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20  e an OP_Expire. 
168b0 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64     ** to invalid
168c0 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70  ate all pre-comp
168d0 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  iled statements.
168e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
168f0 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  pTblName ){.    
16900 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
16910 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
16920 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  dex, iMem);.    
16930 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
16940 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
16950 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
16960 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
16970 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69  P_ParseSchema, i
16980 44 62 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  Db, 0, 0,.      
16990 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
169a0 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27  f(db, "name='%q'
169b0 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ", pIndex->zName
169c0 29 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  ), P4_DYNAMIC);.
169d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
169e0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 78  eAddOp1(v, OP_Ex
169f0 70 69 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  pire, 0);.    }.
16a00 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61    }..  /* When a
16a10 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74  dding an index t
16a20 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
16a30 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c  dices for a tabl
16a40 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  e, make.  ** sur
16a50 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61  e all indices la
16a60 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65  beled OE_Replace
16a70 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20   come after all 
16a80 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20  those labeled.  
16a90 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54  ** OE_Ignore.  T
16aa0 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
16ab0 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74   for the correct
16ac0 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63   constraint chec
16ad0 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e  k.  ** processin
16ae0 67 20 28 69 6e 20 73 71 6c 69 74 65 33 47 65 6e  g (in sqlite3Gen
16af0 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  erateConstraintC
16b00 68 65 63 6b 73 28 29 29 20 61 73 20 70 61 72 74  hecks()) as part
16b10 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54 45 20   of.  ** UPDATE 
16b20 61 6e 64 20 49 4e 53 45 52 54 20 73 74 61 74 65  and INSERT state
16b30 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20  ments.  .  */.  
16b40 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
16b50 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30  y || pTblName==0
16b60 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72   ){.    if( onEr
16b70 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
16b80 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d  || pTab->pIndex=
16b90 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
16ba0 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45  Tab->pIndex->onE
16bb0 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
16bc0 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
16bd0 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70  >pNext = pTab->p
16be0 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61  Index;.      pTa
16bf0 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  b->pIndex = pInd
16c00 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ex;.    }else{. 
16c10 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68       Index *pOth
16c20 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  er = pTab->pInde
16c30 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  x;.      while( 
16c40 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26  pOther->pNext &&
16c50 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e   pOther->pNext->
16c60 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
16c70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ace ){.        p
16c80 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e  Other = pOther->
16c90 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
16ca0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
16cb0 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  xt = pOther->pNe
16cc0 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72  xt;.      pOther
16cd0 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
16ce0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 74  ;.    }.    pRet
16cf0 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 70   = pIndex;.    p
16d00 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Index = 0;.  }..
16d10 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65    /* Clean up be
16d20 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a  fore exiting */.
16d30 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
16d40 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  x:.  if( pIndex 
16d50 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
16d60 72 65 65 28 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c  ree(pIndex->zCol
16d70 41 66 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Aff);.    sqlite
16d80 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 6e 64  3DbFree(db, pInd
16d90 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ex);.  }.  sqlit
16da0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
16db0 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73  (db, pList);.  s
16dc0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
16dd0 65 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65  ete(db, pTblName
16de0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
16df0 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
16e00 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
16e10 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20  ./*.** Fill the 
16e20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d  Index.aiRowEst[]
16e30 20 61 72 72 61 79 20 77 69 74 68 20 64 65 66 61   array with defa
16e40 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ult information 
16e50 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  - information.**
16e60 20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e   to be used when
16e70 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e   we have not run
16e80 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d   the ANALYZE com
16e90 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f  mand..**.** aiRo
16ea0 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f  wEst[0] is suppo
16eb0 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  se to contain th
16ec0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
16ed0 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65  ents in the inde
16ee0 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64  x..** Since we d
16ef0 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73  o not know, gues
16f00 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69  s 1 million.  ai
16f10 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20  RowEst[1] is an 
16f20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a  estimate of the.
16f30 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
16f40 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74  s in the table t
16f50 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61  hat match any pa
16f60 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f  rticular value o
16f70 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63  f the.** first c
16f80 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
16f90 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d  ex.  aiRowEst[2]
16fa0 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
16fb0 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  of the number.**
16fc0 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61   of rows that ma
16fd0 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c  tch any particul
16fe0 61 72 20 63 6f 6d 62 69 6e 69 61 74 69 6f 6e 20  ar combiniation 
16ff0 6f 66 20 74 68 65 20 66 69 72 73 74 20 32 20 63  of the first 2 c
17000 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65  olumns.** of the
17010 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20   index.  And so 
17020 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20  forth.  It must 
17030 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 63 61  always be the ca
17040 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20  se that.*.**    
17050 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b         aiRowEst[
17060 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31  N]<=aiRowEst[N-1
17070 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  ].**           a
17080 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a  iRowEst[N]>=1.**
17090 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74  .** Apart from t
170a0 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74  hat, we have lit
170b0 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73  tle to go on bes
170c0 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61  ides intuition a
170d0 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f  s to.** how aiRo
170e0 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65  wEst[] should be
170f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54   initialized.  T
17100 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72  he numbers gener
17110 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65  ated here.** are
17120 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61   based on typica
17130 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69  l values found i
17140 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73  n actual indices
17150 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
17160 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49  3DefaultRowEst(I
17170 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75  ndex *pIdx){.  u
17180 6e 73 69 67 6e 65 64 20 2a 61 20 3d 20 70 49 64  nsigned *a = pId
17190 78 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20 69  x->aiRowEst;.  i
171a0 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
171b0 61 21 3d 30 20 29 3b 0a 20 20 61 5b 30 5d 20 3d  a!=0 );.  a[0] =
171c0 20 31 30 30 30 30 30 30 3b 0a 20 20 66 6f 72 28   1000000;.  for(
171d0 69 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i=pIdx->nColumn;
171e0 20 69 3e 3d 35 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=5; i--){.   
171f0 20 61 5b 69 5d 20 3d 20 35 3b 0a 20 20 7d 0a 20   a[i] = 5;.  }. 
17200 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 29 7b 0a   while( i>=1 ){.
17210 20 20 20 20 61 5b 69 5d 20 3d 20 31 31 20 2d 20      a[i] = 11 - 
17220 69 3b 0a 20 20 20 20 69 2d 2d 3b 0a 20 20 7d 0a  i;.    i--;.  }.
17230 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
17240 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a  ror!=OE_None ){.
17250 20 20 20 20 61 5b 70 49 64 78 2d 3e 6e 43 6f 6c      a[pIdx->nCol
17260 75 6d 6e 5d 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  umn] = 1;.  }.}.
17270 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
17280 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e  ine will drop an
17290 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20   existing named 
172a0 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75  index.  This rou
172b0 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tine.** implemen
172c0 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45  ts the DROP INDE
172d0 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  X statement..*/.
172e0 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
172f0 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
17300 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e  rse, SrcList *pN
17310 61 6d 65 2c 20 69 6e 74 20 69 66 45 78 69 73 74  ame, int ifExist
17320 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  s){.  Index *pIn
17330 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  dex;.  Vdbe *v;.
17340 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
17350 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
17360 74 20 69 44 62 3b 0a 0a 20 20 61 73 73 65 72 74  t iDb;..  assert
17370 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
17380 30 20 29 3b 20 20 20 2f 2a 20 4e 65 76 65 72 20  0 );   /* Never 
17390 63 61 6c 6c 65 64 20 77 69 74 68 20 70 72 69 6f  called with prio
173a0 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66  r errors */.  if
173b0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
173c0 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  ed ){.    goto e
173d0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
173e0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e    }.  assert( pN
173f0 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
17400 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
17410 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
17420 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
17430 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
17440 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49  _index;.  }.  pI
17450 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69  ndex = sqlite3Fi
17460 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d  ndIndex(db, pNam
17470 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70  e->a[0].zName, p
17480 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
17490 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e  base);.  if( pIn
174a0 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  dex==0 ){.    if
174b0 28 20 21 69 66 45 78 69 73 74 73 20 29 7b 0a 20  ( !ifExists ){. 
174c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
174d0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
174e0 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22   such index: %S"
174f0 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , pName, 0);.   
17500 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63   }.    pParse->c
17510 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
17520 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
17530 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
17540 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f  if( pIndex->auto
17550 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c  Index ){.    sql
17560 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
17570 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f  rse, "index asso
17580 63 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51  ciated with UNIQ
17590 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50  UE ".      "or P
175a0 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
175b0 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  raint cannot be 
175c0 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20  dropped", 0);.  
175d0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
175e0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44  _index;.  }.  iD
175f0 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
17600 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  aToIndex(db, pIn
17610 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23  dex->pSchema);.#
17620 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17630 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
17640 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
17650 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
17660 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65  INDEX;.    Table
17670 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
17680 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e  >pTable;.    con
17690 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
176a0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
176b0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
176c0 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
176d0 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
176e0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
176f0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
17700 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
17710 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  b, 0, zDb) ){.  
17720 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
17730 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
17740 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
17750 4d 50 44 42 20 26 26 20 69 44 62 20 29 20 63 6f  MPDB && iDb ) co
17760 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
17770 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
17780 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
17790 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
177a0 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  de, pIndex->zNam
177b0 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
177c0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
177d0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
177e0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
177f0 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
17800 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
17810 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  ve the index and
17820 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
17830 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20   table */.  v = 
17840 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
17850 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
17860 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
17870 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
17880 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
17890 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  );.    sqlite3Ne
178a0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
178b0 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  ,.       "DELETE
178c0 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
178d0 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20  E name=%Q",.    
178e0 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
178f0 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
17900 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20  BLE(iDb),.      
17910 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20   pIndex->zName. 
17920 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71     );.    if( sq
17930 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
17940 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31  b, "sqlite_stat1
17950 22 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  ", db->aDb[iDb].
17960 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
17970 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
17980 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
17990 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
179a0 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 31 20  %Q.sqlite_stat1 
179b0 57 48 45 52 45 20 69 64 78 3d 25 51 22 2c 0a 20  WHERE idx=%Q",. 
179c0 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
179d0 44 62 5d 2e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65  Db].zName, pInde
179e0 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29  x->zName.      )
179f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
17a00 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
17a10 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
17a20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
17a30 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  e(pParse, pIndex
17a40 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
17a50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17a60 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e  Op4(v, OP_DropIn
17a70 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  dex, iDb, 0, 0, 
17a80 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
17a90 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  );.  }..exit_dro
17aa0 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74  p_index:.  sqlit
17ab0 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
17ac0 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, pName);.}../
17ad0 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69 73 20 61  *.** pArray is a
17ae0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61   pointer to an a
17af0 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e  rray of objects.
17b00 20 20 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e    Each object in
17b10 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73   the.** array is
17b20 20 73 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69   szEntry bytes i
17b30 6e 20 73 69 7a 65 2e 20 20 54 68 69 73 20 72 6f  n size.  This ro
17b40 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20  utine allocates 
17b50 61 20 6e 65 77 0a 2a 2a 20 6f 62 6a 65 63 74 20  a new.** object 
17b60 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  on the end of th
17b70 65 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 2a  e array..**.** *
17b80 70 6e 45 6e 74 72 79 20 69 73 20 74 68 65 20 6e  pnEntry is the n
17b90 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
17ba0 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73 65 2e   already in use.
17bb0 20 20 2a 70 6e 41 6c 6c 6f 63 20 69 73 0a 2a 2a    *pnAlloc is.**
17bc0 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20   the previously 
17bd0 61 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f  allocated size o
17be0 66 20 74 68 65 20 61 72 72 61 79 2e 20 20 69 6e  f the array.  in
17bf0 69 74 53 69 7a 65 20 69 73 20 74 68 65 0a 2a 2a  itSize is the.**
17c00 20 73 75 67 67 65 73 74 65 64 20 69 6e 69 74 69   suggested initi
17c10 61 6c 20 61 72 72 61 79 20 73 69 7a 65 20 61 6c  al array size al
17c20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
17c30 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  The index of the
17c40 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 72 65   new entry is re
17c50 74 75 72 6e 65 64 20 69 6e 20 2a 70 49 64 78 2e  turned in *pIdx.
17c60 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
17c70 69 6e 65 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ine returns a po
17c80 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72  inter to the arr
17c90 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20  ay of objects.  
17ca0 54 68 69 73 0a 2a 2a 20 6d 69 67 68 74 20 62 65  This.** might be
17cb0 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
17cc0 20 70 41 72 72 61 79 20 70 61 72 61 6d 65 74 65   pArray paramete
17cd0 72 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65  r or it might be
17ce0 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
17cf0 70 6f 69 6e 74 65 72 20 69 66 20 74 68 65 20 61  pointer if the a
17d00 72 72 61 79 20 77 61 73 20 72 65 73 69 7a 65 64  rray was resized
17d10 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
17d20 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
17d30 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
17d40 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
17d50 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20  on to notify of 
17d60 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20  malloc failures 
17d70 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 72 61  */.  void *pArra
17d80 79 2c 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  y,     /* Array 
17d90 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67  of objects.  Mig
17da0 68 74 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65  ht be reallocate
17db0 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74  d */.  int szEnt
17dc0 72 79 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  ry,      /* Size
17dd0 20 6f 66 20 65 61 63 68 20 6f 62 6a 65 63 74 20   of each object 
17de0 69 6e 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a  in the array */.
17df0 20 20 69 6e 74 20 69 6e 69 74 53 69 7a 65 2c 20    int initSize, 
17e00 20 20 20 20 2f 2a 20 53 75 67 67 65 73 74 65 64      /* Suggested
17e10 20 69 6e 69 74 69 61 6c 20 61 6c 6c 6f 63 61 74   initial allocat
17e20 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d 65 6e 74 73  ion, in elements
17e30 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74   */.  int *pnEnt
17e40 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ry,     /* Numbe
17e50 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75 72  r of objects cur
17e60 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f  rently in use */
17e70 0a 20 20 69 6e 74 20 2a 70 6e 41 6c 6c 6f 63 2c  .  int *pnAlloc,
17e80 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
17e90 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f  size of the allo
17ea0 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d 65  cation, in eleme
17eb0 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49  nts */.  int *pI
17ec0 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  dx         /* Wr
17ed0 69 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66  ite the index of
17ee0 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65 72 65   a new slot here
17ef0 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
17f00 3b 0a 20 20 69 66 28 20 2a 70 6e 45 6e 74 72 79  ;.  if( *pnEntry
17f10 20 3e 3d 20 2a 70 6e 41 6c 6c 6f 63 20 29 7b 0a   >= *pnAlloc ){.
17f20 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 3b 0a      void *pNew;.
17f30 20 20 20 20 69 6e 74 20 6e 65 77 53 69 7a 65 3b      int newSize;
17f40 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 28  .    newSize = (
17f50 2a 70 6e 41 6c 6c 6f 63 29 2a 32 20 2b 20 69 6e  *pnAlloc)*2 + in
17f60 69 74 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77  itSize;.    pNew
17f70 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
17f80 6c 6f 63 28 64 62 2c 20 70 41 72 72 61 79 2c 20  loc(db, pArray, 
17f90 6e 65 77 53 69 7a 65 2a 73 7a 45 6e 74 72 79 29  newSize*szEntry)
17fa0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
17fb0 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64 78  0 ){.      *pIdx
17fc0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74   = -1;.      ret
17fd0 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20 20  urn pArray;.    
17fe0 7d 0a 20 20 20 20 2a 70 6e 41 6c 6c 6f 63 20 3d  }.    *pnAlloc =
17ff0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
18000 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 2f 73  Size(db, pNew)/s
18010 7a 45 6e 74 72 79 3b 0a 20 20 20 20 70 41 72 72  zEntry;.    pArr
18020 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  ay = pNew;.  }. 
18030 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 41 72 72   z = (char*)pArr
18040 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b  ay;.  memset(&z[
18050 2a 70 6e 45 6e 74 72 79 20 2a 20 73 7a 45 6e 74  *pnEntry * szEnt
18060 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29  ry], 0, szEntry)
18070 3b 0a 20 20 2a 70 49 64 78 20 3d 20 2a 70 6e 45  ;.  *pIdx = *pnE
18080 6e 74 72 79 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74  ntry;.  ++*pnEnt
18090 72 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72  ry;.  return pAr
180a0 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  ray;.}../*.** Ap
180b0 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65  pend a new eleme
180c0 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  nt to the given 
180d0 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  IdList.  Create 
180e0 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a  a new IdList if.
180f0 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a  ** need be..**.*
18100 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69  * A new IdList i
18110 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e  s returned, or N
18120 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20  ULL if malloc() 
18130 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74  fails..*/.IdList
18140 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41   *sqlite3IdListA
18150 70 70 65 6e 64 28 73 71 6c 69 74 65 33 20 2a 64  ppend(sqlite3 *d
18160 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  b, IdList *pList
18170 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
18180 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
18190 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
181a0 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
181b0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
181c0 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20   sizeof(IdList) 
181d0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
181e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
181f0 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
18200 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69  c = 0;.  }.  pLi
18210 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41  st->a = sqlite3A
18220 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
18230 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c      db,.      pL
18240 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69  ist->a,.      si
18250 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
18260 29 2c 0a 20 20 20 20 20 20 35 2c 0a 20 20 20 20  ),.      5,.    
18270 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20    &pList->nId,. 
18280 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 41 6c       &pList->nAl
18290 6c 6f 63 2c 0a 20 20 20 20 20 20 26 69 0a 20 20  loc,.      &i.  
182a0 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a  );.  if( i<0 ){.
182b0 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
182c0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
182d0 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  t);.    return 0
182e0 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61  ;.  }.  pList->a
182f0 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [i].zName = sqli
18300 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
18310 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  (db, pToken);.  
18320 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
18330 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
18340 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64   IdList..*/.void
18350 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
18360 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
18370 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29  , IdList *pList)
18380 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
18390 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
183a0 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
183b0 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
183c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
183d0 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Free(db, pList->
183e0 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  a[i].zName);.  }
183f0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
18400 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a  (db, pList->a);.
18410 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
18420 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
18430 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18440 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f  index in pList o
18450 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  f the identifier
18460 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74   named zId.  Ret
18470 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74  urn -1.** if not
18480 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
18490 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
184a0 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  x(IdList *pList,
184b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
184c0 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
184d0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
184e0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28  eturn -1;.  for(
184f0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
18500 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
18510 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
18520 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
18530 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  e, zName)==0 ) r
18540 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
18550 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
18560 2a 2a 20 45 78 70 61 6e 64 20 74 68 65 20 73 70  ** Expand the sp
18570 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
18580 72 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  r the given SrcL
18590 69 73 74 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a  ist object by.**
185a0 20 63 72 65 61 74 69 6e 67 20 6e 45 78 74 72 61   creating nExtra
185b0 20 6e 65 77 20 73 6c 6f 74 73 20 62 65 67 69 6e   new slots begin
185c0 6e 69 6e 67 20 61 74 20 69 53 74 61 72 74 2e 20  ning at iStart. 
185d0 20 69 53 74 61 72 74 20 69 73 20 7a 65 72 6f 20   iStart is zero 
185e0 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c  based..** New sl
185f0 6f 74 73 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  ots are zeroed..
18600 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
18610 65 2c 20 73 75 70 70 6f 73 65 20 61 20 53 72 63  e, suppose a Src
18620 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 63  List initially c
18630 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e 74 72  ontains two entr
18640 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20  ies: A,B..** To 
18650 61 70 70 65 6e 64 20 33 20 6e 65 77 20 65 6e 74  append 3 new ent
18660 72 69 65 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e  ries onto the en
18670 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a  d, do this:.**.*
18680 2a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  *    sqlite3SrcL
18690 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70  istEnlarge(db, p
186a0 53 72 63 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a  Srclist, 3, 2);.
186b0 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
186c0 63 61 6c 6c 20 61 62 6f 76 65 20 69 74 20 77 6f  call above it wo
186d0 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c  uld contain:  A,
186e0 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69   B, nil, nil, ni
186f0 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 53 74  l..** If the iSt
18700 61 72 74 20 61 72 67 75 6d 65 6e 74 20 68 61 64  art argument had
18710 20 62 65 65 6e 20 31 20 69 6e 73 74 65 61 64 20   been 1 instead 
18720 6f 66 20 32 2c 20 74 68 65 6e 20 74 68 65 20 72  of 2, then the r
18730 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68  esult.** would h
18740 61 76 65 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69  ave been:  A, ni
18750 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20  l, nil, nil, B. 
18760 20 54 6f 20 70 72 65 70 65 6e 64 20 74 68 65 20   To prepend the 
18770 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68  new slots,.** th
18780 65 20 69 53 74 61 72 74 20 76 61 6c 75 65 20 77  e iStart value w
18790 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20  ould be 0.  The 
187a0 72 65 73 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c  result then woul
187b0 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69  d.** be: nil, ni
187c0 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a  l, nil, A, B..**
187d0 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
187e0 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
187f0 20 74 68 65 20 53 72 63 4c 69 73 74 20 69 73 20   the SrcList is 
18800 75 6e 63 68 61 6e 67 65 64 2e 20 20 54 68 65 0a  unchanged.  The.
18810 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ** db->mallocFai
18820 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c 20 62 65  led flag will be
18830 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a 2a 2f   set to true..*/
18840 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
18850 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
18860 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
18870 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
18880 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
18890 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20 65 72  notify of OOM er
188a0 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73  rors */.  SrcLis
188b0 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20  t *pSrc,     /* 
188c0 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f 20 62  The SrcList to b
188d0 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20  e enlarged */.  
188e0 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
188f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18900 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61 64 64  new slots to add
18910 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f   to pSrc->a[] */
18920 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20 20 20  .  int iStart   
18930 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
18940 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66  n pSrc->a[] of f
18950 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f  irst new slot */
18960 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  .){.  int i;..  
18970 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
18980 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61  ng on calling pa
18990 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73  rameters */.  as
189a0 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d 30 20  sert( iStart>=0 
189b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78  );.  assert( nEx
189c0 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  tra>=1 );.  asse
189d0 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
189e0 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c   assert( iStart<
189f0 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a  =pSrc->nSrc );..
18a00 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64    /* Allocate ad
18a10 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65 20 69  ditional space i
18a20 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 66  f needed */.  if
18a30 28 20 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78  ( pSrc->nSrc+nEx
18a40 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63  tra>pSrc->nAlloc
18a50 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
18a60 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e  *pNew;.    int n
18a70 41 6c 6c 6f 63 20 3d 20 70 53 72 63 2d 3e 6e 53  Alloc = pSrc->nS
18a80 72 63 2b 6e 45 78 74 72 61 3b 0a 20 20 20 20 69  rc+nExtra;.    i
18a90 6e 74 20 6e 47 6f 74 3b 0a 20 20 20 20 70 4e 65  nt nGot;.    pNe
18aa0 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
18ab0 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63 2c 0a 20  lloc(db, pSrc,. 
18ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
18ad0 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b 20 28 6e  zeof(*pSrc) + (n
18ae0 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28  Alloc-1)*sizeof(
18af0 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  pSrc->a[0]) );. 
18b00 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
18b10 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
18b20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18b30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
18b40 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20   pSrc;.    }.   
18b50 20 70 53 72 63 20 3d 20 70 4e 65 77 3b 0a 20 20   pSrc = pNew;.  
18b60 20 20 6e 47 6f 74 20 3d 20 28 73 71 6c 69 74 65    nGot = (sqlite
18b70 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62  3DbMallocSize(db
18b80 2c 20 70 4e 65 77 29 20 2d 20 73 69 7a 65 6f 66  , pNew) - sizeof
18b90 28 2a 70 53 72 63 29 29 2f 73 69 7a 65 6f 66 28  (*pSrc))/sizeof(
18ba0 70 53 72 63 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20  pSrc->a[0])+1;. 
18bb0 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20     pSrc->nAlloc 
18bc0 3d 20 28 75 31 36 29 6e 47 6f 74 3b 0a 20 20 7d  = (u16)nGot;.  }
18bd0 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73  ..  /* Move exis
18be0 74 69 6e 67 20 73 6c 6f 74 73 20 74 68 61 74 20  ting slots that 
18bf0 63 6f 6d 65 20 61 66 74 65 72 20 74 68 65 20 6e  come after the n
18c00 65 77 6c 79 20 69 6e 73 65 72 74 65 64 20 73 6c  ewly inserted sl
18c10 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20  ots.  ** out of 
18c20 74 68 65 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72  the way */.  for
18c30 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b  (i=pSrc->nSrc-1;
18c40 20 69 3e 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29   i>=iStart; i--)
18c50 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b  {.    pSrc->a[i+
18c60 6e 45 78 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e  nExtra] = pSrc->
18c70 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63  a[i];.  }.  pSrc
18c80 2d 3e 6e 53 72 63 20 2b 3d 20 28 69 31 36 29 6e  ->nSrc += (i16)n
18c90 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72  Extra;..  /* Zer
18ca0 6f 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f  o the newly allo
18cb0 63 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20  cated slots */. 
18cc0 20 6d 65 6d 73 65 74 28 26 70 53 72 63 2d 3e 61   memset(&pSrc->a
18cd0 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  [iStart], 0, siz
18ce0 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a  eof(pSrc->a[0])*
18cf0 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f 72 28 69  nExtra);.  for(i
18d00 3d 69 53 74 61 72 74 3b 20 69 3c 69 53 74 61 72  =iStart; i<iStar
18d10 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a  t+nExtra; i++){.
18d20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69      pSrc->a[i].i
18d30 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d  Cursor = -1;.  }
18d40 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20  ..  /* Return a 
18d50 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65  pointer to the e
18d60 6e 6c 61 72 67 65 64 20 53 72 63 4c 69 73 74 20  nlarged SrcList 
18d70 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63  */.  return pSrc
18d80 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  ;.}.../*.** Appe
18d90 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e  nd a new table n
18da0 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ame to the given
18db0 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74   SrcList.  Creat
18dc0 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  e a new SrcList 
18dd0 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20  if.** need be.  
18de0 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63  A new entry is c
18df0 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72  reated in the Sr
18e00 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54  cList even if pT
18e10 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  able is NULL..**
18e20 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74 20 69 73  .** A SrcList is
18e30 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
18e40 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 61  LL if there is a
18e50 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68  n OOM error.  Th
18e60 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72  e returned.** Sr
18e70 63 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 74  cList might be t
18e80 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 53  he same as the S
18e90 72 63 4c 69 73 74 20 74 68 61 74 20 77 61 73 20  rcList that was 
18ea0 69 6e 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68  input or it migh
18eb0 74 20 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e  t be.** a new on
18ec0 65 2e 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  e.  If an OOM er
18ed0 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c  ror does occurs,
18ee0 20 74 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20   then the prior 
18ef0 76 61 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a  value of pList.*
18f00 2a 20 74 68 61 74 20 69 73 20 69 6e 70 75 74 20  * that is input 
18f10 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
18f20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
18f30 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
18f40 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f   pDatabase is no
18f50 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73  t null, it means
18f60 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
18f70 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a  has an optional.
18f80 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ** database name
18f90 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74   prefix.  Like t
18fa0 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e  his:  "database.
18fb0 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61  table".  The pDa
18fc0 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73  tabase.** points
18fd0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61   to the table na
18fe0 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c  me and the pTabl
18ff0 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  e points to the 
19000 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
19010 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b  * The SrcList.a[
19020 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73  ].zName field is
19030 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
19040 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63   table name whic
19050 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20  h might.** come 
19060 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20  from pTable (if 
19070 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
19080 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61  L) or from pData
19090 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69  base.  .** SrcLi
190a0 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65  st.a[].zDatabase
190b0 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
190c0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
190d0 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a  e from pTable,.*
190e0 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69  * or with NULL i
190f0 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73  f no database is
19100 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
19110 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
19120 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74  , if call like t
19130 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
19140 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
19150 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29  tAppend(D,A,B,0)
19160 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69  ;.**.** Then B i
19170 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  s a table name a
19180 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
19190 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66  name is unspecif
191a0 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a  ied.  If called.
191b0 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ** like this:.**
191c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
191d0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
191e0 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a  (D,A,B,C);.**.**
191f0 20 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74   Then C is the t
19200 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20  able name and B 
19210 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
19220 6e 61 6d 65 2e 20 20 49 66 20 43 20 69 73 20 64  name.  If C is d
19230 65 66 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73  efined.** then s
19240 6f 20 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 65  o is B.  In othe
19250 72 20 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 65  r words, we neve
19260 72 20 68 61 76 65 20 61 20 63 61 73 65 20 77 68  r have a case wh
19270 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ere:.**.**      
19280 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
19290 74 41 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29  tAppend(D,A,0,C)
192a0 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61  ;.**.** Both pTa
192b0 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73  ble and pDatabas
192c0 65 20 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f  e are assumed to
192d0 20 62 65 20 71 75 6f 74 65 64 2e 20 20 54 68 65   be quoted.  The
192e0 79 20 61 72 65 20 64 65 71 75 6f 74 65 64 0a 2a  y are dequoted.*
192f0 2a 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61  * before being a
19300 64 64 65 64 20 74 6f 20 74 68 65 20 53 72 63 4c  dded to the SrcL
19310 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  ist..*/.SrcList 
19320 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41  *sqlite3SrcListA
19330 70 70 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33  ppend(.  sqlite3
19340 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
19350 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f  Connection to no
19360 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66  tify of malloc f
19370 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63  ailures */.  Src
19380 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
19390 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68   /* Append to th
193a0 69 73 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c  is SrcList. NULL
193b0 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 53   creates a new S
193c0 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65  rcList */.  Toke
193d0 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20  n *pTable,      
193e0 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65  /* Table to appe
193f0 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nd */.  Token *p
19400 44 61 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44  Database    /* D
19410 61 74 61 62 61 73 65 20 6f 66 20 74 68 65 20 74  atabase of the t
19420 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  able */.){.  str
19430 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
19440 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72   *pItem;.  asser
19450 74 28 20 70 44 61 74 61 62 61 73 65 3d 3d 30 20  t( pDatabase==0 
19460 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 20  || pTable!=0 ); 
19470 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 76 65 20   /* Cannot have 
19480 43 20 77 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20  C without B */. 
19490 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
194a0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
194b0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
194c0 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 72 63 4c  (db, sizeof(SrcL
194d0 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
194e0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
194f0 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  n 0;.    pList->
19500 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a  nAlloc = 1;.  }.
19510 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
19520 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
19530 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c  db, pList, 1, pL
19540 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 69 66  ist->nSrc);.  if
19550 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
19560 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
19570 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
19580 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72  b, pList);.    r
19590 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
195a0 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
195b0 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 3b  [pList->nSrc-1];
195c0 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
195d0 20 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a   && pDatabase->z
195e0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61  ==0 ){.    pData
195f0 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  base = 0;.  }.  
19600 69 66 28 20 70 44 61 74 61 62 61 73 65 20 29 7b  if( pDatabase ){
19610 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d  .    Token *pTem
19620 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20  p = pDatabase;. 
19630 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 70     pDatabase = p
19640 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c  Table;.    pTabl
19650 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20  e = pTemp;.  }. 
19660 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
19670 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
19680 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29  oken(db, pTable)
19690 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  ;.  pItem->zData
196a0 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  base = sqlite3Na
196b0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
196c0 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 72 65  pDatabase);.  re
196d0 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
196e0 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56 64 62 65  *.** Assign Vdbe
196f0 43 75 72 73 6f 72 20 69 6e 64 65 78 20 6e 75 6d  Cursor index num
19700 62 65 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c  bers to all tabl
19710 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a  es in a SrcList.
19720 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
19730 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
19740 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ors(Parse *pPars
19750 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  e, SrcList *pLis
19760 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
19770 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
19780 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73  em *pItem;.  ass
19790 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 70 50 61  ert(pList || pPa
197a0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
197b0 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
197c0 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
197d0 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  i=0, pItem=pList
197e0 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  ->a; i<pList->nS
197f0 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
19800 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
19810 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29  em->iCursor>=0 )
19820 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 49   break;.      pI
19830 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
19840 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
19850 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
19860 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
19870 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
19880 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
19890 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53  Parse, pItem->pS
198a0 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20  elect->pSrc);.  
198b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
198c0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
198d0 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73  an entire SrcLis
198e0 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20  t including all 
198f0 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65  its substructure
19900 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
19910 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 73  3SrcListDelete(s
19920 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c  qlite3 *db, SrcL
19930 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
19940 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53  nt i;.  struct S
19950 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
19960 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
19970 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
19980 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
19990 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
199a0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
199b0 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m++){.    sqlite
199c0 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
199d0 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
199e0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
199f0 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  (db, pItem->zNam
19a00 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
19a10 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
19a20 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 73 71  >zAlias);.    sq
19a30 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
19a40 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a  pItem->zIndex);.
19a50 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
19a60 65 54 61 62 6c 65 28 70 49 74 65 6d 2d 3e 70 54  eTable(pItem->pT
19a70 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ab);.    sqlite3
19a80 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
19a90 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29   pItem->pSelect)
19aa0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
19ab0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  rDelete(db, pIte
19ac0 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c  m->pOn);.    sql
19ad0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
19ae0 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69  (db, pItem->pUsi
19af0 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ng);.  }.  sqlit
19b00 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69  e3DbFree(db, pLi
19b10 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  st);.}../*.** Th
19b20 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
19b30 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
19b40 65 72 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20  er to add a new 
19b50 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65  term to the.** e
19b60 6e 64 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20  nd of a growing 
19b70 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68  FROM clause.  Th
19b80 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20  e "p" parameter 
19b90 69 73 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a  is the part of.*
19ba0 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
19bb0 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61  e that has alrea
19bc0 64 79 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63  dy been construc
19bd0 74 65 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c  ted.  "p" is NUL
19be0 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20  L.** if this is 
19bf0 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f  the first term o
19c00 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
19c10 65 2e 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70  e.  pTable and p
19c20 44 61 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20  Database.** are 
19c30 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
19c40 74 61 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61  table and databa
19c50 73 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20  se named in the 
19c60 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
19c70 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69  ..** pDatabase i
19c80 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61  s NULL if the da
19c90 74 61 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c  tabase name qual
19ca0 69 66 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67  ifier is missing
19cb0 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20   - the.** usual 
19cc0 63 61 73 65 2e 20 20 49 66 20 74 68 65 20 74 65  case.  If the te
19cd0 72 6d 20 68 61 73 20 61 20 61 6c 69 61 73 2c 20  rm has a alias, 
19ce0 74 68 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e  then pAlias poin
19cf0 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69  ts to the.** ali
19d00 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68  as token.  If th
19d10 65 20 74 65 72 6d 20 69 73 20 61 20 73 75 62 71  e term is a subq
19d20 75 65 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71  uery, then pSubq
19d30 75 65 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53  uery is the.** S
19d40 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
19d50 74 68 61 74 20 74 68 65 20 73 75 62 71 75 65 72  that the subquer
19d60 79 20 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20  y encodes.  The 
19d70 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44  pTable and.** pD
19d80 61 74 61 62 61 73 65 20 70 61 72 61 6d 65 74 65  atabase paramete
19d90 72 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20  rs are NULL for 
19da0 73 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65  subqueries.  The
19db0 20 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a   pOn and pUsing.
19dc0 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  ** parameters ar
19dd0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
19de0 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
19df0 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  G clauses..**.**
19e00 20 52 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72   Return a new Sr
19e10 63 4c 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f  cList which enco
19e20 64 65 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20  des is the FROM 
19e30 77 69 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20  with the new.** 
19e40 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53  term added..*/.S
19e50 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
19e60 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d  rcListAppendFrom
19e70 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Term(.  Parse *p
19e80 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
19e90 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
19ea0 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
19eb0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
19ec0 2f 2a 20 54 68 65 20 6c 65 66 74 20 70 61 72 74  /* The left part
19ed0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
19ee0 75 73 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e  use already seen
19ef0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
19f00 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
19f10 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
19f20 6c 65 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65  le to add to the
19f30 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
19f40 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61    Token *pDataba
19f50 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  se,       /* Nam
19f60 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
19f70 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61  e containing pTa
19f80 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ble */.  Token *
19f90 70 41 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20  pAlias,         
19fa0 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61   /* The right-ha
19fb0 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 41  nd side of the A
19fc0 53 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  S subexpression 
19fd0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  */.  Select *pSu
19fe0 62 71 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20  bquery,      /* 
19ff0 41 20 73 75 62 71 75 65 72 79 20 75 73 65 64 20  A subquery used 
1a000 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61  in place of a ta
1a010 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78  ble name */.  Ex
1a020 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20  pr *pOn,        
1a030 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20        /* The ON 
1a040 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e  clause of a join
1a050 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55   */.  IdList *pU
1a060 73 69 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a  sing          /*
1a070 20 54 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   The USING claus
1a080 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29  e of a join */.)
1a090 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  {.  struct SrcLi
1a0a0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1a0b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1a0c0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
1a0d0 28 20 21 70 20 26 26 20 28 70 4f 6e 20 7c 7c 20  ( !p && (pOn || 
1a0e0 70 55 73 69 6e 67 29 20 29 7b 0a 20 20 20 20 73  pUsing) ){.    s
1a0f0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1a100 50 61 72 73 65 2c 20 22 61 20 4a 4f 49 4e 20 63  Parse, "a JOIN c
1a110 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65  lause is require
1a120 64 20 62 65 66 6f 72 65 20 25 73 22 2c 20 0a 20  d before %s", . 
1a130 20 20 20 20 20 28 70 4f 6e 20 3f 20 22 4f 4e 22       (pOn ? "ON"
1a140 20 3a 20 22 55 53 49 4e 47 22 29 0a 20 20 20 20   : "USING").    
1a150 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65  );.    goto appe
1a160 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20  nd_from_error;. 
1a170 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33   }.  p = sqlite3
1a180 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62  SrcListAppend(db
1a190 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61  , p, pTable, pDa
1a1a0 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
1a1b0 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e  ==0 || NEVER(p->
1a1c0 6e 53 72 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nSrc==0) ){.    
1a1d0 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d  goto append_from
1a1e0 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 49  _error;.  }.  pI
1a1f0 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  tem = &p->a[p->n
1a200 53 72 63 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74  Src-1];.  assert
1a210 28 20 70 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20  ( pAlias!=0 );. 
1a220 20 69 66 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29   if( pAlias->n )
1a230 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c  {.    pItem->zAl
1a240 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ias = sqlite3Nam
1a250 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
1a260 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49  Alias);.  }.  pI
1a270 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70  tem->pSelect = p
1a280 53 75 62 71 75 65 72 79 3b 0a 20 20 70 49 74 65  Subquery;.  pIte
1a290 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20  m->pOn = pOn;.  
1a2a0 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20  pItem->pUsing = 
1a2b0 70 55 73 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e  pUsing;.  return
1a2c0 20 70 3b 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f   p;.. append_fro
1a2d0 6d 5f 65 72 72 6f 72 3a 0a 20 20 61 73 73 65 72  m_error:.  asser
1a2e0 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  t( p==0 );.  sql
1a2f0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1a300 62 2c 20 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74  b, pOn);.  sqlit
1a310 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
1a320 62 2c 20 70 55 73 69 6e 67 29 3b 0a 20 20 73 71  b, pUsing);.  sq
1a330 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
1a340 65 28 64 62 2c 20 70 53 75 62 71 75 65 72 79 29  e(db, pSubquery)
1a350 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1a360 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e  ./*.** Add an IN
1a370 44 45 58 45 44 20 42 59 20 6f 72 20 4e 4f 54 20  DEXED BY or NOT 
1a380 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 74  INDEXED clause t
1a390 6f 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  o the most recen
1a3a0 74 6c 79 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c  tly added .** el
1a3b0 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 73 6f 75  ement of the sou
1a3c0 72 63 65 2d 6c 69 73 74 20 70 61 73 73 65 64 20  rce-list passed 
1a3d0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
1a3e0 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  gument..*/.void 
1a3f0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e  sqlite3SrcListIn
1a400 64 65 78 65 64 42 79 28 50 61 72 73 65 20 2a 70  dexedBy(Parse *p
1a410 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
1a420 70 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78  p, Token *pIndex
1a430 65 64 42 79 29 7b 0a 20 20 61 73 73 65 72 74 28  edBy){.  assert(
1a440 20 70 49 6e 64 65 78 65 64 42 79 21 3d 30 20 29   pIndexedBy!=0 )
1a450 3b 0a 20 20 69 66 28 20 70 20 26 26 20 41 4c 57  ;.  if( p && ALW
1a460 41 59 53 28 70 2d 3e 6e 53 72 63 3e 30 29 20 29  AYS(p->nSrc>0) )
1a470 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
1a480 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1a490 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63   = &p->a[p->nSrc
1a4a0 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
1a4b0 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78   pItem->notIndex
1a4c0 65 64 3d 3d 30 20 26 26 20 70 49 74 65 6d 2d 3e  ed==0 && pItem->
1a4d0 7a 49 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20  zIndex==0 );.   
1a4e0 20 69 66 28 20 70 49 6e 64 65 78 65 64 42 79 2d   if( pIndexedBy-
1a4f0 3e 6e 3d 3d 31 20 26 26 20 21 70 49 6e 64 65 78  >n==1 && !pIndex
1a500 65 64 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20 20  edBy->z ){.     
1a510 20 2f 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45 58   /* A "NOT INDEX
1a520 45 44 22 20 63 6c 61 75 73 65 20 77 61 73 20 73  ED" clause was s
1a530 75 70 70 6c 69 65 64 2e 20 53 65 65 20 70 61 72  upplied. See par
1a540 73 65 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20 63  se.y .      ** c
1a550 6f 6e 73 74 72 75 63 74 20 22 69 6e 64 65 78 65  onstruct "indexe
1a560 64 5f 6f 70 74 22 20 66 6f 72 20 64 65 74 61 69  d_opt" for detai
1a570 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 74  ls. */.      pIt
1a580 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d  em->notIndexed =
1a590 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
1a5a0 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 49 6e 64       pItem->zInd
1a5b0 65 78 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ex = sqlite3Name
1a5c0 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
1a5d0 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79  ->db, pIndexedBy
1a5e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
1a5f0 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64  /*.** When build
1a600 69 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c  ing up a FROM cl
1a610 61 75 73 65 20 69 6e 20 74 68 65 20 70 61 72 73  ause in the pars
1a620 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65  er, the join ope
1a630 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74  rator.** is init
1a640 69 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74  ially attached t
1a650 6f 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61  o the left opera
1a660 6e 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64  nd.  But the cod
1a670 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65  e generator.** e
1a680 78 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20  xpects the join 
1a690 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f  operator to be o
1a6a0 6e 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  n the right oper
1a6b0 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  and.  This routi
1a6c0 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c  ne.** Shifts all
1a6d0 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20   join operators 
1a6e0 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
1a6f0 68 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65  ht for an entire
1a700 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e   FROM.** clause.
1a710 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20  .**.** Example: 
1a720 53 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e  Suppose the join
1a730 20 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a   is like this:.*
1a740 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41  *.**           A
1a750 20 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a   natural cross j
1a760 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oin B.**.** The 
1a770 6f 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74  operator is "nat
1a780 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22  ural cross join"
1a790 2e 20 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f  .  The A and B o
1a7a0 70 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72  perands are stor
1a7b0 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d  ed.** in p->a[0]
1a7c0 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65   and p->a[1], re
1a7d0 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65  spectively.  The
1a7e0 20 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c   parser initiall
1a7f0 79 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20  y stores the.** 
1a800 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e  operator with A.
1a810 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
1a820 68 69 66 74 73 20 74 68 61 74 20 6f 70 65 72 61  hifts that opera
1a830 74 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a  tor over to B..*
1a840 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
1a850 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79  cListShiftJoinTy
1a860 70 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a  pe(SrcList *p){.
1a870 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 61 20    if( p && p->a 
1a880 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
1a890 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d    for(i=p->nSrc-
1a8a0 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
1a8b0 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e      p->a[i].join
1a8c0 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d  type = p->a[i-1]
1a8d0 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  .jointype;.    }
1a8e0 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 6a 6f 69  .    p->a[0].joi
1a8f0 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  ntype = 0;.  }.}
1a900 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
1a910 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
1a920 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
1a930 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
1a940 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74  e *pParse, int t
1a950 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ype){.  sqlite3 
1a960 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
1a970 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65    int i;..  asse
1a980 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
1a990 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
1a9a0 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  db;.  assert( db
1a9b0 21 3d 30 20 29 3b 0a 2f 2a 20 20 69 66 28 20 64  !=0 );./*  if( d
1a9c0 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
1a9d0 20 29 20 72 65 74 75 72 6e 3b 20 2a 2f 0a 20 20   ) return; */.  
1a9e0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1a9f0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1aa00 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
1aa10 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20   "BEGIN", 0, 0) 
1aa20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
1aa30 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
1aa40 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1aa50 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75  .  if( !v ) retu
1aa60 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d  rn;.  if( type!=
1aa70 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20  TK_DEFERRED ){. 
1aa80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
1aa90 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
1aaa0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1aab0 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73  dOp2(v, OP_Trans
1aac0 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65  action, i, (type
1aad0 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b  ==TK_EXCLUSIVE)+
1aae0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1aaf0 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
1ab00 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
1ab10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ab20 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  Op2(v, OP_AutoCo
1ab30 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  mmit, 0, 0);.}..
1ab40 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74  /*.** Commit a t
1ab50 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
1ab60 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74  id sqlite3Commit
1ab70 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
1ab80 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
1ab90 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
1aba0 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28  e *v;..  assert(
1abb0 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20   pParse!=0 );.  
1abc0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1abd0 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
1abe0 20 29 3b 0a 2f 2a 20 20 69 66 28 20 64 62 2d 3e   );./*  if( db->
1abf0 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
1ac00 72 65 74 75 72 6e 3b 20 2a 2f 0a 20 20 69 66 28  return; */.  if(
1ac10 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1ac20 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1ac30 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43  _TRANSACTION, "C
1ac40 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 7b  OMMIT", 0, 0) ){
1ac50 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1ac60 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1ac70 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1ac80 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
1ac90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1aca0 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
1acb0 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 1, 0);.  }.}..
1acc0 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
1acd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
1ace0 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
1acf0 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28  backTransaction(
1ad00 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
1ad10 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1ad20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73   Vdbe *v;..  ass
1ad30 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29  ert( pParse!=0 )
1ad40 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
1ad50 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  >db;.  assert( d
1ad60 62 21 3d 30 20 29 3b 0a 2f 2a 20 20 69 66 28 20  b!=0 );./*  if( 
1ad70 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d  db->aDb[0].pBt==
1ad80 30 20 29 20 72 65 74 75 72 6e 3b 20 2a 2f 0a 20  0 ) return; */. 
1ad90 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1ada0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1adb0 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
1adc0 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c  , "ROLLBACK", 0,
1add0 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   0) ){.    retur
1ade0 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c  n;.  }.  v = sql
1adf0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1ae00 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
1ae10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ae20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f  ddOp2(v, OP_Auto
1ae30 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20  Commit, 1, 1);. 
1ae40 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
1ae50 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1ae60 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
1ae70 72 20 77 68 65 6e 20 69 74 20 70 61 72 73 65 73  r when it parses
1ae80 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72   a command to cr
1ae90 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65  eate,.** release
1aea0 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20   or rollback an 
1aeb0 53 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a  SQL savepoint. .
1aec0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1aed0 61 76 65 70 6f 69 6e 74 28 50 61 72 73 65 20 2a  avepoint(Parse *
1aee0 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20  pParse, int op, 
1aef0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
1af00 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73   char *zName = s
1af10 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1af20 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
1af30 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
1af40 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ame ){.    Vdbe 
1af50 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
1af60 64 62 65 28 70 50 61 72 73 65 29 3b 0a 23 69 66  dbe(pParse);.#if
1af70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1af80 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
1af90 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1afa0 63 68 61 72 20 2a 61 7a 5b 5d 20 3d 20 7b 20 22  char *az[] = { "
1afb0 42 45 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45  BEGIN", "RELEASE
1afc0 22 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b  ", "ROLLBACK" };
1afd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 53 41  .    assert( !SA
1afe0 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26  VEPOINT_BEGIN &&
1aff0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
1b000 53 45 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49  SE==1 && SAVEPOI
1b010 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29  NT_ROLLBACK==2 )
1b020 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
1b030 20 21 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75   !v || sqlite3Au
1b040 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1b050 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54  SQLITE_SAVEPOINT
1b060 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c  , az[op], zName,
1b070 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c   0) ){.      sql
1b080 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
1b090 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  e->db, zName);. 
1b0a0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
1b0b0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
1b0c0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
1b0d0 61 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c  avepoint, op, 0,
1b0e0 20 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59   0, zName, P4_DY
1b0f0 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  NAMIC);.  }.}../
1b100 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
1b110 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  he TEMP database
1b120 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61   is open and ava
1b130 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20  ilable for use. 
1b140 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e   Return.** the n
1b150 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
1b160 20 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f    Leave any erro
1b170 72 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68  r messages in th
1b180 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
1b190 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  re..*/.int sqlit
1b1a0 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
1b1b0 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
1b1c0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1b1d0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1b1e0 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
1b1f0 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73  pBt==0 && !pPars
1b200 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
1b210 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 73 74    int rc;.    st
1b220 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66  atic const int f
1b230 6c 61 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20  lags = .        
1b240 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
1b250 41 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20  ADWRITE |.      
1b260 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1b270 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20  CREATE |.       
1b280 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
1b290 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20  XCLUSIVE |.     
1b2a0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1b2b0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c  _DELETEONCLOSE |
1b2c0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
1b2d0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a  E_OPEN_TEMP_DB;.
1b2e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1b2f0 33 42 74 72 65 65 46 61 63 74 6f 72 79 28 64 62  3BtreeFactory(db
1b300 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 44  , 0, 0, SQLITE_D
1b310 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
1b320 45 2c 20 66 6c 61 67 73 2c 0a 20 20 20 20 20 20  E, flags,.      
1b330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b340 20 20 20 20 20 20 20 20 20 20 20 26 64 62 2d 3e             &db->
1b350 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[1].pBt);.   
1b360 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b370 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
1b380 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1b390 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f  se, "unable to o
1b3a0 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
1b3b0 64 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20  database ".     
1b3c0 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f     "file for sto
1b3d0 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74  ring temporary t
1b3e0 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70  ables");.      p
1b3f0 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a  Parse->rc = rc;.
1b400 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1b410 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1b420 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  ( (db->flags & S
1b430 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d  QLITE_InTrans)==
1b440 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d  0 || db->autoCom
1b450 6d 69 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  mit );.    asser
1b460 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  t( db->aDb[1].pS
1b470 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c  chema );.    sql
1b480 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
1b490 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72 65  Mode(sqlite3Btre
1b4a0 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 31  ePager(db->aDb[1
1b4b0 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20  ].pBt),.        
1b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4d0 20 20 20 20 64 62 2d 3e 64 66 6c 74 4a 6f 75 72      db->dfltJour
1b4e0 6e 61 6c 4d 6f 64 65 29 3b 0a 20 20 7d 0a 20 20  nalMode);.  }.  
1b4f0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1b500 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
1b510 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
1b520 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d  verify the schem
1b530 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61  a cookie and sta
1b540 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72 61  rt.** a read-tra
1b550 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c  nsaction for all
1b560 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
1b570 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  files..**.** It 
1b580 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  is important tha
1b590 74 20 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f  t all schema coo
1b5a0 6b 69 65 73 20 62 65 20 76 65 72 69 66 69 65 64  kies be verified
1b5b0 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64   and all.** read
1b5c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 65   transactions be
1b5d0 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
1b5e0 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 68 61  anything else ha
1b5f0 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ppens in.** the 
1b600 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 42  VDBE program.  B
1b610 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ut this routine 
1b620 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 66  can be called af
1b630 74 65 72 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a  ter much other.*
1b640 2a 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20  * code has been 
1b650 67 65 6e 65 72 61 74 65 64 2e 20 20 53 6f 20 68  generated.  So h
1b660 65 72 65 20 69 73 20 77 68 61 74 20 77 65 20 64  ere is what we d
1b670 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  o:.**.** The fir
1b680 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75  st time this rou
1b690 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
1b6a0 77 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f  we code an OP_Go
1b6b0 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20  to that.** will 
1b6c0 6a 75 6d 70 20 74 6f 20 61 20 73 75 62 72 6f 75  jump to a subrou
1b6d0 74 69 6e 65 20 61 74 20 74 68 65 20 65 6e 64 20  tine at the end 
1b6e0 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20  of the program. 
1b6f0 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f   Then we.** reco
1b700 72 64 20 65 76 65 72 79 20 64 61 74 61 62 61 73  rd every databas
1b710 65 20 74 68 61 74 20 6e 65 65 64 73 20 69 74 73  e that needs its
1b720 20 73 63 68 65 6d 61 20 76 65 72 69 66 69 65 64   schema verified
1b730 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72 73   in the.** pPars
1b740 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69  e->cookieMask fi
1b750 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61 66 74  eld.  Later, aft
1b760 65 72 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64  er all other cod
1b770 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65  e has been.** ge
1b780 6e 65 72 61 74 65 64 2c 20 74 68 65 20 73 75 62  nerated, the sub
1b790 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65  routine that doe
1b7a0 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72  s the cookie ver
1b7b0 69 66 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a  ifications and.*
1b7c0 2a 20 73 74 61 72 74 73 20 74 68 65 20 74 72 61  * starts the tra
1b7d0 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62  nsactions will b
1b7e0 65 20 63 6f 64 65 64 20 61 6e 64 20 74 68 65 20  e coded and the 
1b7f0 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75 65  OP_Goto P2 value
1b800 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64 65  .** will be made
1b810 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
1b820 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54  t subroutine.  T
1b830 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66  he generation of
1b840 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76   the.** cookie v
1b850 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75 62 72  erification subr
1b860 6f 75 74 69 6e 65 20 63 6f 64 65 20 68 61 70 70  outine code happ
1b870 65 6e 73 20 69 6e 20 73 71 6c 69 74 65 33 46 69  ens in sqlite3Fi
1b880 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a  nishCoding()..**
1b890 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20 74 68 65  .** If iDb<0 the
1b8a0 6e 20 63 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f  n code the OP_Go
1b8b0 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20  to only - don't 
1b8c0 73 65 74 20 66 6c 61 67 20 74 6f 20 76 65 72 69  set flag to veri
1b8d0 66 79 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61  fy the.** schema
1b8e0 20 6f 6e 20 61 6e 79 20 64 61 74 61 62 61 73 65   on any database
1b8f0 73 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  s.  This can be 
1b900 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e  used to position
1b910 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20   the OP_Goto.** 
1b920 65 61 72 6c 79 20 69 6e 20 74 68 65 20 63 6f 64  early in the cod
1b930 65 2c 20 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f  e, before we kno
1b940 77 20 69 66 20 61 6e 79 20 64 61 74 61 62 61 73  w if any databas
1b950 65 20 74 61 62 6c 65 73 20 77 69 6c 6c 20 62 65  e tables will be
1b960 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73   used..*/.void s
1b970 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1b980 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50  Schema(Parse *pP
1b990 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
1b9a0 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
1b9b0 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
1b9c0 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
1b9d0 29 3b 0a 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  );..  if( pTople
1b9e0 76 65 6c 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d  vel->cookieGoto=
1b9f0 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =0 ){.    Vdbe *
1ba00 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1ba10 62 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20  be(pToplevel);. 
1ba20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
1ba30 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f  turn;  /* This o
1ba40 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20 74  nly happens if t
1ba50 68 65 72 65 20 77 61 73 20 61 20 70 72 69 6f 72  here was a prior
1ba60 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 70 54   error */.    pT
1ba70 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 47  oplevel->cookieG
1ba80 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oto = sqlite3Vdb
1ba90 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1baa0 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d  to, 0, 0)+1;.  }
1bab0 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b  .  if( iDb>=0 ){
1bac0 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
1bad0 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 64 62   = pToplevel->db
1bae0 3b 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b 3b 0a  ;.    int mask;.
1baf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62  .    assert( iDb
1bb00 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  <db->nDb );.    
1bb10 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
1bb20 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69  iDb].pBt!=0 || i
1bb30 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  Db==1 );.    ass
1bb40 65 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f  ert( iDb<SQLITE_
1bb50 4d 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29  MAX_ATTACHED+2 )
1bb60 3b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c  ;.    mask = 1<<
1bb70 69 44 62 3b 0a 20 20 20 20 69 66 28 20 28 70 54  iDb;.    if( (pT
1bb80 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d  oplevel->cookieM
1bb90 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
1bba0 7b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65  {.      pTopleve
1bbb0 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d  l->cookieMask |=
1bbc0 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 54 6f   mask;.      pTo
1bbd0 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 56 61  plevel->cookieVa
1bbe0 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61  lue[iDb] = db->a
1bbf0 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
1bc00 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a  >schema_cookie;.
1bc10 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
1bc20 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
1bc30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1bc40 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62  te3OpenTempDatab
1bc50 61 73 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a  ase(pToplevel);.
1bc60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1bc70 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
1bc80 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68  ate VDBE code th
1bc90 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20  at prepares for 
1bca0 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69  doing an operati
1bcb0 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74  on that.** might
1bcc0 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61   change the data
1bcd0 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  base..**.** This
1bce0 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20   routine starts 
1bcf0 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
1bd00 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20  n if we are not 
1bd10 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a  already within.*
1bd20 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  * a transaction.
1bd30 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65    If we are alre
1bd40 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61  ady within a tra
1bd50 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61  nsaction, then a
1bd60 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69   checkpoint.** i
1bd70 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74  s set if the set
1bd80 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65  Statement parame
1bd90 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20  ter is true.  A 
1bda0 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
1bdb0 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20  d.** be set for 
1bdc0 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20  operations that 
1bdd0 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20  might fail (due 
1bde0 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29  to a constraint)
1bdf0 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20   part of.** the 
1be00 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20  way through and 
1be10 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20  which will need 
1be20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69  to undo some wri
1be30 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69  tes without havi
1be40 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63  ng to.** rollbac
1be50 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e  k the whole tran
1be60 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70  saction.  For op
1be70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61  erations where a
1be80 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a  ll constraints.*
1be90 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64  * can be checked
1bea0 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e   before any chan
1beb0 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
1bec0 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74  the database, it
1bed0 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63   is never.** nec
1bee0 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61  essary to undo a
1bef0 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63   write and the c
1bf00 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
1bf10 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a   not be set..*/.
1bf20 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69  void sqlite3Begi
1bf30 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
1bf40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1bf50 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c  nt setStatement,
1bf60 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72   int iDb){.  Par
1bf70 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
1bf80 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
1bf90 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
1bfa0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
1bfb0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
1bfc0 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  iDb);.  pTopleve
1bfd0 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20  l->writeMask |= 
1bfe0 31 3c 3c 69 44 62 3b 0a 20 20 70 54 6f 70 6c 65  1<<iDb;.  pTople
1bff0 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74  vel->isMultiWrit
1c000 65 20 7c 3d 20 73 65 74 53 74 61 74 65 6d 65 6e  e |= setStatemen
1c010 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69  t;.}../*.** Indi
1c020 63 61 74 65 20 74 68 61 74 20 74 68 65 20 73 74  cate that the st
1c030 61 74 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c  atement currentl
1c040 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
1c050 74 69 6f 6e 20 6d 69 67 68 74 20 77 72 69 74 65  tion might write
1c060 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  .** more than on
1c070 65 20 65 6e 74 72 79 20 28 65 78 61 6d 70 6c 65  e entry (example
1c080 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72  : deleting one r
1c090 6f 77 20 74 68 65 6e 20 69 6e 73 65 72 74 69 6e  ow then insertin
1c0a0 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e  g another,.** in
1c0b0 73 65 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65  serting multiple
1c0c0 20 72 6f 77 73 20 69 6e 20 61 20 74 61 62 6c 65   rows in a table
1c0d0 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 61  , or inserting a
1c0e0 20 72 6f 77 20 61 6e 64 20 69 6e 64 65 78 20 65   row and index e
1c0f0 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61  ntries.).** If a
1c100 6e 20 61 62 6f 72 74 20 6f 63 63 75 72 73 20 61  n abort occurs a
1c110 66 74 65 72 20 73 6f 6d 65 20 6f 66 20 74 68 65  fter some of the
1c120 73 65 20 77 72 69 74 65 73 20 68 61 76 65 20 63  se writes have c
1c130 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e 20 69  ompleted, then i
1c140 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63  t will.** be nec
1c150 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 74  essary to undo t
1c160 68 65 20 63 6f 6d 70 6c 65 74 65 64 20 77 72 69  he completed wri
1c170 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tes..*/.void sql
1c180 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28 50  ite3MultiWrite(P
1c190 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
1c1a0 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
1c1b0 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
1c1c0 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
1c1d0 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69  ;.  pToplevel->i
1c1e0 73 4d 75 6c 74 69 57 72 69 74 65 20 3d 20 31 3b  sMultiWrite = 1;
1c1f0 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63  .}../* .** The c
1c200 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63 61  ode generator ca
1c210 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
1c220 20 69 66 20 69 73 20 64 69 73 63 6f 76 65 72 73   if is discovers
1c230 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 70   that it is.** p
1c240 6f 73 73 69 62 6c 65 20 74 6f 20 61 62 6f 72 74  ossible to abort
1c250 20 61 20 73 74 61 74 65 6d 65 6e 74 20 70 72 69   a statement pri
1c260 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  or to completion
1c270 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a  .  In order to .
1c280 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20  ** perform this 
1c290 61 62 6f 72 74 20 77 69 74 68 6f 75 74 20 63 6f  abort without co
1c2a0 72 72 75 70 74 69 6e 67 20 74 68 65 20 64 61 74  rrupting the dat
1c2b0 61 62 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74  abase, we need t
1c2c0 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74  o make.** sure t
1c2d0 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hat the statemen
1c2e0 74 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62  t is protected b
1c2f0 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  y a statement tr
1c300 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1c310 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65   Technically, we
1c320 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 65   only need to se
1c330 74 20 74 68 65 20 6d 61 79 41 62 6f 72 74 20 66  t the mayAbort f
1c340 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a 20 69 73  lag if the.** is
1c350 4d 75 6c 74 69 57 72 69 74 65 20 66 6c 61 67 20  MultiWrite flag 
1c360 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73  was previously s
1c370 65 74 2e 20 20 54 68 65 72 65 20 69 73 20 61 20  et.  There is a 
1c380 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a  time dependency.
1c390 2a 2a 20 73 75 63 68 20 74 68 61 74 20 74 68 65  ** such that the
1c3a0 20 61 62 6f 72 74 20 6d 75 73 74 20 6f 63 63 75   abort must occu
1c3b0 72 20 61 66 74 65 72 20 74 68 65 20 6d 75 6c 74  r after the mult
1c3c0 69 77 72 69 74 65 2e 20 20 54 68 69 73 20 6d 61  iwrite.  This ma
1c3d0 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74  kes.** some stat
1c3e0 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67  ements involving
1c3f0 20 74 68 65 20 52 45 50 4c 41 43 45 20 63 6f 6e   the REPLACE con
1c400 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
1c410 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f   algorithm.** go
1c420 20 61 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72   a little faster
1c430 2e 20 20 42 75 74 20 74 61 6b 69 6e 67 20 61 64  .  But taking ad
1c440 76 61 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20  vantage of this 
1c450 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a  time dependency.
1c460 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65  ** makes it more
1c470 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 70 72   difficult to pr
1c480 6f 76 65 20 74 68 61 74 20 74 68 65 20 63 6f 64  ove that the cod
1c490 65 20 69 73 20 63 6f 72 72 65 63 74 20 28 69 6e  e is correct (in
1c4a0 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 2c   .** particular,
1c4b0 20 69 74 20 70 72 65 76 65 6e 74 73 20 75 73 20   it prevents us 
1c4c0 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e 20  from writing an 
1c4d0 65 66 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70  effective.** imp
1c4e0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73  lementation of s
1c4f0 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
1c500 62 6f 72 74 28 29 29 20 61 6e 64 20 73 6f 20 77  bort()) and so w
1c510 65 20 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a  e have chosen.**
1c520 20 74 6f 20 74 61 6b 65 20 74 68 65 20 73 61 66   to take the saf
1c530 65 20 72 6f 75 74 65 20 61 6e 64 20 73 6b 69 70  e route and skip
1c540 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
1c550 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
1c560 65 33 4d 61 79 41 62 6f 72 74 28 50 61 72 73 65  e3MayAbort(Parse
1c570 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72   *pParse){.  Par
1c580 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
1c590 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
1c5a0 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
1c5b0 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62  pToplevel->mayAb
1c5c0 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ort = 1;.}../*.*
1c5d0 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c  * Code an OP_Hal
1c5e0 74 20 74 68 61 74 20 63 61 75 73 65 73 20 74 68  t that causes th
1c5f0 65 20 76 64 62 65 20 74 6f 20 72 65 74 75 72 6e  e vdbe to return
1c600 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   an SQLITE_CONST
1c610 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20  RAINT.** error. 
1c620 54 68 65 20 6f 6e 45 72 72 6f 72 20 70 61 72 61  The onError para
1c630 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73  meter determines
1c640 20 77 68 69 63 68 20 28 69 66 20 61 6e 79 29 20   which (if any) 
1c650 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
1c660 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72 65  .** and/or curre
1c670 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
1c680 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
1c690 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61  /.void sqlite3Ha
1c6a0 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 72  ltConstraint(Par
1c6b0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1c6c0 6f 6e 45 72 72 6f 72 2c 20 63 68 61 72 20 2a 70  onError, char *p
1c6d0 34 2c 20 69 6e 74 20 70 34 74 79 70 65 29 7b 0a  4, int p4type){.
1c6e0 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
1c6f0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1c700 65 29 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f  e);.  if( onErro
1c710 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  r==OE_Abort ){. 
1c720 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
1c730 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  rt(pParse);.  }.
1c740 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c750 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20  Op4(v, OP_Halt, 
1c760 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
1c770 54 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70  T, onError, 0, p
1c780 34 2c 20 70 34 74 79 70 65 29 3b 0a 7d 0a 0a 2f  4, p4type);.}../
1c790 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
1c7a0 65 20 69 66 20 70 49 6e 64 65 78 20 75 73 65 73  e if pIndex uses
1c7b0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
1c7c0 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20  equence pColl.  
1c7d0 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
1c7e0 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61  f it does and fa
1c7f0 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e  lse if it does n
1c800 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ot..*/.#ifndef S
1c810 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
1c820 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  EX.static int co
1c830 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e  llationMatch(con
1c840 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20  st char *zColl, 
1c850 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a  Index *pIndex){.
1c860 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
1c870 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20  t( zColl!=0 );. 
1c880 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64   for(i=0; i<pInd
1c890 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ex->nColumn; i++
1c8a0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
1c8b0 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61  r *z = pIndex->a
1c8c0 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61 73  zColl[i];.    as
1c8d0 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20  sert( z!=0 );.  
1c8e0 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
1c8f0 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c  StrICmp(z, zColl
1c900 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1c910 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
1c920 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
1c930 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d  dif../*.** Recom
1c940 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
1c950 20 6f 66 20 70 54 61 62 20 74 68 61 74 20 75 73   of pTab that us
1c960 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  e the collating 
1c970 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a  sequence pColl..
1c980 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74  ** If pColl==0 t
1c990 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c  hen recompute al
1c9a0 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
1c9b0 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  b..*/.#ifndef SQ
1c9c0 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
1c9d0 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  X.static void re
1c9e0 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73 65  indexTable(Parse
1c9f0 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
1ca00 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73  *pTab, char cons
1ca10 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64  t *zColl){.  Ind
1ca20 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
1ca30 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
1ca40 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
1ca50 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20  with pTab */..  
1ca60 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d  for(pIndex=pTab-
1ca70 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
1ca80 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e   pIndex=pIndex->
1ca90 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1caa0 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c  zColl==0 || coll
1cab0 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c  ationMatch(zColl
1cac0 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  , pIndex) ){.   
1cad0 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
1cae0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
1caf0 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
1cb00 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
1cb10 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
1cb20 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
1cb30 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
1cb40 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66        sqlite3Ref
1cb50 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
1cb60 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
1cb70 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
1cb80 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
1cb90 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
1cba0 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61   all tables in a
1cbb0 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65  ll databases whe
1cbc0 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65  re the.** indice
1cbd0 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  s use the collat
1cbe0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
1cbf0 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ll.  If pColl==0
1cc00 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a   then recompute.
1cc10 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65  ** all indices e
1cc20 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69  verywhere..*/.#i
1cc30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1cc40 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
1cc50 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74   void reindexDat
1cc60 61 62 61 73 65 73 28 50 61 72 73 65 20 2a 70 50  abases(Parse *pP
1cc70 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74  arse, char const
1cc80 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a   *zColl){.  Db *
1cc90 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
1cca0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
1ccb0 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  gle database */.
1ccc0 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
1ccd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cce0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
1ccf0 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
1cd00 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1cd10 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54  arse->db;   /* T
1cd20 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1cd30 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68  ection */.  Hash
1cd40 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20  Elem *k;        
1cd50 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1cd60 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
1cd70 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54  es in pDb */.  T
1cd80 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
1cd90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
1cda0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
1cdb0 61 62 61 73 65 20 2a 2f 0a 0a 20 20 66 6f 72 28  abase */..  for(
1cdc0 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61  iDb=0, pDb=db->a
1cdd0 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b  Db; iDb<db->nDb;
1cde0 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a   iDb++, pDb++){.
1cdf0 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 21      assert( pDb!
1ce00 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d  =0 );.    for(k=
1ce10 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
1ce20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
1ce30 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73  blHash);  k; k=s
1ce40 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29  qliteHashNext(k)
1ce50 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
1ce60 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61  (Table*)sqliteHa
1ce70 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20  shData(k);.     
1ce80 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
1ce90 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c  arse, pTab, zCol
1cea0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  l);.    }.  }.}.
1ceb0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
1cec0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1ced0 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d  the REINDEX comm
1cee0 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  and..**.**      
1cef0 20 20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20    REINDEX       
1cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf10 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20       -- 1.**    
1cf20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f      REINDEX  <co
1cf30 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20  llation>        
1cf40 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20         -- 2.**  
1cf50 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f        REINDEX  ?
1cf60 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62  <database>.?<tab
1cf70 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a  lename>  -- 3.**
1cf80 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
1cf90 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69   ?<database>.?<i
1cfa0 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a  ndexname>  -- 4.
1cfb0 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75  **.** Form 1 cau
1cfc0 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ses all indices 
1cfd0 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  in all attached 
1cfe0 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20  databases to be 
1cff0 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d  rebuilt..** Form
1d000 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20   2 rebuilds all 
1d010 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64  indices in all d
1d020 61 74 61 62 61 73 65 73 20 74 68 61 74 20 75 73  atabases that us
1d030 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63  e the named.** c
1d040 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
1d050 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20  n.  Forms 3 and 
1d060 34 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61  4 rebuild the na
1d070 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c  med index or all
1d080 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f  .** indices asso
1d090 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1d0a0 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a  named table..*/.
1d0b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d0c0 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64  MIT_REINDEX.void
1d0d0 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28   sqlite3Reindex(
1d0e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
1d0f0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f  oken *pName1, To
1d100 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20  ken *pName2){.  
1d110 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
1d120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1d130 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1d140 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  e to be reindexe
1d150 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  d, or NULL */.  
1d160 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20  char *z;        
1d170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1d180 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ame of a table o
1d190 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e  r index */.  con
1d1a0 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20  st char *zDb;   
1d1b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1d1c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1d1d0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1d1e0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1d1f0 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20    /* A table in 
1d200 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
1d210 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
1d220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d230 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69   An index associ
1d240 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a  ated with pTab *
1d250 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
1d260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d270 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1d280 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  index number */.
1d290 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1d2a0 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
1d2b0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
1d2c0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f  nnection */.  To
1d2d0 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20  ken *pObjName;  
1d2e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1d2f0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
1d300 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65  r index to be re
1d310 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a  indexed */..  /*
1d320 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
1d330 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
1d340 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
1d350 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
1d360 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
1d370 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
1d380 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
1d390 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
1d3a0 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
1d3b0 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
1d3c0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1d3d0 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30  .  if( pName1==0
1d3e0 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44   ){.    reindexD
1d3f0 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
1d400 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   0);.    return;
1d410 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4e 45 56  .  }else if( NEV
1d420 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c  ER(pName2==0) ||
1d430 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b   pName2->z==0 ){
1d440 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  .    char *zColl
1d450 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
1d460 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a  ame1->z );.    z
1d470 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61  Coll = sqlite3Na
1d480 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
1d490 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b  se->db, pName1);
1d4a0 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20  .    if( !zColl 
1d4b0 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 43  ) return;.    pC
1d4c0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
1d4d0 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
1d4e0 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b  (db), zColl, 0);
1d4f0 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
1d500 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 44  {.      reindexD
1d510 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
1d520 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73   zColl);.      s
1d530 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1d540 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72   zColl);.      r
1d550 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
1d560 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1d570 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20  b, zColl);.  }. 
1d580 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
1d590 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
1d5a0 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
1d5b0 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  , &pObjName);.  
1d5c0 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75  if( iDb<0 ) retu
1d5d0 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  rn;.  z = sqlite
1d5e0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1d5f0 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  b, pObjName);.  
1d600 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
1d610 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61  n;.  zDb = db->a
1d620 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
1d630 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
1d640 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20  indTable(db, z, 
1d650 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62  zDb);.  if( pTab
1d660 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54   ){.    reindexT
1d670 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
1d680 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
1d690 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
1d6a0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1d6b0 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
1d6c0 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
1d6d0 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69   z, zDb);.  sqli
1d6e0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
1d6f0 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
1d700 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
1d710 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
1d720 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
1d730 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66  ;.    sqlite3Ref
1d740 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
1d750 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
1d760 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1d770 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1d780 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
1d790 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20  to identify the 
1d7a0 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69  object to be rei
1d7b0 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64  ndexed");.}.#end
1d7c0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
1d7d0 20 61 20 64 79 6e 61 6d 69 63 6c 79 20 61 6c 6c   a dynamicly all
1d7e0 6f 63 61 74 65 64 20 4b 65 79 49 6e 66 6f 20 73  ocated KeyInfo s
1d7f0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 61  tructure that ca
1d800 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 77 69 74  n be used.** wit
1d810 68 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 6f 72  h OP_OpenRead or
1d820 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 74 6f   OP_OpenWrite to
1d830 20 61 63 63 65 73 73 20 64 61 74 61 62 61 73 65   access database
1d840 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a   index pIdx..**.
1d850 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1d860 2c 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  , a pointer to t
1d870 68 65 20 6e 65 77 20 73 74 72 75 63 74 75 72 65  he new structure
1d880 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e   is returned. In
1d890 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 74 68   this case.** th
1d8a0 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
1d8b0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c  onsible for call
1d8c0 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65  ing sqlite3DbFre
1d8d0 65 28 64 62 2c 20 29 20 6f 6e 20 74 68 65 20 72  e(db, ) on the r
1d8e0 65 74 75 72 6e 65 64 20 0a 2a 2a 20 70 6f 69 6e  eturned .** poin
1d8f0 74 65 72 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ter. If an error
1d900 20 6f 63 63 75 72 73 20 28 6f 75 74 20 6f 66 20   occurs (out of 
1d910 6d 65 6d 6f 72 79 20 6f 72 20 6d 69 73 73 69 6e  memory or missin
1d920 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 2a 2a 20  g collation .** 
1d930 73 65 71 75 65 6e 63 65 29 2c 20 4e 55 4c 4c 20  sequence), NULL 
1d940 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1d950 74 68 65 20 73 74 61 74 65 20 6f 66 20 70 50 61  the state of pPa
1d960 72 73 65 20 75 70 64 61 74 65 64 20 74 6f 20 72  rse updated to r
1d970 65 66 6c 65 63 74 0a 2a 2a 20 74 68 65 20 65 72  eflect.** the er
1d980 72 6f 72 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  ror..*/.KeyInfo 
1d990 2a 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79  *sqlite3IndexKey
1d9a0 69 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  info(Parse *pPar
1d9b0 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29  se, Index *pIdx)
1d9c0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
1d9d0 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43   nCol = pIdx->nC
1d9e0 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 42 79  olumn;.  int nBy
1d9f0 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 4b 65 79  tes = sizeof(Key
1da00 49 6e 66 6f 29 20 2b 20 28 6e 43 6f 6c 2d 31 29  Info) + (nCol-1)
1da10 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  *sizeof(CollSeq*
1da20 29 20 2b 20 6e 43 6f 6c 3b 0a 20 20 73 71 6c 69  ) + nCol;.  sqli
1da30 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1da40 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  ->db;.  KeyInfo 
1da50 2a 70 4b 65 79 20 3d 20 28 4b 65 79 49 6e 66 6f  *pKey = (KeyInfo
1da60 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   *)sqlite3DbMall
1da70 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
1da80 73 29 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20  s);..  if( pKey 
1da90 29 7b 0a 20 20 20 20 70 4b 65 79 2d 3e 64 62 20  ){.    pKey->db 
1daa0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1dab0 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64    pKey->aSortOrd
1dac0 65 72 20 3d 20 28 75 38 20 2a 29 26 28 70 4b 65  er = (u8 *)&(pKe
1dad0 79 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b  y->aColl[nCol]);
1dae0 0a 20 20 20 20 61 73 73 65 72 74 28 20 26 70 4b  .    assert( &pK
1daf0 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  ey->aSortOrder[n
1db00 43 6f 6c 5d 3d 3d 26 28 28 28 75 38 20 2a 29 70  Col]==&(((u8 *)p
1db10 4b 65 79 29 5b 6e 42 79 74 65 73 5d 29 20 29 3b  Key)[nBytes]) );
1db20 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1db30 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
1db40 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20    char *zColl = 
1db50 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b  pIdx->azColl[i];
1db60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
1db70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 4b  Coll );.      pK
1db80 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73  ey->aColl[i] = s
1db90 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
1dba0 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
1dbb0 6c 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e  l);.      pKey->
1dbc0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
1dbd0 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
1dbe0 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  [i];.    }.    p
1dbf0 4b 65 79 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75  Key->nField = (u
1dc00 31 36 29 6e 43 6f 6c 3b 0a 20 20 7d 0a 0a 20 20  16)nCol;.  }..  
1dc10 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1dc20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
1dc30 62 46 72 65 65 28 64 62 2c 20 70 4b 65 79 29 3b  bFree(db, pKey);
1dc40 0a 20 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20  .    pKey = 0;. 
1dc50 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79   }.  return pKey
1dc60 3b 0a 7d 0a                                      ;.}.