/ Hex Artifact Content
Login

Artifact 254a273acb8923f3bdecc933d787f4f67737c489:


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 29 3b 0a 20 20 74 65 73 74 63 61  Name );.  testca
42c0: 73 65 28 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d  se( zTabName[0]=
42d0: 3d 30 20 29 3b 20 20 2f 2a 20 5a 65 72 6f 2d 6c  =0 );  /* Zero-l
42e0: 65 6e 67 74 68 20 74 61 62 6c 65 20 6e 61 6d 65  ength table name
42f0: 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 2a 2f  s are allowed */
4300: 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
4310: 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71  b[iDb];.  p = sq
4320: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
4330: 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
4340: 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61 6d 65  blHash, zTabName
4350: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4360: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
4370: 33 53 74 72 6c 65 6e 33 30 28 7a 54 61 62 4e 61  3Strlen30(zTabNa
4380: 6d 65 29 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65  me),0);.  sqlite
4390: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 29 3b  3DeleteTable(p);
43a0: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20  .  db->flags |= 
43b0: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
43c0: 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  nges;.}../*.** G
43d0: 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65  iven a token, re
43e0: 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68  turn a string th
43f0: 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  at consists of t
4400: 68 65 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a  he text of that.
4410: 2a 2a 20 74 6f 6b 65 6e 2e 20 20 53 70 61 63 65  ** token.  Space
4420: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
4430: 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20  urned string.** 
4440: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
4450: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
4460: 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
4470: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
4480: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  .** function..**
4490: 0a 2a 2a 20 41 6e 79 20 71 75 6f 74 61 74 69 6f  .** Any quotatio
44a0: 6e 20 6d 61 72 6b 73 20 28 65 78 3a 20 20 22 6e  n marks (ex:  "n
44b0: 61 6d 65 22 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e  ame", 'name', [n
44c0: 61 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d 65 60 29  ame], or `name`)
44d0: 20 74 68 61 74 0a 2a 2a 20 73 75 72 72 6f 75 6e   that.** surroun
44e0: 64 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68  d the body of th
44f0: 65 20 74 6f 6b 65 6e 20 61 72 65 20 72 65 6d 6f  e token are remo
4500: 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e  ved..**.** Token
4510: 73 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74  s are often just
4520: 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74   pointers into t
4530: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
4540: 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61  text and so.** a
4550: 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d  re not \000 term
4560: 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e  inated and are n
4570: 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20  ot persistent.  
4580: 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  The returned str
4590: 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74  ing.** is \000 t
45a0: 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73  erminated and is
45b0: 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a   persistent..*/.
45c0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d  char *sqlite3Nam
45d0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74  eFromToken(sqlit
45e0: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
45f0: 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
4600: 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d  Name;.  if( pNam
4610: 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  e ){.    zName =
4620: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
4630: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e 61  p(db, (char*)pNa
4640: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
4650: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71  ;.    sqlite3Deq
4660: 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d  uote(zName);.  }
4670: 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  else{.    zName 
4680: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
4690: 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zName;.}../*.*
46a0: 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74  * Open the sqlit
46b0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73  e_master table s
46c0: 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73  tored in databas
46d0: 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72  e number iDb for
46e0: 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65  .** writing. The
46f0: 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64   table is opened
4700: 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e   using cursor 0.
4710: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4720: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
4730: 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44  Parse *p, int iD
4740: 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
4750: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
4760: 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c  );.  sqlite3Tabl
4770: 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41  eLock(p, iDb, MA
4780: 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 53 43  STER_ROOT, 1, SC
4790: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29  HEMA_TABLE(iDb))
47a0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
47b0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
47c0: 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54 45 52  Write, 0, MASTER
47d0: 5f 52 4f 4f 54 2c 20 69 44 62 29 3b 0a 20 20 73  _ROOT, iDb);.  s
47e0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
47f0: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20  P4(v, -1, (char 
4800: 2a 29 35 2c 20 50 34 5f 49 4e 54 33 32 29 3b 20  *)5, P4_INT32); 
4810: 20 2f 2a 20 35 20 63 6f 6c 75 6d 6e 20 74 61 62   /* 5 column tab
4820: 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e  le */.  if( p->n
4830: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  Tab==0 ){.    p-
4840: 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d 0a 7d  >nTab = 1;.  }.}
4850: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
4860: 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20 74  r zName points t
4870: 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  o a nul-terminat
4880: 65 64 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  ed buffer contai
4890: 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  ning the name.**
48a0: 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28   of a database (
48b0: 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 6f  "main", "temp" o
48c0: 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  r the name of an
48d0: 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20 54   attached db). T
48e0: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
48f0: 72 65 74 75 72 6e 73 20 74 68 65 20 69 6e 64 65  returns the inde
4900: 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64  x of the named d
4910: 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61  atabase in db->a
4920: 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31 20 69  Db[], or.** -1 i
4930: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 63  f the named db c
4940: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
4950: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69  */.int sqlite3Fi
4960: 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69 74 65 33  ndDbName(sqlite3
4970: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
4980: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
4990: 69 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  i = -1;         
49a0: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
49b0: 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e 61 6d  er */.  if( zNam
49c0: 65 20 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62  e ){.    Db *pDb
49d0: 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71  ;.    int n = sq
49e0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
49f0: 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ame);.    for(i=
4a00: 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62  (db->nDb-1), pDb
4a10: 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e  =&db->aDb[i]; i>
4a20: 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b  =0; i--, pDb--){
4a30: 0a 20 20 20 20 20 20 69 66 28 20 28 21 4f 4d 49  .      if( (!OMI
4a40: 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31  T_TEMPDB || i!=1
4a50: 20 29 20 26 26 20 6e 3d 3d 73 71 6c 69 74 65 33   ) && n==sqlite3
4a60: 53 74 72 6c 65 6e 33 30 28 70 44 62 2d 3e 7a 4e  Strlen30(pDb->zN
4a70: 61 6d 65 29 20 26 26 20 0a 20 20 20 20 20 20 20  ame) && .       
4a80: 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72     0==sqlite3Str
4a90: 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c  ICmp(pDb->zName,
4aa0: 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20   zName) ){.     
4ab0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4ac0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
4ad0: 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn i;.}../*.**
4ae0: 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d   The token *pNam
4af0: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  e contains the n
4b00: 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73  ame of a databas
4b10: 65 20 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22  e (either "main"
4b20: 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72   or.** "temp" or
4b30: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
4b40: 61 74 74 61 63 68 65 64 20 64 62 29 2e 20 54 68  attached db). Th
4b50: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
4b60: 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20  ns the.** index 
4b70: 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74  of the named dat
4b80: 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62  abase in db->aDb
4b90: 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65  [], or -1 if the
4ba0: 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f   named db .** do
4bb0: 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f  es not exist..*/
4bc0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64  .int sqlite3Find
4bd0: 44 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  Db(sqlite3 *db, 
4be0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
4bf0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c10: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
4c20: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68  e number */.  ch
4c30: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20  ar *zName;      
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c50: 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72     /* Name we ar
4c60: 65 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20  e searching for 
4c70: 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  */.  zName = sql
4c80: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
4c90: 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
4ca0: 69 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  i = sqlite3FindD
4cb0: 62 4e 61 6d 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bName(db, zName)
4cc0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
4cd0: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
4ce0: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20  return i;.}../* 
4cf0: 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  The table or vie
4d00: 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61 6d  w or trigger nam
4d10: 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  e is passed to t
4d20: 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20  his routine via 
4d30: 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31  tokens.** pName1
4d40: 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20   and pName2. If 
4d50: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77  the table name w
4d60: 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  as fully qualifi
4d70: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a  ed, for example:
4d80: 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41  .**.** CREATE TA
4d90: 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e  BLE xxx.yyy (...
4da0: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70  );.** .** Then p
4db0: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
4dc0: 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32  "xxx" and pName2
4dd0: 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f   "yyy". On the o
4de0: 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20  ther hand if.** 
4df0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  the table name i
4e00: 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c  s not fully qual
4e10: 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a  ified, i.e.:.**.
4e20: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
4e30: 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20  yyy(...);.**.** 
4e40: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
4e50: 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20  et to "yyy" and 
4e60: 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a  pName2 is ""..**
4e70: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4e80: 20 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e 71   sets the *ppUnq
4e90: 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  ual pointer to p
4ea0: 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65  oint at the toke
4eb0: 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20  n (pName1 or.** 
4ec0: 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f  pName2) that sto
4ed0: 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66  res the unqualif
4ee0: 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  ied table name. 
4ef0: 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   The index of th
4f00: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22 78  e.** database "x
4f10: 78 78 22 20 69 73 20 72 65 74 75 72 6e 65 64 2e  xx" is returned.
4f20: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
4f30: 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61  woPartName(.  Pa
4f40: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4f50: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
4f60: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
4f70: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
4f80: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
4f90: 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20 69    /* The "xxx" i
4fa0: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
4fb0: 79 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a 2f  yyy" or "xxx" */
4fc0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
4fd0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 79  ,      /* The "y
4fe0: 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  yy" in the name 
4ff0: 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54  "xxx.yyy" */.  T
5000: 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20  oken **pUnqual  
5010: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
5020: 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a 65  unqualified obje
5030: 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a  ct name here */.
5040: 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  ){.  int iDb;   
5050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5060: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
5070: 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74 20  ding the object 
5080: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
5090: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
50a0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4e 61    if( ALWAYS(pNa
50b0: 6d 65 32 21 3d 30 29 20 26 26 20 70 4e 61 6d 65  me2!=0) && pName
50c0: 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66  2->n>0 ){.    if
50d0: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
50e0: 29 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ) {.      sqlite
50f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5100: 2c 20 22 63 6f 72 72 75 70 74 20 64 61 74 61 62  , "corrupt datab
5110: 61 73 65 22 29 3b 0a 20 20 20 20 20 20 70 50 61  ase");.      pPa
5120: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
5130: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
5140: 20 20 7d 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c    }.    *pUnqual
5150: 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69   = pName2;.    i
5160: 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
5170: 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a  Db(db, pName1);.
5180: 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b      if( iDb<0 ){
5190: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
51a0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
51b0: 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65  unknown database
51c0: 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20   %T", pName1);. 
51d0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
51e0: 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r++;.      retur
51f0: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n -1;.    }.  }e
5200: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
5210: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30   db->init.iDb==0
5220: 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   || db->init.bus
5230: 79 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64  y );.    iDb = d
5240: 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20  b->init.iDb;.   
5250: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
5260: 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e1;.  }.  return
5270: 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   iDb;.}../*.** T
5280: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
5290: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20  sed to check if 
52a0: 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67  the UTF-8 string
52b0: 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61   zName is a lega
52c0: 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64  l.** unqualified
52d0: 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20   name for a new 
52e0: 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74  schema object (t
52f0: 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65  able, index, vie
5300: 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29  w or.** trigger)
5310: 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20  . All names are 
5320: 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f  legal except tho
5330: 73 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  se that begin wi
5340: 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a  th the string.**
5350: 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75   "sqlite_" (in u
5360: 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d  pper, lower or m
5370: 69 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73  ixed case). This
5380: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
5390: 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20  namespace.** is 
53a0: 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74  reserved for int
53b0: 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e  ernal use..*/.in
53c0: 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  t sqlite3CheckOb
53d0: 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a  jectName(Parse *
53e0: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
53f0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66  ar *zName){.  if
5400: 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69  ( !pParse->db->i
5410: 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72  nit.busy && pPar
5420: 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20  se->nested==0 . 
5430: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61           && (pPa
5440: 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
5450: 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68   SQLITE_WriteSch
5460: 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ema)==0.        
5470: 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53    && 0==sqlite3S
5480: 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22  trNICmp(zName, "
5490: 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a  sqlite_", 7) ){.
54a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
54b0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a  Msg(pParse, "obj
54c0: 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65  ect name reserve
54d0: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
54e0: 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  se: %s", zName);
54f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5500: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
5510: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5520: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
5530: 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20   constructing a 
5540: 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73  new table repres
5550: 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f  entation in memo
5560: 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  ry.  This is.** 
5570: 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76  the first of sev
5580: 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74  eral action rout
5590: 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61  ines that get ca
55a0: 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65  lled in response
55b0: 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20  .** to a CREATE 
55c0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
55d0: 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c    In particular,
55e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
55f0: 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72   called.** after
5600: 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22   seeing tokens "
5610: 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42  CREATE" and "TAB
5620: 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c  LE" and the tabl
5630: 65 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65  e name. The isTe
5640: 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72  mp.** flag is tr
5650: 75 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ue if the table 
5660: 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64  should be stored
5670: 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72   in the auxiliar
5680: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  y database.** fi
5690: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
56a0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
56b0: 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  se file.  This i
56c0: 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63  s normally the c
56d0: 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  ase.** when the 
56e0: 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f  "TEMP" or "TEMPO
56f0: 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63  RARY" keyword oc
5700: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a  curs in between.
5710: 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41  ** CREATE and TA
5720: 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  BLE..**.** The n
5730: 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  ew table record 
5740: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61  is initialized a
5750: 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65  nd put in pParse
5760: 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20  ->pNewTable..** 
5770: 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43  As more of the C
5780: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
5790: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c  ement is parsed,
57a0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69   additional acti
57b0: 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77  on.** routines w
57c0: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f  ill be called to
57d0: 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d   add more inform
57e0: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65  ation to this re
57f0: 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20  cord..** At the 
5800: 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54  end of the CREAT
5810: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
5820: 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e  t, the sqlite3En
5830: 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65  dTable() routine
5840: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  .** is called to
5850: 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f   complete the co
5860: 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68  nstruction of th
5870: 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f  e new table reco
5880: 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rd..*/.void sqli
5890: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20  te3StartTable(. 
58a0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
58b0: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
58c0: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
58d0: 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72  pName1,   /* Fir
58e0: 73 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  st part of the n
58f0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
5900: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f   or view */.  To
5910: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f  ken *pName2,   /
5920: 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
5930: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
5940: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
5950: 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20  /.  int isTemp, 
5960: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5970: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74  this is a TEMP t
5980: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  able */.  int is
5990: 56 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72  View,      /* Tr
59a0: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
59b0: 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73  VIEW */.  int is
59c0: 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72  Virtual,   /* Tr
59d0: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
59e0: 56 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f  VIRTUAL table */
59f0: 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20  .  int noErr    
5a00: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
5a10: 67 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61  g if table alrea
5a20: 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a  dy exists */.){.
5a30: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
5a40: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
5a50: 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20   0; /* The name 
5a60: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
5a70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
5a80: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
5a90: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
5aa0: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
5ab0: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
5ac0: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74   to create the t
5ad0: 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b  able in */.  Tok
5ae0: 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a  en *pName;    /*
5af0: 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   Unqualified nam
5b00: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
5b10: 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f  o create */..  /
5b20: 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76  * The table or v
5b30: 69 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65 61  iew name to crea
5b40: 74 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  te is passed to 
5b50: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61  this routine via
5b60: 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61   tokens.  ** pNa
5b70: 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20  me1 and pName2. 
5b80: 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  If the table nam
5b90: 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c  e was fully qual
5ba0: 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70  ified, for examp
5bb0: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52  le:.  **.  ** CR
5bc0: 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79  EATE TABLE xxx.y
5bd0: 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a  yy (...);.  ** .
5be0: 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31    ** Then pName1
5bf0: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
5c00: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
5c10: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
5c20: 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 65  hand if.  ** the
5c30: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e   table name is n
5c40: 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  ot fully qualifi
5c50: 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20  ed, i.e.:.  **. 
5c60: 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
5c70: 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a   yyy(...);.  **.
5c80: 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31    ** Then pName1
5c90: 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22   is set to "yyy"
5ca0: 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22   and pName2 is "
5cb0: 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  "..  **.  ** The
5cc0: 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73   call below sets
5cd0: 20 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74   the pName point
5ce0: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
5cf0: 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31  he token (pName1
5d00: 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29   or.  ** pName2)
5d10: 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65   that stores the
5d20: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62   unqualified tab
5d30: 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61 72  le name. The var
5d40: 69 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20 2a  iable iDb is.  *
5d50: 2a 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  * set to the ind
5d60: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
5d70: 73 65 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  se that the tabl
5d80: 65 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f 20  e or view is to 
5d90: 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  be.  ** created 
5da0: 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d  in..  */.  iDb =
5db0: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
5dc0: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
5dd0: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
5de0: 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30  me);.  if( iDb<0
5df0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
5e00: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
5e10: 20 69 73 54 65 6d 70 20 26 26 20 69 44 62 3e 31   isTemp && iDb>1
5e20: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63 72   ){.    /* If cr
5e30: 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61  eating a temp ta
5e40: 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61  ble, the name ma
5e50: 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69  y not be qualifi
5e60: 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ed */.    sqlite
5e70: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5e80: 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62  , "temporary tab
5e90: 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  le name must be 
5ea0: 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20  unqualified");. 
5eb0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
5ec0: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
5ed0: 42 20 26 26 20 69 73 54 65 6d 70 20 29 20 69 44  B && isTemp ) iD
5ee0: 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65  b = 1;..  pParse
5ef0: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a  ->sNameToken = *
5f00: 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d  pName;.  zName =
5f10: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
5f20: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
5f30: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
5f40: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
5f50: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
5f60: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
5f70: 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  me(pParse, zName
5f80: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65  ) ){.    goto be
5f90: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
5fa0: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69  .  }.  if( db->i
5fb0: 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54  nit.iDb==1 ) isT
5fc0: 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  emp = 1;.#ifndef
5fd0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
5fe0: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73  HORIZATION.  ass
5ff0: 65 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31  ert( (isTemp & 1
6000: 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b  )==isTemp );.  {
6010: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
6020: 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64     char *zDb = d
6030: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
6040: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
6050: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
6060: 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
6070: 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
6080: 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29  isTemp), 0, zDb)
6090: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
60a0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
60b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
60c0: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
60d0: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
60e0: 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20   && isTemp ){.  
60f0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
6100: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
6110: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  VIEW;.      }els
6120: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
6130: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
6140: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20  VIEW;.      }.  
6150: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
6160: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
6170: 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  && isTemp ){.   
6180: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
6190: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
61a0: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
61b0: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
61c0: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
61d0: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20  TABLE;.      }. 
61e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73     }.    if( !is
61f0: 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74  Virtual && sqlit
6200: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
6210: 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c  se, code, zName,
6220: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
6230: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
6240: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
6250: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
6260: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e   Make sure the n
6270: 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f  ew table name do
6280: 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77  es not collide w
6290: 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  ith an existing.
62a0: 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
62b0: 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  ble name in the 
62c0: 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20  same database.  
62d0: 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d  Issue an error m
62e0: 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69  essage if.  ** i
62f0: 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65  t does. The exce
6300: 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20  ption is if the 
6310: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
6320: 70 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65  parsed was passe
6330: 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c  d.  ** to an sql
6340: 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
6350: 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61  b() call. In tha
6360: 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20  t case only the 
6370: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a  column names.  *
6380: 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c  * and types will
6390: 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65   be used, so the
63a0: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
63b0: 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70   test for namesp
63c0: 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69  ace.  ** collisi
63d0: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
63e0: 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42  !IN_DECLARE_VTAB
63f0: 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   ){.    if( SQLI
6400: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
6410: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
6420: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
6430: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
6440: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
6450: 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  le = sqlite3Find
6460: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
6470: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
6480: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54  ame);.    if( pT
6490: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66  able ){.      if
64a0: 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20  ( !noErr ){.    
64b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
64c0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
64d0: 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65 78  le %T already ex
64e0: 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ists", pName);. 
64f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
6500: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
6510: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ror;.    }.    i
6520: 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  f( sqlite3FindIn
6530: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  dex(db, zName, 0
6540: 29 21 3d 30 20 26 26 20 28 69 44 62 3d 3d 30 20  )!=0 && (iDb==0 
6550: 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  || !db->init.bus
6560: 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  y) ){.      sqli
6570: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
6580: 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  se, "there is al
6590: 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e  ready an index n
65a0: 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29  amed %s", zName)
65b0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  ;.      goto beg
65c0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
65d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61      }.  }..  pTa
65e0: 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ble = sqlite3DbM
65f0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
6600: 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
6610: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b  if( pTable==0 ){
6620: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
6630: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 70  ailed = 1;.    p
6640: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
6650: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50  TE_NOMEM;.    pP
6660: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
6670: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
6680: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  le_error;.  }.  
6690: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20  pTable->zName = 
66a0: 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d  zName;.  pTable-
66b0: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70  >iPKey = -1;.  p
66c0: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d  Table->pSchema =
66d0: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
66e0: 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d  chema;.  pTable-
66f0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61  >nRef = 1;.  pTa
6700: 62 6c 65 2d 3e 64 62 4d 65 6d 20 3d 20 30 3b 0a  ble->dbMem = 0;.
6710: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
6720: 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29  ->pNewTable==0 )
6730: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  ;.  pParse->pNew
6740: 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a  Table = pTable;.
6750: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
6760: 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74   the magic sqlit
6770: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
6780: 20 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63   used by autoinc
6790: 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65  rement,.  ** the
67a0: 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74  n record a point
67b0: 65 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  er to this table
67c0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
67d0: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 0a  abase structure.
67e0: 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53    ** so that INS
67f0: 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65  ERT can find the
6800: 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20   table easily.. 
6810: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
6820: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
6830: 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61  EMENT.  if( !pPa
6840: 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73  rse->nested && s
6850: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  trcmp(zName, "sq
6860: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d  lite_sequence")=
6870: 3d 30 20 29 7b 0a 20 20 20 20 70 54 61 62 6c 65  =0 ){.    pTable
6880: 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54  ->pSchema->pSeqT
6890: 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d  ab = pTable;.  }
68a0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65  .#endif..  /* Be
68b0: 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74  gin generating t
68c0: 68 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  he code that wil
68d0: 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62  l insert the tab
68e0: 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20  le record into. 
68f0: 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   ** the SQLITE_M
6900: 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f  ASTER table.  No
6910: 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72  te in particular
6920: 20 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f   that we must go
6930: 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20   ahead.  ** and 
6940: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63  allocate the rec
6950: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
6960: 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e  he table entry n
6970: 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a  ow.  Before any.
6980: 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59    ** PRIMARY KEY
6990: 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f   or UNIQUE keywo
69a0: 72 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20  rds are parsed. 
69b0: 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20   Those keywords 
69c0: 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20  will cause.  ** 
69d0: 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72  indices to be cr
69e0: 65 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61  eated and the ta
69f0: 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20  ble record must 
6a00: 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20  come before the 
6a10: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20  .  ** indices.  
6a20: 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72  Hence, the recor
6a30: 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  d number for the
6a40: 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61   table must be a
6a50: 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f  llocated.  ** no
6a60: 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  w..  */.  if( !d
6a70: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
6a80: 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  (v = sqlite3GetV
6a90: 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20  dbe(pParse))!=0 
6aa0: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20  ){.    int j1;. 
6ab0: 20 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61     int fileForma
6ac0: 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c  t;.    int reg1,
6ad0: 20 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20   reg2, reg3;.   
6ae0: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
6af0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
6b00: 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 23 69  se, 0, iDb);..#i
6b10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6b20: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
6b30: 20 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c     if( isVirtual
6b40: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6b50: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
6b60: 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d  P_VBegin);.    }
6b70: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
6b80: 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d  If the file form
6b90: 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20  at and encoding 
6ba0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
6bb0: 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65  have not been se
6bc0: 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74  t, .    ** set t
6bd0: 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a  hem now..    */.
6be0: 20 20 20 20 72 65 67 31 20 3d 20 70 50 61 72 73      reg1 = pPars
6bf0: 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b  e->regRowid = ++
6c00: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
6c10: 20 20 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d    reg2 = pParse-
6c20: 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61  >regRoot = ++pPa
6c30: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
6c40: 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  eg3 = ++pParse->
6c50: 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
6c60: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6c70: 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44  P_ReadCookie, iD
6c80: 62 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46  b, reg3, BTREE_F
6c90: 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20  ILE_FORMAT);.   
6ca0: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
6cb0: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
6cc0: 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
6cd0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
6ce0: 49 66 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 66  If, reg3);.    f
6cf0: 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d  ileFormat = (db-
6d00: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
6d10: 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d  LegacyFileFmt)!=
6d20: 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  0 ?.            
6d30: 20 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45        1 : SQLITE
6d40: 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  _MAX_FILE_FORMAT
6d50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6d60: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
6d70: 74 65 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61  teger, fileForma
6d80: 74 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71  t, reg3);.    sq
6d90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6da0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
6db0: 20 69 44 62 2c 20 42 54 52 45 45 5f 46 49 4c 45   iDb, BTREE_FILE
6dc0: 5f 46 4f 52 4d 41 54 2c 20 72 65 67 33 29 3b 0a  _FORMAT, reg3);.
6dd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6de0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
6df0: 67 65 72 2c 20 45 4e 43 28 64 62 29 2c 20 72 65  ger, ENC(db), re
6e00: 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g3);.    sqlite3
6e10: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6e20: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
6e30: 20 42 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f   BTREE_TEXT_ENCO
6e40: 44 49 4e 47 2c 20 72 65 67 33 29 3b 0a 20 20 20  DING, reg3);.   
6e50: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
6e60: 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20  Here(v, j1);..  
6e70: 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63    /* This just c
6e80: 72 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68  reates a place-h
6e90: 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20  older record in 
6ea0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
6eb0: 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  r table..    ** 
6ec0: 54 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74  The record creat
6ed0: 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  ed does not cont
6ee0: 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74  ain anything yet
6ef0: 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65  .  It will be re
6f00: 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79  placed.    ** by
6f10: 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20   the real entry 
6f20: 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  in code generate
6f30: 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54  d at sqlite3EndT
6f40: 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  able()..    **. 
6f50: 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20     ** The rowid 
6f60: 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72  for the new entr
6f70: 79 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  y is left in reg
6f80: 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65  ister pParse->re
6f90: 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54  gRowid..    ** T
6fa0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
6fb0: 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ber of the new t
6fc0: 61 62 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20  able is left in 
6fd0: 72 65 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52  reg pParse->regR
6fe0: 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  oot..    ** The 
6ff0: 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70  rowid and root p
7000: 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65  age number value
7010: 73 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  s are needed by 
7020: 74 68 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20  the code that.  
7030: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54    ** sqlite3EndT
7040: 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61  able will genera
7050: 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21  te..    */.#if !
7060: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7070: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
7080: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7090: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
70a0: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 7c      if( isView |
70b0: 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20  | isVirtual ){. 
70c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
70d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
70e0: 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a  eger, 0, reg2);.
70f0: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
7100: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c  .    {.      sql
7110: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7120: 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65  , OP_CreateTable
7130: 2c 20 69 44 62 2c 20 72 65 67 32 29 3b 0a 20 20  , iDb, reg2);.  
7140: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
7150: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70  penMasterTable(p
7160: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
7170: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7180: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
7190: 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20  d, 0, reg1);.   
71a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
71b0: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
71c0: 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c  , reg3);.    sql
71d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
71e0: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20  , OP_Insert, 0, 
71f0: 72 65 67 33 2c 20 72 65 67 31 29 3b 0a 20 20 20  reg3, reg1);.   
7200: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7210: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
7220: 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69  PPEND);.    sqli
7230: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
7240: 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a   OP_Close);.  }.
7250: 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f  .  /* Normal (no
7260: 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e  n-error) return.
7270: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20   */.  return;.. 
7280: 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
7290: 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20  occurs, we jump 
72a0: 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61  here */.begin_ta
72b0: 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c  ble_error:.  sql
72c0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
72d0: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Name);.  return;
72e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d  .}../*.** This m
72f0: 61 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20  acro is used to 
7300: 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 72 69  compare two stri
7310: 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d 69 6e  ngs in a case-in
7320: 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65 72  sensitive manner
7330: 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69 67 68  ..** It is sligh
7340: 74 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e 20  tly faster than 
7350: 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 53  calling sqlite3S
7360: 74 72 49 43 6d 70 28 29 20 64 69 72 65 63 74 6c  trICmp() directl
7370: 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63  y, but.** produc
7380: 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a  es larger code..
7390: 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54  **.** WARNING: T
73a0: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74  his macro is not
73b0: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
73c0: 20 74 68 65 20 73 74 72 63 6d 70 28 29 20 66 61   the strcmp() fa
73d0: 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75  mily. It.** retu
73e0: 72 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 20  rns true if the 
73f0: 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72 65 20  two strings are 
7400: 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69 73 65  equal, otherwise
7410: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69   false..*/.#defi
7420: 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20 79 29  ne STRICMP(x, y)
7430: 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72   (\.sqlite3Upper
7440: 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e  ToLower[*(unsign
7450: 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d  ed char *)(x)]==
7460: 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70 70 65     \.sqlite3Uppe
7470: 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67  rToLower[*(unsig
7480: 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29 5d 20  ned char *)(y)] 
7490: 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74 65 33      \.&& sqlite3
74a0: 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c 28 79  StrICmp((x)+1,(y
74b0: 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a  )+1)==0 )../*.**
74c0: 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d   Add a new colum
74d0: 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  n to the table c
74e0: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
74f0: 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a  onstructed..**.*
7500: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
7510: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
7520: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f  once for each co
7530: 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  lumn declaration
7540: 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20  .** in a CREATE 
7550: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
7560: 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
7570: 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65  ble() gets calle
7580: 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65  d.** first to ge
7590: 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20  t things going. 
75a0: 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   Then this routi
75b0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
75c0: 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e   each.** column.
75d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
75e0: 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20  AddColumn(Parse 
75f0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
7600: 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  pName){.  Table 
7610: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
7620: 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e  har *z;.  Column
7630: 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65   *pCol;.  sqlite
7640: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
7650: 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70  db;.  if( (p = p
7660: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
7670: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23  )==0 ) return;.#
7680: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
7690: 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 6e 43  LUMN.  if( p->nC
76a0: 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  ol+1>db->aLimit[
76b0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
76c0: 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  UMN] ){.    sqli
76d0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
76e0: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
76f0: 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d  lumns on %s", p-
7700: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
7710: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
7720: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d    z = sqlite3Nam
7730: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
7740: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  Name);.  if( z==
7750: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
7760: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
7770: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
7780: 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43  STRICMP(z, p->aC
7790: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a  ol[i].zName) ){.
77a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
77b0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64  orMsg(pParse, "d
77c0: 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20  uplicate column 
77d0: 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20  name: %s", z);. 
77e0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
77f0: 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20  ee(db, z);.     
7800: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
7810: 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f   }.  if( (p->nCo
7820: 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20  l & 0x7)==0 ){. 
7830: 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b     Column *aNew;
7840: 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69  .    aNew = sqli
7850: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
7860: 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c  p->aCol,(p->nCol
7870: 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43  +8)*sizeof(p->aC
7880: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  ol[0]));.    if(
7890: 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
78a0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
78b0: 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65  db, z);.      re
78c0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
78d0: 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a  p->aCol = aNew;.
78e0: 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d    }.  pCol = &p-
78f0: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a  >aCol[p->nCol];.
7900: 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30    memset(pCol, 0
7910: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  , sizeof(p->aCol
7920: 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a  [0]));.  pCol->z
7930: 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a  Name = z;. .  /*
7940: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
7950: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
7960: 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65  columns have the
7970: 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74   default affinit
7980: 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49  y.  ** 'NONE'. I
7990: 66 20 74 68 65 72 65 20 69 73 20 61 20 74 79 70  f there is a typ
79a0: 65 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65  e specified, the
79b0: 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  n sqlite3AddColu
79c0: 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20  mnType() will.  
79d0: 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78  ** be called nex
79e0: 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61  t to set pCol->a
79f0: 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c  ffinity correctl
7a00: 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e  y..  */.  pCol->
7a10: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
7a20: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d  E_AFF_NONE;.  p-
7a30: 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nCol++;.}../*.*
7a40: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
7a50: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
7a60: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
7a70: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
7a80: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
7a90: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
7aa0: 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22  t.  A "NOT NULL"
7ab0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a   constraint has.
7ac0: 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20  ** been seen on 
7ad0: 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20  a column.  This 
7ae0: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
7af0: 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e   notNull flag on
7b00: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  .** the column c
7b10: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
7b20: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  onstruction..*/.
7b30: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e  void sqlite3AddN
7b40: 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50  otNull(Parse *pP
7b50: 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f  arse, int onErro
7b60: 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  r){.  Table *p;.
7b70: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
7b80: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
7b90: 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e  ==0 || NEVER(p->
7ba0: 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74 75 72 6e  nCol<1) ) return
7bb0: 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e  ;.  p->aCol[p->n
7bc0: 43 6f 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d  Col-1].notNull =
7bd0: 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 7d 0a   (u8)onError;.}.
7be0: 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20  ./*.** Scan the 
7bf0: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65  column type name
7c00: 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e   zType (length n
7c10: 54 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e  Type) and return
7c20: 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   the.** associat
7c30: 65 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65  ed affinity type
7c40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
7c50: 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65  tine does a case
7c60: 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61  -independent sea
7c70: 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72  rch of zType for
7c80: 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69   the .** substri
7c90: 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ngs in the follo
7ca0: 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f  wing table. If o
7cb0: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
7cc0: 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64  ings is.** found
7cd0: 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
7ce0: 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20  ing affinity is 
7cf0: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79  returned. If zTy
7d00: 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d  pe contains.** m
7d10: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20  ore than one of 
7d20: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20  the substrings, 
7d30: 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74  entries toward t
7d40: 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68  he top of .** th
7d50: 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69  e table take pri
7d60: 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70  ority. For examp
7d70: 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20  le, if zType is 
7d80: 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53  'BLOBINT', .** S
7d90: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
7da0: 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  R is returned..*
7db0: 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20  *.** Substring  
7dc0: 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a     | Affinity.**
7dd0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
7de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7df0: 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20  -.** 'INT'      
7e00: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
7e10: 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52  INTEGER.** 'CHAR
7e20: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
7e30: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43  E_AFF_TEXT.** 'C
7e40: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
7e50: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
7e60: 20 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c   'TEXT'        |
7e70: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
7e80: 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20  .** 'BLOB'      
7e90: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e    | SQLITE_AFF_N
7ea0: 4f 4e 45 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20  ONE.** 'REAL'   
7eb0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
7ec0: 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27  F_REAL.** 'FLOA'
7ed0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
7ee0: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f  _AFF_REAL.** 'DO
7ef0: 55 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  UB'        | SQL
7f00: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a  ITE_AFF_REAL.**.
7f10: 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  ** If none of th
7f20: 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20  e substrings in 
7f30: 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20  the above table 
7f40: 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51  are found,.** SQ
7f50: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
7f60: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
7f70: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66  .char sqlite3Aff
7f80: 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20  inityType(const 
7f90: 63 68 61 72 20 2a 7a 49 6e 29 7b 0a 20 20 75 33  char *zIn){.  u3
7fa0: 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  2 h = 0;.  char 
7fb0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
7fc0: 5f 4e 55 4d 45 52 49 43 3b 0a 0a 20 20 69 66 28  _NUMERIC;..  if(
7fd0: 20 7a 49 6e 20 29 20 77 68 69 6c 65 28 20 7a 49   zIn ) while( zI
7fe0: 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20  n[0] ){.    h = 
7ff0: 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33  (h<<8) + sqlite3
8000: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a  UpperToLower[(*z
8010: 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a  In)&0xff];.    z
8020: 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d  In++;.    if( h=
8030: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27  =(('c'<<24)+('h'
8040: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
8050: 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20  r') ){          
8060: 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20     /* CHAR */.  
8070: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
8080: 5f 41 46 46 5f 54 45 58 54 3b 20 0a 20 20 20 20  _AFF_TEXT; .    
8090: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
80a0: 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  c'<<24)+('l'<<16
80b0: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20  )+('o'<<8)+'b') 
80c0: 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42  ){       /* CLOB
80d0: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
80e0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
80f0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
8100: 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65  ==(('t'<<24)+('e
8110: 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b  '<<16)+('x'<<8)+
8120: 27 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a  't') ){       /*
8130: 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61   TEXT */.      a
8140: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
8150: 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20  TEXT;.    }else 
8160: 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34  if( h==(('b'<<24
8170: 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27  )+('l'<<16)+('o'
8180: 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20  <<8)+'b')       
8190: 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20     /* BLOB */.  
81a0: 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53        && (aff==S
81b0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
81c0: 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  C || aff==SQLITE
81d0: 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20  _AFF_REAL) ){.  
81e0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
81f0: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66 6e 64  _AFF_NONE;.#ifnd
8200: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
8210: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
8220: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
8230: 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c  ('r'<<24)+('e'<<
8240: 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27  16)+('a'<<8)+'l'
8250: 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45  )          /* RE
8260: 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26  AL */.        &&
8270: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
8280: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
8290: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
82a0: 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c  FF_REAL;.    }el
82b0: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c  se if( h==(('f'<
82c0: 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28  <24)+('l'<<16)+(
82d0: 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20  'o'<<8)+'a')    
82e0: 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f        /* FLOA */
82f0: 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d  .        && aff=
8300: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
8310: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66  RIC ){.      aff
8320: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   = SQLITE_AFF_RE
8330: 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  AL;.    }else if
8340: 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b  ( h==(('d'<<24)+
8350: 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c  ('o'<<16)+('u'<<
8360: 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20  8)+'b')         
8370: 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20   /* DOUB */.    
8380: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
8390: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
83a0: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
83b0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23  LITE_AFF_REAL;.#
83c0: 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20  endif.    }else 
83d0: 69 66 28 20 28 68 26 30 78 30 30 46 46 46 46 46  if( (h&0x00FFFFF
83e0: 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28  F)==(('i'<<16)+(
83f0: 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20  'n'<<8)+'t') ){ 
8400: 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20     /* INT */.   
8410: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8420: 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  AFF_INTEGER;.   
8430: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8440: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 66    }..  return af
8450: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  f;.}../*.** This
8460: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
8470: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
8480: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
8490: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
84a0: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
84b0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  E statement.  Th
84c0: 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69  e pFirst token i
84d0: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74  s the first.** t
84e0: 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75  oken in the sequ
84f0: 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74  ence of tokens t
8500: 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65  hat describe the
8510: 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20   type of the.** 
8520: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
8530: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
8540: 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20  ion.   pLast is 
8550: 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a  the last token.*
8560: 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63  * in the sequenc
8570: 65 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e 66  e.  Use this inf
8580: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73  ormation to cons
8590: 74 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a  truct a string.*
85a0: 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  * that contains 
85b0: 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20  the typename of 
85c0: 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73  the column and s
85d0: 74 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e 67  tore that string
85e0: 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f  .** in zType..*/
85f0: 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64   .void sqlite3Ad
8600: 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73  dColumnType(Pars
8610: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
8620: 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c   *pType){.  Tabl
8630: 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  e *p;.  Column *
8640: 70 43 6f 6c 3b 0a 0a 20 20 70 20 3d 20 70 50 61  pCol;..  p = pPa
8650: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
8660: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45    if( p==0 || NE
8670: 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29  VER(p->nCol<1) )
8680: 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20   return;.  pCol 
8690: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43  = &p->aCol[p->nC
86a0: 6f 6c 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ol-1];.  assert(
86b0: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20   pCol->zType==0 
86c0: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  );.  pCol->zType
86d0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
86e0: 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
86f0: 64 62 2c 20 70 54 79 70 65 29 3b 0a 20 20 70 43  db, pType);.  pC
8700: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
8710: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
8720: 70 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b  pe(pCol->zType);
8730: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78  .}../*.** The ex
8740: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
8750: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
8760: 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
8770: 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e  tly added column
8780: 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65  .** of the table
8790: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
87a0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
87b0: 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c  *.** Default val
87c0: 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d  ue expressions m
87d0: 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e  ust be constant.
87e0: 20 20 52 61 69 73 65 20 61 6e 20 65 78 63 65 70    Raise an excep
87f0: 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20  tion if this.** 
8800: 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e  is not the case.
8810: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
8820: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
8830: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
8840: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
8850: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
8860: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
8870: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
8880: 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c  sqlite3AddDefaul
8890: 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50  tValue(Parse *pP
88a0: 61 72 73 65 2c 20 45 78 70 72 53 70 61 6e 20 2a  arse, ExprSpan *
88b0: 70 53 70 61 6e 29 7b 0a 20 20 54 61 62 6c 65 20  pSpan){.  Table 
88c0: 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *p;.  Column *pC
88d0: 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ol;.  sqlite3 *d
88e0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
88f0: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
8900: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
8910: 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20  !=0 ){.    pCol 
8920: 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e  = &(p->aCol[p->n
8930: 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28  Col-1]);.    if(
8940: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
8950: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
8960: 6e 28 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 20  n(pSpan->pExpr) 
8970: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8980: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8990: 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20   "default value 
89a0: 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69  of column [%s] i
89b0: 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c  s not constant",
89c0: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d  .          pCol-
89d0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  >zName);.    }el
89e0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63  se{.      /* A c
89f0: 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69 73 20  opy of pExpr is 
8a00: 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  used instead of 
8a10: 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73  the original, as
8a20: 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a   pExpr contains.
8a30: 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20        ** tokens 
8a40: 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f  that point to vo
8a50: 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 20 54  latile memory. T
8a60: 68 65 20 27 73 70 61 6e 27 20 6f 66 20 74 68 65  he 'span' of the
8a70: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
8a80: 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
8a90: 20 62 79 20 70 72 61 67 6d 61 20 74 61 62 6c 65   by pragma table
8aa0: 5f 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a  _info..      */.
8ab0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
8ac0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  rDelete(db, pCol
8ad0: 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->pDflt);.      
8ae0: 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71  pCol->pDflt = sq
8af0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
8b00: 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c 20 45   pSpan->pExpr, E
8b10: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
8b20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
8b30: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44  ree(db, pCol->zD
8b40: 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c  flt);.      pCol
8b50: 2d 3e 7a 44 66 6c 74 20 3d 20 73 71 6c 69 74 65  ->zDflt = sqlite
8b60: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28  3DbStrNDup(db, (
8b70: 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74  char*)pSpan->zSt
8b80: 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  art,.           
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ba0: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
8bb0: 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53  pSpan->zEnd - pS
8bc0: 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20  pan->zStart));. 
8bd0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
8be0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
8bf0: 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 3b 0a   pSpan->pExpr);.
8c00: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61  }../*.** Designa
8c10: 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  te the PRIMARY K
8c20: 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  EY for the table
8c30: 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  .  pList is a li
8c40: 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20  st of names .** 
8c50: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
8c60: 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79  form the primary
8c70: 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20   key.  If pList 
8c80: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
8c90: 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74  e.** most recent
8ca0: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20  ly added column 
8cb0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
8cc0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
8cd0: 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63  .**.** A table c
8ce0: 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  an have at most 
8cf0: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  one primary key.
8d00: 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61    If the table a
8d10: 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20  lready has.** a 
8d20: 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64  primary key (and
8d30: 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63   this is the sec
8d40: 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29  ond primary key)
8d50: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a   then create an.
8d60: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
8d70: 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  If the PRIMARY K
8d80: 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c  EY is on a singl
8d90: 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64  e column whose d
8da0: 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47  atatype is INTEG
8db0: 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77  ER,.** then we w
8dc0: 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74  ill try to use t
8dd0: 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  hat column as th
8de0: 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68  e rowid.  Set th
8df0: 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a  e Table.iPKey.**
8e00: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61   field of the ta
8e10: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
8e20: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65  uction to be the
8e30: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
8e40: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
8e50: 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61   KEY column.  Ta
8e60: 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74  ble.iPKey is set
8e70: 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20   to -1 if there 
8e80: 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52  is.** no INTEGER
8e90: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a   PRIMARY KEY..**
8ea0: 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69  .** If the key i
8eb0: 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52  s not an INTEGER
8ec0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68   PRIMARY KEY, th
8ed0: 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  en create a uniq
8ee0: 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20  ue.** index for 
8ef0: 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64  the key.  No ind
8f00: 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f  ex is created fo
8f10: 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  r INTEGER PRIMAR
8f20: 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20  Y KEYs..*/.void 
8f30: 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72  sqlite3AddPrimar
8f40: 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  yKey(.  Parse *p
8f50: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
8f60: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
8f70: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
8f80: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66  t,  /* List of f
8f90: 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65  ield names to be
8fa0: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
8fb0: 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
8fc0: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
8fd0: 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20  th a uniqueness 
8fe0: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e  conflict */.  in
8ff0: 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20  t autoInc,      
9000: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41  /* True if the A
9010: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79  UTOINCREMENT key
9020: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
9030: 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
9040: 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  er     /* SQLITE
9050: 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54  _SO_ASC or SQLIT
9060: 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a  E_SO_DESC */.){.
9070: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
9080: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
9090: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65  e;.  char *zType
90a0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c   = 0;.  int iCol
90b0: 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20   = -1, i;.  if( 
90c0: 70 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45  pTab==0 || IN_DE
90d0: 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74  CLARE_VTAB ) got
90e0: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
90f0: 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  it;.  if( pTab->
9100: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61  tabFlags & TF_Ha
9110: 73 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20  sPrimaryKey ){. 
9120: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
9130: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
9140: 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20    "table \"%s\" 
9150: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
9160: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20  e primary key", 
9170: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
9180: 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b    goto primary_k
9190: 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70  ey_exit;.  }.  p
91a0: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
91b0: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
91c0: 79 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  y;.  if( pList==
91d0: 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  0 ){.    iCol = 
91e0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a  pTab->nCol - 1;.
91f0: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
9200: 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d  Col].isPrimKey =
9210: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
9220: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
9230: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
9240: 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30        for(iCol=0
9250: 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ; iCol<pTab->nCo
9260: 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
9270: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
9280: 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
9290: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i].zName, pTab->
92a0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
92b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
92c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
92d0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
92e0: 20 69 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e   if( iCol<pTab->
92f0: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
9300: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
9310: 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a  .isPrimKey = 1;.
9320: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9330: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78    if( pList->nEx
9340: 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31  pr>1 ) iCol = -1
9350: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  ;.  }.  if( iCol
9360: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
9370: 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54  ->nCol ){.    zT
9380: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
9390: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
93a0: 7d 0a 20 20 69 66 28 20 7a 54 79 70 65 20 26 26  }.  if( zType &&
93b0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
93c0: 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22  zType, "INTEGER"
93d0: 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20  )==0.        && 
93e0: 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54  sortOrder==SQLIT
93f0: 45 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20  E_SO_ASC ){.    
9400: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43  pTab->iPKey = iC
9410: 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65  ol;.    pTab->ke
9420: 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72  yConf = (u8)onEr
9430: 72 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ror;.    assert(
9440: 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61   autoInc==0 || a
9450: 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20  utoInc==1 );.   
9460: 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
9470: 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75  |= autoInc*TF_Au
9480: 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 7d  toincrement;.  }
9490: 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63  else if( autoInc
94a0: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
94b0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
94c0: 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65  EMENT.    sqlite
94d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
94e0: 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  , "AUTOINCREMENT
94f0: 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64   is only allowed
9500: 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20   on an ".       
9510: 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59  "INTEGER PRIMARY
9520: 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20   KEY");.#endif. 
9530: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65   }else{.    Inde
9540: 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71  x *p;.    p = sq
9550: 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
9560: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30  (pParse, 0, 0, 0
9570: 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72  , pList, onError
9580: 2c 20 30 2c 20 30 2c 20 73 6f 72 74 4f 72 64 65  , 0, 0, sortOrde
9590: 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 0);.    if( p
95a0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74   ){.      p->aut
95b0: 6f 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20 20 20  oIndex = 2;.    
95c0: 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b  }.    pList = 0;
95d0: 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65  .  }..primary_ke
95e0: 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65  y_exit:.  sqlite
95f0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
9600: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73  pParse->db, pLis
9610: 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  t);.  return;.}.
9620: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
9630: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
9640: 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  t to the table c
9650: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
9660: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  onstruction..*/.
9670: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
9680: 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a  heckConstraint(.
9690: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
96a0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
96b0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
96c0: 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a   *pCheckExpr  /*
96d0: 20 54 68 65 20 63 68 65 63 6b 20 65 78 70 72 65   The check expre
96e0: 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71  ssion */.){.  sq
96f0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
9700: 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20  se->db;.#ifndef 
9710: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
9720: 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  K.  Table *pTab 
9730: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
9740: 62 6c 65 3b 0a 20 20 69 66 28 20 70 54 61 62 20  ble;.  if( pTab 
9750: 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56  && !IN_DECLARE_V
9760: 54 41 42 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  TAB ){.    pTab-
9770: 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65  >pCheck = sqlite
9780: 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 54 61  3ExprAnd(db, pTa
9790: 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68 65 63  b->pCheck, pChec
97a0: 6b 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65 0a  kExpr);.  }else.
97b0: 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73  #endif.  {.    s
97c0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
97d0: 28 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29  (db, pCheckExpr)
97e0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
97f0: 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  et the collation
9800: 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65   function of the
9810: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70   most recently p
9820: 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75  arsed table colu
9830: 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c  mn.** to the Col
9840: 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76  lSeq given..*/.v
9850: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
9860: 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20  llateType(Parse 
9870: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
9880: 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65  pToken){.  Table
9890: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
98a0: 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20  char *zColl;    
98b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71            /* Deq
98c0: 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f  uoted name of co
98d0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
98e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
98f0: 62 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70  b;..  if( (p = p
9900: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
9910: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
9920: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
9930: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
9940: 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  b;.  zColl = sql
9950: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
9960: 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  n(db, pToken);. 
9970: 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65   if( !zColl ) re
9980: 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c  turn;..  if( sql
9990: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
99a0: 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  q(pParse, zColl)
99b0: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
99c0: 49 64 78 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c  Idx;.    p->aCol
99d0: 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c  [i].zColl = zCol
99e0: 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  l;.  .    /* If 
99f0: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65  the column is de
9a00: 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65  clared as "<name
9a10: 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f  > PRIMARY KEY CO
9a20: 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20  LLATE <type>",. 
9a30: 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e     ** then an in
9a40: 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65  dex may have bee
9a50: 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69  n created on thi
9a60: 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20  s column before 
9a70: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61  the.    ** colla
9a80: 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64  tion type was ad
9a90: 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69  ded. Correct thi
9aa0: 73 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63  s if it is the c
9ab0: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
9ac0: 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64  for(pIdx=p->pInd
9ad0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
9ae0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
9af0: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
9b00: 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20  >nColumn==1 );. 
9b10: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
9b20: 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b  iColumn[0]==i ){
9b30: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
9b40: 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43  zColl[0] = p->aC
9b50: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[i].zColl;.   
9b60: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
9b70: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  se{.    sqlite3D
9b80: 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29  bFree(db, zColl)
9b90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
9ba0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
9bb0: 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  urns the collati
9bc0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
9bd0: 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20  database native 
9be0: 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67  text.** encoding
9bf0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
9c00: 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c  he string zName,
9c10: 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a   length nName..*
9c20: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75  *.** If the requ
9c30: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ested collation 
9c40: 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20  sequence is not 
9c50: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f  available, or no
9c60: 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69  t available.** i
9c70: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  n the database n
9c80: 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20  ative encoding, 
9c90: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
9ca0: 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64  ctory is invoked
9cb0: 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69   to.** request i
9cc0: 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74  t. If the collat
9cd0: 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73  ion factory does
9ce0: 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68   not supply such
9cf0: 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20   a sequence,.** 
9d00: 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65  and the sequence
9d10: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e   is available in
9d20: 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e   another text en
9d30: 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61  coding, then tha
9d40: 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  t is.** returned
9d50: 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
9d60: 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f  If no versions o
9d70: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
9d80: 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65  collations seque
9d90: 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c  nce are availabl
9da0: 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72  e, or.** another
9db0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
9dc0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
9dd0: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  and an error mes
9de0: 73 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74  sage written int
9df0: 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a  o.** pParse..**.
9e00: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9e10: 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
9e20: 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43  und sqlite3FindC
9e30: 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20  ollSeq().  This 
9e40: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b  routine.** invok
9e50: 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  es the collation
9e60: 20 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20   factory if the 
9e70: 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  named collation 
9e80: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a  cannot be found.
9e90: 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73  ** and generates
9ea0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
9eb0: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
9ec0: 6f 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  o: sqlite3FindCo
9ed0: 6c 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33  llSeq(), sqlite3
9ee0: 47 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a  GetCollSeq().*/.
9ef0: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
9f00: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61  LocateCollSeq(Pa
9f10: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
9f20: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
9f30: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
9f40: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75   pParse->db;.  u
9f50: 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  8 enc = ENC(db);
9f60: 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d  .  u8 initbusy =
9f70: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a   db->init.busy;.
9f80: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
9f90: 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  ;..  pColl = sql
9fa0: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
9fb0: 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20  db, enc, zName, 
9fc0: 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28  initbusy);.  if(
9fd0: 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21   !initbusy && (!
9fe0: 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d  pColl || !pColl-
9ff0: 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43  >xCmp) ){.    pC
a000: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
a010: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c  CollSeq(db, enc,
a020: 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a   pColl, zName);.
a030: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
a040: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
a050: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
a060: 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69  "no such collati
a070: 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25 73 22  on sequence: %s"
a080: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , zName);.    }.
a090: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43    }..  return pC
a0a0: 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  oll;.}.../*.** G
a0b0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
a0c0: 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74  t will increment
a0d0: 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
a0e0: 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63  ie..**.** The sc
a0f0: 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75  hema cookie is u
a100: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
a110: 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   when the schema
a120: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61   for the.** data
a130: 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41  base changes.  A
a140: 66 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61  fter each schema
a150: 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f   change, the coo
a160: 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61  kie value.** cha
a170: 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72  nges.  When a pr
a180: 6f 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64  ocess first read
a190: 73 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20  s the schema it 
a1a0: 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63  records the.** c
a1b0: 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74  ookie.  Thereaft
a1c0: 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20  er, whenever it 
a1d0: 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74  goes to access t
a1e0: 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20  he database,.** 
a1f0: 69 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f  it checks the co
a200: 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  okie to make sur
a210: 65 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73  e the schema has
a220: 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20   not changed.** 
a230: 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73  since it was las
a240: 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  t read..**.** Th
a250: 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63  is plan is not c
a260: 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74  ompletely bullet
a270: 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70  -proof.  It is p
a280: 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74  ossible for.** t
a290: 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61  he schema to cha
a2a0: 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  nge multiple tim
a2b0: 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63  es and for the c
a2c0: 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73  ookie to be.** s
a2d0: 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72  et back to prior
a2e0: 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68   value.  But sch
a2f0: 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20  ema changes are 
a300: 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e  infrequent.** an
a310: 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  d the probabilit
a320: 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65  y of hitting the
a330: 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c   same cookie val
a340: 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20  ue is only.** 1 
a350: 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20  chance in 2^32. 
a360: 20 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65   So we're safe e
a370: 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73  nough..*/.void s
a380: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
a390: 69 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ie(Parse *pParse
a3a0: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e  , int iDb){.  in
a3b0: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
a3c0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
a3d0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
a3e0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
a3f0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
a400: 2d 3e 70 56 64 62 65 3b 0a 20 20 73 71 6c 69 74  ->pVdbe;.  sqlit
a410: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a420: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e  OP_Integer, db->
a430: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
a440: 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b  ->schema_cookie+
a450: 31 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  1, r1);.  sqlite
a460: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
a470: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
a480: 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56  , BTREE_SCHEMA_V
a490: 45 52 53 49 4f 4e 2c 20 72 31 29 3b 0a 20 20 73  ERSION, r1);.  s
a4a0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
a4b0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
a4c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75  ;.}../*.** Measu
a4d0: 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  re the number of
a4e0: 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64   characters need
a4f0: 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65  ed to output the
a500: 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69   given.** identi
a510: 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65  fier.  The numbe
a520: 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75  r returned inclu
a530: 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75  des any quotes u
a540: 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20  sed.** but does 
a550: 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20  not include the 
a560: 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e  null terminator.
a570: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d  .**.** The estim
a580: 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74  ate is conservat
a590: 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62  ive.  It might b
a5a0: 65 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68  e larger that wh
a5b0: 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  at is.** really 
a5c0: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
a5d0: 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74  c int identLengt
a5e0: 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  h(const char *z)
a5f0: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72  {.  int n;.  for
a600: 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a  (n=0; *z; n++, z
a610: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  ++){.    if( *z=
a620: 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20  ='"' ){ n++; }. 
a630: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20   }.  return n + 
a640: 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  2;.}../*.** The 
a650: 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20  first parameter 
a660: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
a670: 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  an output buffer
a680: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  . The second .**
a690: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
a6a0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
a6b0: 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61  teger that conta
a6c0: 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20 61  ins the offset a
a6d0: 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72  t.** which to wr
a6e0: 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ite into the out
a6f0: 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 69 73  put buffer. This
a700: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73   function copies
a710: 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d   the.** nul-term
a720: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f  inated string po
a730: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
a740: 74 68 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c  third parameter,
a750: 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a   zSignedIdent,.*
a760: 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  * to the specifi
a770: 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  ed offset in the
a780: 20 62 75 66 66 65 72 20 61 6e 64 20 75 70 64 61   buffer and upda
a790: 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66  tes *pIdx to ref
a7a0: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  er.** to the fir
a7b0: 73 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68  st byte after th
a7c0: 65 20 6c 61 73 74 20 62 79 74 65 20 77 72 69 74  e last byte writ
a7d0: 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72  ten before retur
a7e0: 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  ning..** .** If 
a7f0: 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e  the string zSign
a800: 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73  edIdent consists
a810: 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70   entirely of alp
a820: 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68  ha-numeric.** ch
a830: 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e  aracters, does n
a840: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
a850: 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74  digit and is not
a860: 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c   an SQL keyword,
a870: 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63  .** then it is c
a880: 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74  opied to the out
a890: 70 75 74 20 62 75 66 66 65 72 20 65 78 61 63 74  put buffer exact
a8a0: 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68  ly as it is. Oth
a8b0: 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73  erwise,.** it is
a8c0: 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f   quoted using do
a8d0: 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a  uble-quotes..*/.
a8e0: 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e  static void iden
a8f0: 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e  tPut(char *z, in
a900: 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a  t *pIdx, char *z
a910: 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20  SignedIdent){.  
a920: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
a930: 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65  Ident = (unsigne
a940: 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49  d char*)zSignedI
a950: 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  dent;.  int i, j
a960: 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69  , needQuote;.  i
a970: 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72   = *pIdx;..  for
a980: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
a990: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   j++){.    if( !
a9a0: 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a  sqlite3Isalnum(z
a9b0: 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64  Ident[j]) && zId
a9c0: 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72  ent[j]!='_' ) br
a9d0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51  eak;.  }.  needQ
a9e0: 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73  uote = sqlite3Is
a9f0: 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29  digit(zIdent[0])
aa00: 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f   || sqlite3Keywo
aa10: 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a  rdCode(zIdent, j
aa20: 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20  )!=TK_ID;.  if( 
aa30: 21 6e 65 65 64 51 75 6f 74 65 20 29 7b 0a 20 20  !needQuote ){.  
aa40: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 7a 49    needQuote = zI
aa50: 64 65 6e 74 5b 6a 5d 3b 0a 20 20 7d 0a 0a 20 20  dent[j];.  }..  
aa60: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
aa70: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
aa80: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
aa90: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b  j]; j++){.    z[
aaa0: 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d  i++] = zIdent[j]
aab0: 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74  ;.    if( zIdent
aac0: 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b  [j]=='"' ) z[i++
aad0: 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69  ] = '"';.  }.  i
aae0: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
aaf0: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a  [i++] = '"';.  z
ab00: 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78  [i] = 0;.  *pIdx
ab10: 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = i;.}../*.** G
ab20: 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45  enerate a CREATE
ab30: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
ab40: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
ab50: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61   the given.** ta
ab60: 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20  ble.  Memory to 
ab70: 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66  hold the text of
ab80: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
ab90: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  s obtained.** fr
aba0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
abb0: 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
abc0: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
abd0: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
abe0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65  static char *cre
abf0: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c  ateTableStmt(sql
ac00: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
ac10: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c  *p){.  int i, k,
ac20: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d   n;.  char *zStm
ac30: 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c  t;.  char *zSep,
ac40: 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a   *zSep2, *zEnd;.
ac50: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
ac60: 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70    n = 0;.  for(p
ac70: 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69  Col = p->aCol, i
ac80: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
ac90: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
aca0: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
acb0: 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b  h(pCol->zName) +
acc0: 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69   5;.  }.  n += i
acd0: 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e  dentLength(p->zN
ace0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30  ame);.  if( n<50
acf0: 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d 20   ){ .    zSep = 
ad00: 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20  "";.    zSep2 = 
ad10: 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20  ",";.    zEnd = 
ad20: 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ")";.  }else{.  
ad30: 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b    zSep = "\n  ";
ad40: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c  .    zSep2 = ",\
ad50: 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d  n  ";.    zEnd =
ad60: 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20   "\n)";.  }.  n 
ad70: 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f  += 35 + 6*p->nCo
ad80: 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c  l;.  zStmt = sql
ad90: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 20 29 3b  ite3Malloc( n );
ada0: 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20  .  if( zStmt==0 
adb0: 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  ){.    db->mallo
adc0: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
add0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
ade0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
adf0: 66 28 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45  f(n, zStmt, "CRE
ae00: 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20  ATE TABLE ");.  
ae10: 6b 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  k = sqlite3Strle
ae20: 6e 33 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64  n30(zStmt);.  id
ae30: 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b  entPut(zStmt, &k
ae40: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a  , p->zName);.  z
ae50: 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b  Stmt[k++] = '(';
ae60: 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61  .  for(pCol=p->a
ae70: 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e  Col, i=0; i<p->n
ae80: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
ae90: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ){.    static co
aea0: 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  nst char * const
aeb0: 20 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20 20   azType[] = {.  
aec0: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
aed0: 41 46 46 5f 54 45 58 54 20 20 20 20 2a 2f 20 22  AFF_TEXT    */ "
aee0: 20 54 45 58 54 22 2c 0a 20 20 20 20 20 20 20 20   TEXT",.        
aef0: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  /* SQLITE_AFF_NO
af00: 4e 45 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20  NE    */ "",.   
af10: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
af20: 46 46 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22 20  FF_NUMERIC */ " 
af30: 4e 55 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  NUM",.        /*
af40: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
af50: 47 45 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a 20  GER */ " INT",. 
af60: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
af70: 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f 20  _AFF_REAL    */ 
af80: 22 20 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a 20  " REAL".    };. 
af90: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
afa0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
afb0: 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e;..    sqlite3_
afc0: 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a  snprintf(n-k, &z
afd0: 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a  Stmt[k], zSep);.
afe0: 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33      k += sqlite3
aff0: 53 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74 5b  Strlen30(&zStmt[
b000: 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20  k]);.    zSep = 
b010: 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74  zSep2;.    ident
b020: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
b030: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
b040: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61   assert( pCol->a
b050: 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41  ffinity-SQLITE_A
b060: 46 46 5f 54 45 58 54 20 3e 3d 20 30 20 29 3b 0a  FF_TEXT >= 0 );.
b070: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
b080: 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54  ->affinity-SQLIT
b090: 45 5f 41 46 46 5f 54 45 58 54 20 3c 20 73 69 7a  E_AFF_TEXT < siz
b0a0: 65 6f 66 28 61 7a 54 79 70 65 29 2f 73 69 7a 65  eof(azType)/size
b0b0: 6f 66 28 61 7a 54 79 70 65 5b 30 5d 29 20 29 3b  of(azType[0]) );
b0c0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
b0d0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
b0e0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
b0f0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
b100: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
b110: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
b120: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
b130: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
b140: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
b150: 52 49 43 20 29 3b 0a 20 20 20 20 74 65 73 74 63  RIC );.    testc
b160: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
b170: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
b180: 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 74  INTEGER );.    t
b190: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
b1a0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
b1b0: 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20 20 20  AFF_REAL );.    
b1c0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 61 7a 54  .    zType = azT
b1d0: 79 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  ype[pCol->affini
b1e0: 74 79 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty - SQLITE_AFF_
b1f0: 54 45 58 54 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d  TEXT];.    len =
b200: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
b210: 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 61 73 73  (zType);.    ass
b220: 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ert( pCol->affin
b230: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
b240: 4e 4f 4e 45 20 0a 20 20 20 20 20 20 20 20 20 20  NONE .          
b250: 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66 69 6e    || pCol->affin
b260: 69 74 79 3d 3d 73 71 6c 69 74 65 33 41 66 66 69  ity==sqlite3Affi
b270: 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65 29 20  nityType(zType) 
b280: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
b290: 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20  Stmt[k], zType, 
b2a0: 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c  len);.    k += l
b2b0: 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  en;.    assert( 
b2c0: 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71  k<=n );.  }.  sq
b2d0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
b2e0: 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22  -k, &zStmt[k], "
b2f0: 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65  %s", zEnd);.  re
b300: 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f  turn zStmt;.}../
b310: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b320: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  e is called to r
b330: 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20  eport the final 
b340: 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ")" that termina
b350: 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20  tes.** a CREATE 
b360: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
b370: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
b380: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
b390: 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75  other action rou
b3a0: 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20  tines have been 
b3b0: 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61  building.** is a
b3c0: 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65  dded to the inte
b3d0: 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73  rnal hash tables
b3e0: 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72  , assuming no er
b3f0: 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63  rors have.** occ
b400: 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  urred..**.** An 
b410: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61  entry for the ta
b420: 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74  ble is made in t
b430: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
b440: 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a  on disk, unless.
b450: 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  ** this is a tem
b460: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20  porary table or 
b470: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
b480: 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74  .  When db->init
b490: 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d  .busy==1.** it m
b4a0: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
b4b0: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
b4c0: 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61  aster table beca
b4d0: 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63  use we just.** c
b4e0: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20  onnected to the 
b4f0: 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61  database or beca
b500: 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  use the sqlite_m
b510: 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a  aster table has.
b520: 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e  ** recently chan
b530: 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72  ged, so the entr
b540: 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65  y for this table
b550: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
b560: 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  in.** the sqlite
b570: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20  _master table.  
b580: 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  We do not want t
b590: 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69  o create it agai
b5a0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
b5b0: 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74  pSelect argument
b5c0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
b5d0: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
b5e0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20   routine.** was 
b5f0: 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
b600: 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74   a table generat
b610: 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43  ed from a .** "C
b620: 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20  REATE TABLE ... 
b630: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73  AS SELECT ..." s
b640: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63  tatement.  The c
b650: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a  olumn names of.*
b660: 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * the new table 
b670: 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72  will match the r
b680: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
b690: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64   SELECT..*/.void
b6a0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
b6b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
b6c0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
b6d0: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
b6e0: 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20    Token *pCons, 
b6f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
b700: 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72   ',' token after
b710: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
b720: 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65   defn. */.  Toke
b730: 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20  n *pEnd,        
b740: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6e 61 6c      /* The final
b750: 20 27 29 27 20 74 6f 6b 65 6e 20 69 6e 20 74 68   ')' token in th
b760: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a  e CREATE TABLE *
b770: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
b780: 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ect         /* S
b790: 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43 52  elect from a "CR
b7a0: 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45  EATE ... AS SELE
b7b0: 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  CT" */.){.  Tabl
b7c0: 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *p;.  sqlite3 
b7d0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
b7e0: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
b7f0: 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20  if( (pEnd==0 && 
b800: 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 64  pSelect==0) || d
b810: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
b820: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
b830: 20 7d 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d   }.  p = pParse-
b840: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
b850: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
b860: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ..  assert( !db-
b870: 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70  >init.busy || !p
b880: 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 69 44 62  Select );..  iDb
b890: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
b8a0: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70  ToIndex(db, p->p
b8b0: 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65  Schema);..#ifnde
b8c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
b8d0: 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65  ECK.  /* Resolve
b8e0: 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48   names in all CH
b8f0: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65  ECK constraint e
b900: 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
b910: 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b  .  if( p->pCheck
b920: 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
b930: 73 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  sSrc;           
b940: 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20          /* Fake 
b950: 53 72 63 4c 69 73 74 20 66 6f 72 20 70 50 61 72  SrcList for pPar
b960: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f  se->pNewTable */
b970: 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  .    NameContext
b980: 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20   sNC;           
b990: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e       /* Name con
b9a0: 74 65 78 74 20 66 6f 72 20 70 50 61 72 73 65 2d  text for pParse-
b9b0: 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 0a 20  >pNewTable */.. 
b9c0: 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20     memset(&sNC, 
b9d0: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
b9e0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 53 72  .    memset(&sSr
b9f0: 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 72  c, 0, sizeof(sSr
ba00: 63 29 29 3b 0a 20 20 20 20 73 53 72 63 2e 6e 53  c));.    sSrc.nS
ba10: 72 63 20 3d 20 31 3b 0a 20 20 20 20 73 53 72 63  rc = 1;.    sSrc
ba20: 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 70 2d  .a[0].zName = p-
ba30: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 53 72 63  >zName;.    sSrc
ba40: 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70 3b 0a  .a[0].pTab = p;.
ba50: 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 69 43      sSrc.a[0].iC
ba60: 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 20 20  ursor = -1;.    
ba70: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
ba80: 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72  rse;.    sNC.pSr
ba90: 63 4c 69 73 74 20 3d 20 26 73 53 72 63 3b 0a 20  cList = &sSrc;. 
baa0: 20 20 20 73 4e 43 2e 69 73 43 68 65 63 6b 20 3d     sNC.isCheck =
bab0: 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   1;.    if( sqli
bac0: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
bad0: 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 43 68  mes(&sNC, p->pCh
bae0: 65 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 65  eck) ){.      re
baf0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
bb00: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
bb10: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
bb20: 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 49  HECK) */..  /* I
bb30: 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  f the db->init.b
bb40: 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e  usy is 1 it mean
bb50: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
bb60: 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65   the SQL off the
bb70: 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61  .  ** "sqlite_ma
bb80: 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65  ster" or "sqlite
bb90: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61  _temp_master" ta
bba0: 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
bbb0: 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20  .  ** So do not 
bbc0: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73  write to the dis
bbd0: 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63  k again.  Extrac
bbe0: 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
bbf0: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
bc00: 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
bc10: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  he db->init.newT
bc20: 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65  num field.  (The
bc30: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
bc40: 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  * should have be
bc50: 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20  en put there by 
bc60: 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62  the sqliteOpenCb
bc70: 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a   routine.).  */.
bc80: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
bc90: 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e  usy ){.    p->tn
bca0: 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
bcb0: 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  wTnum;.  }..  /*
bcc0: 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69   If not initiali
bcd0: 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74  zing, then creat
bce0: 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74  e a record for t
bcf0: 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a  he new table.  *
bd00: 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  * in the SQLITE_
bd10: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20  MASTER table of 
bd20: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
bd30: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  **.  ** If this 
bd40: 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74  is a TEMPORARY t
bd50: 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20  able, write the 
bd60: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61  entry into the a
bd70: 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69  uxiliary.  ** fi
bd80: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
bd90: 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
bda0: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
bdb0: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
bdc0: 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  busy ){.    int 
bdd0: 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  n;.    Vdbe *v;.
bde0: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b      char *zType;
bdf0: 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72      /* "view" or
be00: 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20   "table" */.    
be10: 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20  char *zType2;   
be20: 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54 41  /* "VIEW" or "TA
be30: 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72  BLE" */.    char
be40: 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54   *zStmt;    /* T
be50: 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
be60: 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54  E TABLE or CREAT
be70: 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74  E VIEW statement
be80: 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c   */..    v = sql
be90: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
bea0: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  se);.    if( NEV
beb0: 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
bec0: 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56  n;..    sqlite3V
bed0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
bee0: 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20  Close, 0);..    
bef0: 2f 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69  /* .    ** Initi
bf00: 61 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f 72 20  alize zType for 
bf10: 74 68 65 20 6e 65 77 20 76 69 65 77 20 6f 72 20  the new view or 
bf20: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
bf30: 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74    if( p->pSelect
bf40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
bf50: 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20  A regular table 
bf60: 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  */.      zType =
bf70: 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20   "table";.      
bf80: 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22  zType2 = "TABLE"
bf90: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
bfa0: 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d  _OMIT_VIEW.    }
bfb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
bfc0: 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a   view */.      z
bfd0: 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20  Type = "view";. 
bfe0: 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56       zType2 = "V
bff0: 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20  IEW";.#endif.   
c000: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
c010: 69 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54  is is a CREATE T
c020: 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43  ABLE xx AS SELEC
c030: 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74  T ..., execute t
c040: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a  he SELECT.    **
c050: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f   statement to po
c060: 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74  pulate the new t
c070: 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70  able. The root-p
c080: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
c090: 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61  he.    ** new ta
c0a0: 62 6c 65 20 69 73 20 69 6e 20 72 65 67 69 73 74  ble is in regist
c0b0: 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  er pParse->regRo
c0c0: 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ot..    **.    *
c0d0: 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43  * Once the SELEC
c0e0: 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64  T has been coded
c0f0: 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63   by sqlite3Selec
c100: 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a  t(), it is in a.
c110: 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20      ** suitable 
c120: 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66  state to query f
c130: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
c140: 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f  mes and types to
c150: 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20   be used.    ** 
c160: 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  by the new table
c170: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
c180: 41 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 77  A shared-cache w
c190: 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74  rite-lock is not
c1a0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 77 72 69   required to wri
c1b0: 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61  te to the new ta
c1c0: 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61  ble,.    ** as a
c1d0: 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73   schema-lock mus
c1e0: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
c1f0: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20  een obtained to 
c200: 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65  create it. Since
c210: 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61  .    ** a schema
c220: 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61  -lock excludes a
c230: 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  ll other databas
c240: 65 20 75 73 65 72 73 2c 20 74 68 65 20 77 72 69  e users, the wri
c250: 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20  te-lock would.  
c260: 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e    ** be redundan
c270: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
c280: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
c290: 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
c2a0: 73 74 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  st;.      Table 
c2b0: 2a 70 53 65 6c 54 61 62 3b 0a 0a 20 20 20 20 20  *pSelTab;..     
c2c0: 20 61 73 73 65 72 74 28 70 50 61 72 73 65 2d 3e   assert(pParse->
c2d0: 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20  nTab==1);.      
c2e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c2f0: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  3(v, OP_OpenWrit
c300: 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 72 65  e, 1, pParse->re
c310: 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20  gRoot, iDb);.   
c320: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
c330: 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20 20  angeP5(v, 1);.  
c340: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
c350: 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 2;.      sqli
c360: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
c370: 74 28 26 64 65 73 74 2c 20 53 52 54 5f 54 61 62  t(&dest, SRT_Tab
c380: 6c 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  le, 1);.      sq
c390: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
c3a0: 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65  se, pSelect, &de
c3b0: 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
c3c0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
c3d0: 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20  OP_Close, 1);.  
c3e0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
c3f0: 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nErr==0 ){.     
c400: 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
c410: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
c420: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
c430: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
c440: 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29  if( pSelTab==0 )
c450: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
c460: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
c470: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
c480: 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
c490: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->nCol;.        
c4a0: 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->aCol = pSelTa
c4b0: 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->aCol;.       
c4c0: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
c4d0: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   0;.        pSel
c4e0: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
c4f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
c500: 6c 65 74 65 54 61 62 6c 65 28 70 53 65 6c 54 61  leteTable(pSelTa
c510: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
c520: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  }..    /* Comput
c530: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  e the complete t
c540: 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
c550: 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  E statement */. 
c560: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
c570: 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  {.      zStmt = 
c580: 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
c590: 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73  db, p);.    }els
c5a0: 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 28 69 6e  e{.      n = (in
c5b0: 74 29 28 70 45 6e 64 2d 3e 7a 20 2d 20 70 50 61  t)(pEnd->z - pPa
c5c0: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
c5d0: 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 7a 53  z) + 1;.      zS
c5e0: 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
c5f0: 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20  intf(db, .      
c600: 20 20 20 20 22 43 52 45 41 54 45 20 25 73 20 25      "CREATE %s %
c610: 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c  .*s", zType2, n,
c620: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
c630: 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20  ken.z.      );. 
c640: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73     }..    /* A s
c650: 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f  lot for the reco
c660: 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  rd has already b
c670: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  een allocated in
c680: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c   the .    ** SQL
c690: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
c6a0: 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20  .  We just need 
c6b0: 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73  to update that s
c6c0: 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20  lot with all.   
c6d0: 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   ** the informat
c6e0: 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63  ion we've collec
c6f0: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
c700: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
c710: 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
c720: 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22   "UPDATE %Q.%s "
c730: 0a 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74  .         "SET t
c740: 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25  ype='%s', name=%
c750: 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20  Q, tbl_name=%Q, 
c760: 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73 71  rootpage=#%d, sq
c770: 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57  l=%Q ".       "W
c780: 48 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22 2c  HERE rowid=#%d",
c790: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
c7a0: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
c7b0: 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20  A_TABLE(iDb),.  
c7c0: 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20      zType,.     
c7d0: 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
c7e0: 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
c7f0: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
c800: 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20  ,.      zStmt,. 
c810: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67       pParse->reg
c820: 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20 20  Rowid.    );.   
c830: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
c840: 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73  b, zStmt);.    s
c850: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
c860: 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
c870: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c880: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
c890: 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  ENT.    /* Check
c8a0: 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65   to see if we ne
c8b0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
c8c0: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
c8d0: 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a  table for.    **
c8e0: 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f   keeping track o
c8f0: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
c900: 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  keys..    */.   
c910: 20 69 66 28 20 70 2d 3e 74 61 62 46 6c 61 67 73   if( p->tabFlags
c920: 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
c930: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 44 62 20  ent ){.      Db 
c940: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
c950: 69 44 62 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  iDb];.      if( 
c960: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53  pDb->pSchema->pS
c970: 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20  eqTab==0 ){.    
c980: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
c990: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
c9a0: 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
c9b0: 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65   TABLE %Q.sqlite
c9c0: 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73  _sequence(name,s
c9d0: 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  eq)",.          
c9e0: 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  pDb->zName.     
c9f0: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
ca00: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
ca10: 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65 72 79  /* Reparse every
ca20: 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20  thing to update 
ca30: 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74  our internal dat
ca40: 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a  a structures */.
ca50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ca60: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 61 72 73  ddOp4(v, OP_Pars
ca70: 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
ca80: 20 30 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0,.        sqli
ca90: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
caa0: 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70  tbl_name='%q'",p
cab0: 2d 3e 7a 4e 61 6d 65 29 2c 20 50 34 5f 44 59 4e  ->zName), P4_DYN
cac0: 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  AMIC);.  }...  /
cad0: 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20  * Add the table 
cae0: 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  to the in-memory
caf0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
cb00: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
cb10: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
cb20: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
cb30: 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20   Table *pOld;.  
cb40: 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
cb50: 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a  a = p->pSchema;.
cb60: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
cb70: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 53  e3HashInsert(&pS
cb80: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
cb90: 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  p->zName,.      
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
cbc0: 72 6c 65 6e 33 30 28 70 2d 3e 7a 4e 61 6d 65 29  rlen30(p->zName)
cbd0: 2c 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  ,p);.    if( pOl
cbe0: 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  d ){.      asser
cbf0: 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f  t( p==pOld );  /
cc00: 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
cc10: 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65  ve failed inside
cc20: 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f   HashInsert() */
cc30: 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  .      db->mallo
cc40: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
cc50: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
cc60: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  .    pParse->pNe
cc70: 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  wTable = 0;.    
cc80: 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20  db->nTable++;.  
cc90: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
cca0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
ccb0: 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ges;..#ifndef SQ
ccc0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54  LITE_OMIT_ALTERT
ccd0: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d  ABLE.    if( !p-
cce0: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
ccf0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
cd00: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
cd10: 72 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d  r *)pParse->sNam
cd20: 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20  eToken.z;.      
cd30: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20  int nName;.     
cd40: 20 61 73 73 65 72 74 28 20 21 70 53 65 6c 65 63   assert( !pSelec
cd50: 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45  t && pCons && pE
cd60: 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nd );.      if( 
cd70: 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  pCons->z==0 ){. 
cd80: 20 20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70         pCons = p
cd90: 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  End;.      }.   
cda0: 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29     nName = (int)
cdb0: 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70  ((const char *)p
cdc0: 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29  Cons->z - zName)
cdd0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f  ;.      p->addCo
cde0: 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73  lOffset = 13 + s
cdf0: 71 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65  qlite3Utf8CharLe
ce00: 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  n(zName, nName);
ce10: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
ce20: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
ce30: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
ce40: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
ce50: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
ce60: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72  e in order to cr
ce70: 65 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a  eate a new VIEW.
ce80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
ce90: 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72  reateView(.  Par
cea0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
ceb0: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
cec0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
ced0: 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f  n *pBegin,     /
cee0: 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
cef0: 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74  en that begins t
cf00: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
cf10: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
cf20: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
cf30: 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
cf40: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
cf50: 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
cf60: 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame2,     /* The
cf70: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
cf80: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
cf90: 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65  e view */.  Sele
cfa0: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f  ct *pSelect,   /
cfb0: 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65  * A SELECT state
cfc0: 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62  ment that will b
cfd0: 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69  ecome the new vi
cfe0: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
cff0: 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 52  mp,        /* TR
d000: 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41  UE for a TEMPORA
d010: 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  RY view */.  int
d020: 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20 20   noErr          
d030: 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72 72 6f  /* Suppress erro
d040: 72 20 6d 65 73 73 61 67 65 73 20 69 66 20 56 49  r messages if VI
d050: 45 57 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  EW already exist
d060: 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  s */.){.  Table 
d070: 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63  *p;.  int n;.  c
d080: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
d090: 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62  Token sEnd;.  Db
d0a0: 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f  Fixer sFix;.  To
d0b0: 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 6e  ken *pName;.  in
d0c0: 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33  t iDb;.  sqlite3
d0d0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d0e0: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
d0f0: 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20  ->nVar>0 ){.    
d100: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
d110: 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74  pParse, "paramet
d120: 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f  ers are not allo
d130: 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a  wed in views");.
d140: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
d150: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
d160: 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
d170: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
d180: 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65  tartTable(pParse
d190: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
d1a0: 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20  , isTemp, 1, 0, 
d1b0: 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50  noErr);.  p = pP
d1c0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
d1d0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
d1e0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
d1f0: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
d200: 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ct);.    return;
d210: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
d220: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
d230: 3b 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 53  ; /* If sqlite3S
d240: 74 61 72 74 54 61 62 6c 65 20 72 65 74 75 72 6e  tartTable return
d250: 20 6e 6f 6e 2d 4e 55 4c 4c 20 74 68 65 6e 0a 20   non-NULL then. 
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
d280: 68 65 72 65 20 63 6f 75 6c 64 20 6e 6f 74 20 68  here could not h
d290: 61 76 65 20 62 65 65 6e 20 61 6e 20 65 72 72 6f  ave been an erro
d2a0: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 77  r */.  sqlite3Tw
d2b0: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
d2c0: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
d2d0: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62  , &pName);.  iDb
d2e0: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
d2f0: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70  ToIndex(db, p->p
d300: 53 63 68 65 6d 61 29 3b 0a 20 20 69 66 28 20 73  Schema);.  if( s
d310: 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
d320: 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
d330: 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29  , "view", pName)
d340: 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 46  .    && sqlite3F
d350: 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20  ixSelect(&sFix, 
d360: 70 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20  pSelect).  ){.  
d370: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
d380: 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63  elete(db, pSelec
d390: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
d3a0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61    }..  /* Make a
d3b0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74   copy of the ent
d3c0: 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ire SELECT state
d3d0: 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
d3e0: 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a  s the view..  **
d3f0: 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65   This will force
d400: 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f   all the Expr.to
d410: 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20  ken.z values to 
d420: 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  be dynamically. 
d430: 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61   ** allocated ra
d440: 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20  ther than point 
d450: 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  to the input str
d460: 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e  ing - which mean
d470: 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79  s that.  ** they
d480: 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66   will persist af
d490: 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ter the current 
d4a0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63  sqlite3_exec() c
d4b0: 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a  all returns..  *
d4c0: 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d  /.  p->pSelect =
d4d0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
d4e0: 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45  p(db, pSelect, E
d4f0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
d500: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
d510: 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63  elete(db, pSelec
d520: 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  t);.  if( db->ma
d530: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
d540: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
d550: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
d560: 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  sy ){.    sqlite
d570: 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
d580: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  mes(pParse, p);.
d590: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
d5a0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
d5b0: 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
d5c0: 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e  ement.  Make sEn
d5d0: 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20  d point to.  ** 
d5e0: 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20  the end..  */.  
d5f0: 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73  sEnd = pParse->s
d600: 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28  LastToken;.  if(
d610: 20 41 4c 57 41 59 53 28 73 45 6e 64 2e 7a 5b 30   ALWAYS(sEnd.z[0
d620: 5d 21 3d 30 29 20 26 26 20 73 45 6e 64 2e 7a 5b  ]!=0) && sEnd.z[
d630: 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73  0]!=';' ){.    s
d640: 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b  End.z += sEnd.n;
d650: 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  .  }.  sEnd.n = 
d660: 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28 73  0;.  n = (int)(s
d670: 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e  End.z - pBegin->
d680: 7a 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e  z);.  z = pBegin
d690: 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 41 4c  ->z;.  while( AL
d6a0: 57 41 59 53 28 6e 3e 30 29 20 26 26 20 73 71 6c  WAYS(n>0) && sql
d6b0: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d  ite3Isspace(z[n-
d6c0: 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  1]) ){ n--; }.  
d6d0: 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d  sEnd.z = &z[n-1]
d6e0: 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a  ;.  sEnd.n = 1;.
d6f0: 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65  .  /* Use sqlite
d700: 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61  3EndTable() to a
d710: 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20 74  dd the view to t
d720: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
d730: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
d740: 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72  te3EndTable(pPar
d750: 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 29  se, 0, &sEnd, 0)
d760: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  ;.  return;.}.#e
d770: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
d780: 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66  MIT_VIEW */..#if
d790: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d7a0: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
d7b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
d7c0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
d7d0: 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c  )./*.** The Tabl
d7e0: 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62  e structure pTab
d7f0: 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56  le is really a V
d800: 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68  IEW.  Fill in th
d810: 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68  e names of.** th
d820: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
d830: 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61   view in the pTa
d840: 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  ble structure.  
d850: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
d860: 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20  r.** of errors. 
d870: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
d880: 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72  seen leave an er
d890: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
d8a0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
d8b0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69  */.int sqlite3Vi
d8c0: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
d8d0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
d8e0: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
d8f0: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
d900: 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61  ;   /* A fake ta
d910: 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77  ble from which w
d920: 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c 74  e get the result
d930: 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74   set */.  Select
d940: 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43   *pSel;     /* C
d950: 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
d960: 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  T that implement
d970: 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  s the view */.  
d980: 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20  int nErr = 0;   
d990: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
d9a0: 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
d9b0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
d9c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
d9d0: 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68  orarily holds th
d9e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  e number of curs
d9f0: 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a  ors assigned */.
da00: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
da10: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
da20: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
da30: 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65  ion for malloc e
da40: 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 28  rrors */.  int (
da50: 2a 78 41 75 74 68 29 28 76 6f 69 64 2a 2c 69 6e  *xAuth)(void*,in
da60: 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  t,const char*,co
da70: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
da80: 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72  char*,const char
da90: 2a 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *);..  assert( p
daa0: 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65  Table );..#ifnde
dab0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
dac0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
dad0: 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c   sqlite3VtabCall
dae0: 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20  Connect(pParse, 
daf0: 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72  pTable) ){.    r
db00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
db10: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73  OR;.  }.  if( Is
db20: 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20  Virtual(pTable) 
db30: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
db40: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
db50: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f  TE_OMIT_VIEW.  /
db60: 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f  * A positive nCo
db70: 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75  l means the colu
db80: 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68  mns names for th
db90: 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a  is view are.  **
dba0: 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a   already known..
dbb0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
dbc0: 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75  e->nCol>0 ) retu
dbd0: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65  rn 0;..  /* A ne
dbe0: 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61  gative nCol is a
dbf0: 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20   special marker 
dc00: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20  meaning that we 
dc10: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  are currently.  
dc20: 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d  ** trying to com
dc30: 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pute the column 
dc40: 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e  names.  If we en
dc50: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
dc60: 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67   with.  ** a neg
dc70: 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d  ative nCol, it m
dc80: 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65  eans two or more
dc90: 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f   views form a lo
dca0: 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  op, like this:. 
dcb0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45   **.  **     CRE
dcc0: 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20  ATE VIEW one AS 
dcd0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77  SELECT * FROM tw
dce0: 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  o;.  **     CREA
dcf0: 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53  TE VIEW two AS S
dd00: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65  ELECT * FROM one
dd10: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75  ;.  **.  ** Actu
dd20: 61 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f 72 20  ally, the error 
dd30: 61 62 6f 76 65 20 69 73 20 6e 6f 77 20 63 61 75  above is now cau
dd40: 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61  ght prior to rea
dd50: 63 68 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74  ching this point
dd60: 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 66  ..  ** But the f
dd70: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20 69 73  ollowing test is
dd80: 20 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74   still important
dd90: 20 61 73 20 69 74 20 64 6f 65 73 20 63 6f 6d 65   as it does come
dda0: 20 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20   up.  ** in the 
ddb0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20  following:.  ** 
ddc0: 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
ddd0: 20 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28   TABLE main.ex1(
dde0: 61 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  a);.  **     CRE
ddf0: 41 54 45 20 54 45 4d 50 20 56 49 45 57 20 65 78  ATE TEMP VIEW ex
de00: 31 20 41 53 20 53 45 4c 45 43 54 20 61 20 46 52  1 AS SELECT a FR
de10: 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20  OM ex1;.  **    
de20: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
de30: 65 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20  emp.ex1;.  */.  
de40: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
de50: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
de60: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
de70: 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69  , "view %s is ci
de80: 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64  rcularly defined
de90: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
dea0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
deb0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
dec0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29  Table->nCol>=0 )
ded0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65  ;..  /* If we ge
dee0: 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
def0: 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20  eans we need to 
df00: 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c  compute the tabl
df10: 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f  e names..  ** No
df20: 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  te that the call
df30: 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c   to sqlite3Resul
df40: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77  tSetOfSelect() w
df50: 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20  ill expand any. 
df60: 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73   ** "*" elements
df70: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20   in the results 
df80: 73 65 74 20 6f 66 20 74 68 65 20 76 69 65 77 20  set of the view 
df90: 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20  and will assign 
dfa0: 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20  cursors.  ** to 
dfb0: 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  the elements of 
dfc0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
dfd0: 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20    But we do not 
dfe0: 77 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67  want these chang
dff0: 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65  es.  ** to be pe
e000: 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65  rmanent.  So the
e010: 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
e020: 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f  done on a copy o
e030: 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a  f the SELECT.  *
e040: 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  * statement that
e050: 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
e060: 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  w..  */.  assert
e070: 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  ( pTable->pSelec
e080: 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71  t );.  pSel = sq
e090: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
e0a0: 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  b, pTable->pSele
e0b0: 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53  ct, 0);.  if( pS
e0c0: 65 6c 20 29 7b 0a 20 20 20 20 75 38 20 65 6e 61  el ){.    u8 ena
e0d0: 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 64  bleLookaside = d
e0e0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
e0f0: 61 62 6c 65 64 3b 0a 20 20 20 20 6e 20 3d 20 70  abled;.    n = p
e100: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20  Parse->nTab;.   
e110: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
e120: 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
e130: 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29  rse, pSel->pSrc)
e140: 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43  ;.    pTable->nC
e150: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 64 62 2d  ol = -1;.    db-
e160: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
e170: 6c 65 64 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  led = 0;.#ifndef
e180: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
e190: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 78  HORIZATION.    x
e1a0: 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75 74 68  Auth = db->xAuth
e1b0: 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20  ;.    db->xAuth 
e1c0: 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  = 0;.    pSelTab
e1d0: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
e1e0: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
e1f0: 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64  se, pSel);.    d
e200: 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68  b->xAuth = xAuth
e210: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 53 65 6c  ;.#else.    pSel
e220: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
e230: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
e240: 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23 65  Parse, pSel);.#e
e250: 6e 64 69 66 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  ndif.    db->loo
e260: 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20  kaside.bEnabled 
e270: 3d 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64  = enableLookasid
e280: 65 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  e;.    pParse->n
e290: 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28  Tab = n;.    if(
e2a0: 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20   pSelTab ){.    
e2b0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
e2c0: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
e2d0: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
e2e0: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
e2f0: 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61  .      pTable->a
e300: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
e310: 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  Col;.      pSelT
e320: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
e330: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
e340: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  l = 0;.      sql
e350: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
e360: 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20  pSelTab);.      
e370: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d  pTable->pSchema-
e380: 3e 66 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72  >flags |= DB_Unr
e390: 65 73 65 74 56 69 65 77 73 3b 0a 20 20 20 20 7d  esetViews;.    }
e3a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62  else{.      pTab
e3b0: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->nCol = 0;.  
e3c0: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20      nErr++;.    
e3d0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  }.    sqlite3Sel
e3e0: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
e3f0: 65 6c 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  el);.  } else {.
e400: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a      nErr++;.  }.
e410: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
e420: 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20  _OMIT_VIEW */.  
e430: 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d  return nErr;  .}
e440: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
e450: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
e460: 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
e470: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
e480: 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
e490: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e4a0: 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43  MIT_VIEW./*.** C
e4b0: 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
e4c0: 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79  names from every
e4d0: 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73   VIEW in databas
e4e0: 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  e idx..*/.static
e4f0: 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77   void sqliteView
e500: 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33  ResetAll(sqlite3
e510: 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a   *db, int idx){.
e520: 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20    HashElem *i;. 
e530: 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65   if( !DbHasPrope
e540: 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
e550: 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20  UnresetViews) ) 
e560: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
e570: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
e580: 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53  &db->aDb[idx].pS
e590: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
e5a0: 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e   i;i=sqliteHashN
e5b0: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62  ext(i)){.    Tab
e5c0: 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
e5d0: 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
e5e0: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
e5f0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ect ){.      sql
e600: 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61  iteResetColumnNa
e610: 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d  mes(pTab);.    }
e620: 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72  .  }.  DbClearPr
e630: 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20  operty(db, idx, 
e640: 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  DB_UnresetViews)
e650: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
e660: 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  ne sqliteViewRes
e670: 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69  etAll(A,B).#endi
e680: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
e690: 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VIEW */../*.** 
e6a0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
e6b0: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56   called by the V
e6c0: 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68  DBE to adjust th
e6d0: 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  e internal schem
e6e0: 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c  a.** used by SQL
e6f0: 69 74 65 20 77 68 65 6e 20 74 68 65 20 62 74 72  ite when the btr
e700: 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61  ee layer moves a
e710: 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65   table root page
e720: 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61  . The.** root-pa
e730: 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  ge of a table or
e740: 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61   index in databa
e750: 73 65 20 69 44 62 20 68 61 73 20 63 68 61 6e 67  se iDb has chang
e760: 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a  ed from iFrom.**
e770: 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54   to iTo..**.** T
e780: 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20 54 68  icket #1728:  Th
e790: 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d  e symbol table m
e7a0: 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61  ight still conta
e7b0: 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  in information.*
e7c0: 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f  * on tables and/
e7d0: 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61 74 20  or indices that 
e7e0: 61 72 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  are the process 
e7f0: 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  of being deleted
e800: 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20  ..** If you are 
e810: 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20  unlucky, one of 
e820: 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20 69 6e  those deleted in
e830: 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65 73 20  dices or tables 
e840: 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 74 68  might.** have th
e850: 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67 65 20  e same rootpage 
e860: 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 72 65  number as the re
e870: 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  al table or inde
e880: 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62 65 69  x that is.** bei
e890: 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65  ng moved.  So we
e8a0: 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61   cannot stop sea
e8b0: 72 63 68 69 6e 67 20 61 66 74 65 72 20 74 68 65  rching after the
e8c0: 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a   first match .**
e8d0: 20 62 65 63 61 75 73 65 20 74 68 65 20 66 69 72   because the fir
e8e0: 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74 20 62  st match might b
e8f0: 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  e for one of the
e900: 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73   deleted indices
e910: 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20 61 6e  .** or tables an
e920: 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c 65 2f  d not the table/
e930: 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 61 63  index that is ac
e940: 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76  tually being mov
e950: 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63  ed..** We must c
e960: 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20  ontinue looping 
e970: 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73  until all tables
e980: 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77 69 74   and indices wit
e990: 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69  h.** rootpage==i
e9a0: 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e 20 63  From have been c
e9b0: 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61 76 65  onverted to have
e9c0: 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 69   a rootpage of i
e9d0: 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  To.** in order t
e9e0: 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74 68 61  o be certain tha
e9f0: 74 20 77 65 20 67 6f 74 20 74 68 65 20 72 69 67  t we got the rig
ea00: 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64  ht one..*/.#ifnd
ea10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
ea20: 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73  UTOVACUUM.void s
ea30: 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f  qlite3RootPageMo
ea40: 76 65 64 28 44 62 20 2a 70 44 62 2c 20 69 6e 74  ved(Db *pDb, int
ea50: 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29   iFrom, int iTo)
ea60: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45  {.  HashElem *pE
ea70: 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61  lem;.  Hash *pHa
ea80: 73 68 3b 0a 0a 20 20 70 48 61 73 68 20 3d 20 26  sh;..  pHash = &
ea90: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
eaa0: 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c  lHash;.  for(pEl
eab0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
eac0: 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d  st(pHash); pElem
ead0: 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
eae0: 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
eaf0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
eb00: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
eb10: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
eb20: 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pTab->tnum==iFr
eb30: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  om ){.      pTab
eb40: 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
eb50: 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68 20    }.  }.  pHash 
eb60: 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  = &pDb->pSchema-
eb70: 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72 28  >idxHash;.  for(
eb80: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
eb90: 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45  First(pHash); pE
eba0: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
ebb0: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
ebc0: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
ebd0: 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  dx = sqliteHashD
ebe0: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
ebf0: 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d  if( pIdx->tnum==
ec00: 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70  iFrom ){.      p
ec10: 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b  Idx->tnum = iTo;
ec20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
ec30: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
ec40: 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74   code to erase t
ec50: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
ec60: 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66  ot-page iTable f
ec70: 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44 62  rom database iDb
ec80: 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20  ..** Also write 
ec90: 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74  code to modify t
eca0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
ecb0: 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72   table and inter
ecc0: 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66  nal schema.** if
ecd0: 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20   a root-page of 
ece0: 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
ecf0: 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
ed00: 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74  ree-layer whilst
ed10: 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62  .** erasing iTab
ed20: 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68 61 70  le (this can hap
ed30: 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f  pen with an auto
ed40: 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
ed50: 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  )..*/ .static vo
ed60: 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61  id destroyRootPa
ed70: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
ed80: 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e  , int iTable, in
ed90: 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
eda0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
edb0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e  be(pParse);.  in
edc0: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
edd0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
ede0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
edf0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73 74  ddOp3(v, OP_Dest
ee00: 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c  roy, iTable, r1,
ee10: 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   iDb);.  sqlite3
ee20: 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
ee30: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
ee40: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
ee50: 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  /* OP_Destroy
ee60: 20 73 74 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e   stores an in in
ee70: 74 65 67 65 72 20 72 31 2e 20 49 66 20 74 68 69  teger r1. If thi
ee80: 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69  s integer.  ** i
ee90: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
eea0: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
eeb0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
eec0: 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a   table moved to.
eed0: 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54    ** location iT
eee0: 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  able. The follow
eef0: 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65  ing code modifie
ef00: 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  s the sqlite_mas
ef10: 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a  ter table to.  *
ef20: 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a  * reflect this..
ef30: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23    **.  ** The "#
ef40: 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53 51 4c 20  NNN" in the SQL 
ef50: 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e  is a special con
ef60: 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73  stant that means
ef70: 20 77 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a   whatever value.
ef80: 20 20 2a 2a 20 69 73 20 69 6e 20 72 65 67 69 73    ** is in regis
ef90: 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65 20 67 72  ter NNN.  See gr
efa0: 61 6d 6d 61 72 20 72 75 6c 65 73 20 61 73 73 6f  ammar rules asso
efb0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
efc0: 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 2a 2a  TK_REGISTER.  **
efd0: 20 74 6f 6b 65 6e 20 66 6f 72 20 61 64 64 69 74   token for addit
efe0: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
eff0: 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  n..  */.  sqlite
f000: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
f010: 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41  rse, .     "UPDA
f020: 54 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f  TE %Q.%s SET roo
f030: 74 70 61 67 65 3d 25 64 20 57 48 45 52 45 20 23  tpage=%d WHERE #
f040: 25 64 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d  %d AND rootpage=
f050: 23 25 64 22 2c 0a 20 20 20 20 20 70 50 61 72 73  #%d",.     pPars
f060: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
f070: 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
f080: 42 4c 45 28 69 44 62 29 2c 20 69 54 61 62 6c 65  BLE(iDb), iTable
f090: 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69  , r1, r1);.#endi
f0a0: 66 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  f.  sqlite3Relea
f0b0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
f0c0: 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , r1);.}../*.** 
f0d0: 57 72 69 74 65 20 56 44 42 45 20 63 6f 64 65 20  Write VDBE code 
f0e0: 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20 70  to erase table p
f0f0: 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f  Tab and all asso
f100: 63 69 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f  ciated indices o
f110: 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20  n disk..** Code 
f120: 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 73 71  to update the sq
f130: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
f140: 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20  es and internal 
f150: 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f  schema definitio
f160: 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20  ns.** in case a 
f170: 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67  root-page belong
f180: 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74  ing to another t
f190: 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79  able is moved by
f1a0: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
f1b0: 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65  .** is also adde
f1c0: 64 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70  d (this can happ
f1d0: 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d  en with an auto-
f1e0: 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29  vacuum database)
f1f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f200: 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61   destroyTable(Pa
f210: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
f220: 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69 66 64 65  le *pTab){.#ifde
f230: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
f240: 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64 65 78  TOVACUUM.  Index
f250: 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 44   *pIdx;.  int iD
f260: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
f270: 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
f280: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
f290: 6d 61 29 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f  ma);.  destroyRo
f2a0: 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
f2b0: 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Tab->tnum, iDb);
f2c0: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
f2d0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
f2e0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
f2f0: 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f  ){.    destroyRo
f300: 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
f310: 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Idx->tnum, iDb);
f320: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20  .  }.#else.  /* 
f330: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
f340: 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75  may be auto-vacu
f350: 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20 53  um capable (if S
f360: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
f370: 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f  ACUUM.  ** is no
f380: 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e  t defined), then
f390: 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
f3a0: 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74   to call OP_Dest
f3b0: 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  roy on the.  ** 
f3c0: 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
f3d0: 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72  root-pages in or
f3e0: 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69  der, starting wi
f3f0: 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c  th the numerical
f400: 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74  ly .  ** largest
f410: 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
f420: 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  r. This guarante
f430: 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20  es that none of 
f440: 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20  the root-pages. 
f450: 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f   ** to be destro
f460: 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64  yed is relocated
f470: 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f   by an earlier O
f480: 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20  P_Destroy. i.e. 
f490: 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c  if the.  ** foll
f4a0: 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64  owing were coded
f4b0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44  :.  **.  ** OP_D
f4c0: 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20  estroy 4 0.  ** 
f4d0: 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74  ....  ** OP_Dest
f4e0: 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a  roy 5 0.  **.  *
f4f0: 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20  * and root page 
f500: 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65  5 happened to be
f510: 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
f520: 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e  t-page number in
f530: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
f540: 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61  se, then root pa
f550: 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f  ge 5 would be mo
f560: 76 65 64 20 74 6f 20 70 61 67 65 20 34 20 62 79  ved to page 4 by
f570: 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44   the .  ** "OP_D
f580: 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f  estroy 4 0" opco
f590: 64 65 2e 20 54 68 65 20 73 75 62 73 65 71 75 65  de. The subseque
f5a0: 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35  nt "OP_Destroy 5
f5b0: 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20   0" would hit.  
f5c0: 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70  ** a free-list p
f5d0: 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  age..  */.  int 
f5e0: 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75  iTab = pTab->tnu
f5f0: 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f  m;.  int iDestro
f600: 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c  yed = 0;..  whil
f610: 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65  e( 1 ){.    Inde
f620: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74  x *pIdx;.    int
f630: 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a   iLargest = 0;..
f640: 20 20 20 20 69 66 28 20 69 44 65 73 74 72 6f 79      if( iDestroy
f650: 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44  ed==0 || iTab<iD
f660: 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20  estroyed ){.    
f670: 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61    iLargest = iTa
f680: 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  b;.    }.    for
f690: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
f6a0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
f6b0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
f6c0: 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49     int iIdx = pI
f6d0: 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  dx->tnum;.      
f6e0: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53  assert( pIdx->pS
f6f0: 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
f700: 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69 66  hema );.      if
f710: 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30  ( (iDestroyed==0
f720: 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72   || (iIdx<iDestr
f730: 6f 79 65 64 29 29 20 26 26 20 69 49 64 78 3e 69  oyed)) && iIdx>i
f740: 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20  Largest ){.     
f750: 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49     iLargest = iI
f760: 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dx;.      }.    
f770: 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67 65  }.    if( iLarge
f780: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
f790: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65  eturn;.    }else
f7a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20  {.      int iDb 
f7b0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
f7c0: 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
f7d0: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
f7e0: 29 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79  );.      destroy
f7f0: 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
f800: 20 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b   iLargest, iDb);
f810: 0a 20 20 20 20 20 20 69 44 65 73 74 72 6f 79 65  .      iDestroye
f820: 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20  d = iLargest;.  
f830: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d    }.  }.#endif.}
f840: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
f850: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
f860: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66  o do the work of
f870: 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74   a DROP TABLE st
f880: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d  atement..** pNam
f890: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
f8a0: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
f8b0: 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69   dropped..*/.voi
f8c0: 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62  d sqlite3DropTab
f8d0: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
f8e0: 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
f8f0: 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e  , int isView, in
f900: 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c  t noErr){.  Tabl
f910: 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20  e *pTab;.  Vdbe 
f920: 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
f930: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
f940: 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66    int iDb;..  if
f950: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
f960: 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  ed ){.    goto e
f970: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
f980: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
f990: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
f9a0: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
f9b0: 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69  ->nSrc==1 );.  i
f9c0: 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73  f( noErr ) db->s
f9d0: 75 70 70 72 65 73 73 45 72 72 2b 2b 3b 0a 20 20  uppressErr++;.  
f9e0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
f9f0: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
fa00: 2c 20 69 73 56 69 65 77 2c 20 0a 20 20 20 20 20  , isView, .     
fa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa20: 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 61 5b         pName->a[
fa30: 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d  0].zName, pName-
fa40: 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
fa50: 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20  ;.  if( noErr ) 
fa60: 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2d  db->suppressErr-
fa70: 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  -;..  if( pTab==
fa80: 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  0 ){.    goto ex
fa90: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
faa0: 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
fab0: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
fac0: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
fad0: 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  a);.  assert( iD
fae0: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
faf0: 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nDb );..  /* If 
fb00: 70 54 61 62 20 69 73 20 61 20 76 69 72 74 75 61  pTab is a virtua
fb10: 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69  l table, call Vi
fb20: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
fb30: 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a  () to ensure.  *
fb40: 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69  * it is initiali
fb50: 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  zed..  */.  if( 
fb60: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
fb70: 26 26 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  && sqlite3ViewGe
fb80: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
fb90: 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20  rse, pTab) ){.  
fba0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
fbb0: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e  _table;.  }.#ifn
fbc0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fbd0: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
fbe0: 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  {.    int code;.
fbf0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
fc00: 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
fc10: 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 63 6f  BLE(iDb);.    co
fc20: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
fc30: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
fc40: 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
fc50: 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20  ar *zArg2 = 0;. 
fc60: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
fc70: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
fc80: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
fc90: 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20  Tab, 0, zDb)){. 
fca0: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
fcb0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
fcc0: 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
fcd0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  ){.      if( !OM
fce0: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
fcf0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
fd00: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
fd10: 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  P_TEMP_VIEW;.   
fd20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fd30: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
fd40: 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  DROP_VIEW;.     
fd50: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
fd60: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
fd70: 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  BLE.    }else if
fd80: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
fd90: 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 20  ) ){.      code 
fda0: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54  = SQLITE_DROP_VT
fdb0: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72 67  ABLE;.      zArg
fdc0: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54  2 = sqlite3GetVT
fdd0: 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 2d 3e  able(db, pTab)->
fde0: 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e  pMod->zName;.#en
fdf0: 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
fe00: 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
fe10: 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
fe20: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
fe30: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
fe40: 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
fe50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
fe60: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
fe70: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
fe80: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
fe90: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
fea0: 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54  pParse, code, pT
feb0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32  ab->zName, zArg2
fec0: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
fed0: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
fee0: 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  able;.    }.    
fef0: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
ff00: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
ff10: 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62  ITE_DELETE, pTab
ff20: 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  ->zName, 0, zDb)
ff30: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
ff40: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
ff50: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
ff60: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
ff70: 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
ff80: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
ff90: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
ffa0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
ffb0: 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
ffc0: 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  y not be dropped
ffd0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
ffe0: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
fff0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a  rop_table;.  }..
10000 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10010 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e  MIT_VIEW.  /* En
10020 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20  sure DROP TABLE 
10030 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61  is not used on a
10040 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20   view, and DROP 
10050 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64  VIEW is not used
10060 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65  .  ** on a table
10070 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56  ..  */.  if( isV
10080 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
10090 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  lect==0 ){.    s
100a0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
100b0 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
100c0 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65   TABLE to delete
100d0 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62   table %s", pTab
100e0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
100f0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
10100 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69  le;.  }.  if( !i
10110 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
10120 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
10130 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
10140 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
10150 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76  VIEW to delete v
10160 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  iew %s", pTab->z
10170 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
10180 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
10190 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
101a0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
101b0 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61  to remove the ta
101c0 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  ble from the mas
101d0 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ter table.  ** o
101e0 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76  n disk..  */.  v
101f0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
10200 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
10210 20 76 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65   v ){.    Trigge
10220 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20  r *pTrigger;.   
10230 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
10240 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 73 71  aDb[iDb];.    sq
10250 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
10260 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
10270 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64   1, iDb);..#ifnd
10280 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
10290 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
102a0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
102b0 61 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ab) ){.      sql
102c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
102d0 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20  , OP_VBegin);.  
102e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 73    }.#endif.    s
102f0 71 6c 69 74 65 33 46 6b 44 72 6f 70 54 61 62 6c  qlite3FkDropTabl
10300 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c  e(pParse, pName,
10310 20 70 54 61 62 29 3b 0a 0a 20 20 20 20 2f 2a 20   pTab);..    /* 
10320 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72  Drop all trigger
10330 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
10340 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  h the table bein
10350 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a  g dropped. Code.
10360 20 20 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61      ** is genera
10370 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e  ted to remove en
10380 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74  tries from sqlit
10390 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a  e_master and/or.
103a0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65      ** sqlite_te
103b0 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71  mp_master if req
103c0 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
103d0 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c    pTrigger = sql
103e0 69 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28  ite3TriggerList(
103f0 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
10400 20 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67     while( pTrigg
10410 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  er ){.      asse
10420 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53  rt( pTrigger->pS
10430 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
10440 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20  hema || .       
10450 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63     pTrigger->pSc
10460 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d  hema==db->aDb[1]
10470 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  .pSchema );.    
10480 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69    sqlite3DropTri
10490 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20  ggerPtr(pParse, 
104a0 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 20  pTrigger);.     
104b0 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69   pTrigger = pTri
104c0 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  gger->pNext;.   
104d0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
104e0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
104f0 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 52 65 6d  EMENT.    /* Rem
10500 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20  ove any entries 
10510 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  of the sqlite_se
10520 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73  quence table ass
10530 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 20  ociated with.   
10540 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65   ** the table be
10550 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69  ing dropped. Thi
10560 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65  s is done before
10570 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72   the table is dr
10580 6f 70 70 65 64 0a 20 20 20 20 2a 2a 20 61 74 20  opped.    ** at 
10590 74 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c  the btree level,
105a0 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c   in case the sql
105b0 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
105c0 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20  le needs to.    
105d0 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73  ** move as a res
105e0 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20  ult of the drop 
105f0 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61  (can happen in a
10600 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29  uto-vacuum mode)
10610 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10620 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
10630 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
10640 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nt ){.      sqli
10650 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
10660 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
10670 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e 73  DELETE FROM %s.s
10680 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57  qlite_sequence W
10690 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20  HERE name=%Q",. 
106a0 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d         pDb->zNam
106b0 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20  e, pTab->zName. 
106c0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65       );.    }.#e
106d0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72 6f  ndif..    /* Dro
106e0 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53  p all SQLITE_MAS
106f0 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e  TER table and in
10700 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61 74  dex entries that
10710 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20   refer to the.  
10720 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20    ** table. The 
10730 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f  program name loo
10740 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d  ps through the m
10750 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
10760 64 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20 65  deletes.    ** e
10770 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72 65  very row that re
10780 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20  fers to a table 
10790 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
107a0 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e   as the one bein
107b0 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70 65 64  g.    ** dropped
107c0 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20 68  . Triggers are h
107d0 61 6e 64 6c 65 64 20 73 65 70 65 72 61 74 65 6c  andled seperatel
107e0 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69 67  y because a trig
107f0 67 65 72 20 63 61 6e 20 62 65 0a 20 20 20 20 2a  ger can be.    *
10800 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  * created in the
10810 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 74   temp database t
10820 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
10830 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72  table in another
10840 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
10850 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
10860 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
10870 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
10880 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
10890 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61  .%s WHERE tbl_na
108a0 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d  me=%Q and type!=
108b0 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20  'trigger'",.    
108c0 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20      pDb->zName, 
108d0 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
108e0 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ), pTab->zName);
108f0 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6e  ..    /* Drop an
10900 79 20 73 74 61 74 69 73 74 69 63 73 20 66 72 6f  y statistics fro
10910 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  m the sqlite_sta
10920 74 31 20 74 61 62 6c 65 2c 20 69 66 20 69 74 20  t1 table, if it 
10930 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 66  exists */.    if
10940 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
10950 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73  le(db, "sqlite_s
10960 74 61 74 31 22 2c 20 64 62 2d 3e 61 44 62 5b 69  tat1", db->aDb[i
10970 44 62 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  Db].zName) ){.  
10980 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
10990 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
109a0 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
109b0 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74  ROM %Q.sqlite_st
109c0 61 74 31 20 57 48 45 52 45 20 74 62 6c 3d 25 51  at1 WHERE tbl=%Q
109d0 22 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70  ", pDb->zName, p
109e0 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  Tab->zName.     
109f0 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   );.    }..    i
10a00 66 28 20 21 69 73 56 69 65 77 20 26 26 20 21 49  f( !isView && !I
10a10 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
10a20 7b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 54  {.      destroyT
10a30 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
10a40 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  b);.    }..    /
10a50 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62  * Remove the tab
10a60 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51  le entry from SQ
10a70 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20  Lite's internal 
10a80 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66  schema and modif
10a90 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68  y.    ** the sch
10aa0 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 20 20  ema cookie..    
10ab0 2a 2f 0a 20 20 20 20 69 66 28 20 49 73 56 69 72  */.    if( IsVir
10ac0 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
10ad0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10ae0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73  ddOp4(v, OP_VDes
10af0 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c  troy, iDb, 0, 0,
10b00 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
10b10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
10b20 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
10b30 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69   OP_DropTable, i
10b40 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e  Db, 0, 0, pTab->
10b50 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
10b60 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
10b70 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
10b80 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69 65  .  }.  sqliteVie
10b90 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44  wResetAll(db, iD
10ba0 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74  b);..exit_drop_t
10bb0 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53  able:.  sqlite3S
10bc0 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
10bd0 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pName);.}../*.*
10be0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
10bf0 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
10c00 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e  te a new foreign
10c10 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c   key on the tabl
10c20 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75  e.** currently u
10c30 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
10c40 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74  n.  pFromCol det
10c50 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f  ermines which co
10c60 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
10c70 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f  current table po
10c80 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69  int to the forei
10c90 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f  gn key.  If pFro
10ca0 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  mCol==0 then.** 
10cb0 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20  connect the key 
10cc0 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  to the last colu
10cd0 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54  mn inserted.  pT
10ce0 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  o is the name of
10cf0 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65  .** the table re
10d00 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43  ferred to.  pToC
10d10 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ol is a list of 
10d20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74  tables in the ot
10d30 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65  her.** pTo table
10d40 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67   that the foreig
10d50 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e  n key points to.
10d60 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
10d70 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
10d80 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
10d90 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
10da0 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
10db0 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
10dc0 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
10dd0 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
10de0 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
10df0 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
10e00 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
10e10 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
10e20 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
10e30 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
10e40 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
10e50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
10e60 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  field..**.** The
10e70 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
10e80 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54  set for IMMEDIAT
10e90 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41  E processing.  A
10ea0 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
10eb0 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65  .** to sqlite3De
10ec0 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20  ferForeignKey() 
10ed0 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69  might change thi
10ee0 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a  s to DEFERRED..*
10ef0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
10f00 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a  eateForeignKey(.
10f10 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
10f20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
10f30 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
10f40 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f  xprList *pFromCo
10f50 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69  l,  /* Columns i
10f60 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
10f70 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72  t point to other
10f80 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65   table */.  Toke
10f90 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20  n *pTo,         
10fa0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
10fb0 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
10fc0 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f   ExprList *pToCo
10fd0 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  l,    /* Columns
10fe0 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61   in the other ta
10ff0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ble */.  int fla
11000 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
11010 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
11020 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e  tion algorithms.
11030 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
11040 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
11050 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
11060 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
11070 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  EY.  FKey *pFKey
11080 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e   = 0;.  FKey *pN
11090 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a  extTo;.  Table *
110a0 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
110b0 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79  Table;.  int nBy
110c0 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  te;.  int i;.  i
110d0 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  nt nCol;.  char 
110e0 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *z;..  assert( p
110f0 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
11100 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  ==0 || IN_DECLAR
11110 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b  E_VTAB ) goto fk
11120 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f  _end;.  if( pFro
11130 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mCol==0 ){.    i
11140 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f  nt iCol = p->nCo
11150 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  l-1;.    if( NEV
11160 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74  ER(iCol<0) ) got
11170 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66  o fk_end;.    if
11180 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
11190 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  ol->nExpr!=1 ){.
111a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
111b0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66  orMsg(pParse, "f
111c0 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73  oreign key on %s
111d0 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f  ".         " sho
111e0 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  uld reference on
111f0 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66  ly one column of
11200 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20   table %T",.    
11210 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f       p->aCol[iCo
11220 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a  l].zName, pTo);.
11230 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
11240 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f  d;.    }.    nCo
11250 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  l = 1;.  }else i
11260 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
11270 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f  Col->nExpr!=pFro
11280 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  mCol->nExpr ){. 
11290 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
112a0 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
112b0 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f     "number of co
112c0 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e  lumns in foreign
112d0 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
112e0 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
112f0 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c  f ".        "col
11300 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65  umns in the refe
11310 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a  renced table");.
11320 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
11330 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
11340 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  ol = pFromCol->n
11350 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  Expr;.  }.  nByt
11360 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65  e = sizeof(*pFKe
11370 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69  y) + (nCol-1)*si
11380 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c  zeof(pFKey->aCol
11390 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20  [0]) + pTo->n + 
113a0 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  1;.  if( pToCol 
113b0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
113c0 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b  i<pToCol->nExpr;
113d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79   i++){.      nBy
113e0 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  te += sqlite3Str
113f0 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
11400 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
11410 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
11420 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
11430 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
11440 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d   );.  if( pFKey=
11450 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  =0 ){.    goto f
11460 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b  k_end;.  }.  pFK
11470 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20  ey->pFrom = p;. 
11480 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
11490 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20  m = p->pFKey;.  
114a0 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65  z = (char*)&pFKe
114b0 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20  y->aCol[nCol];. 
114c0 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b   pFKey->zTo = z;
114d0 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f  .  memcpy(z, pTo
114e0 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20  ->z, pTo->n);.  
114f0 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  z[pTo->n] = 0;. 
11500 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
11510 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e  z);.  z += pTo->
11520 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43  n+1;.  pFKey->nC
11530 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28  ol = nCol;.  if(
11540 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
11550 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
11560 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43  0].iFrom = p->nC
11570 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ol-1;.  }else{. 
11580 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
11590 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
115a0 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
115b0 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  (j=0; j<p->nCol;
115c0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
115d0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
115e0 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  p(p->aCol[j].zNa
115f0 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  me, pFromCol->a[
11600 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
11610 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
11620 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d  >aCol[i].iFrom =
11630 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   j;.          br
11640 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
11650 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
11660 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20   j>=p->nCol ){. 
11670 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
11680 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
11690 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
116a0 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22  wn column \"%s\"
116b0 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
116c0 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20  definition", .  
116d0 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c          pFromCol
116e0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
116f0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65         goto fk_e
11700 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
11710 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
11720 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
11730 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
11740 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
11750 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
11760 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
11770 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
11780 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
11790 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  z;.      memcpy(
117a0 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  z, pToCol->a[i].
117b0 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
117c0 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[n] = 0;.     
117d0 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d   z += n+1;.    }
117e0 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73  .  }.  pFKey->is
117f0 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20  Deferred = 0;.  
11800 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30  pFKey->aAction[0
11810 5d 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26  ] = (u8)(flags &
11820 20 30 78 66 66 29 3b 20 20 20 20 20 20 20 20 20   0xff);         
11830 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20     /* ON DELETE 
11840 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65  action */.  pFKe
11850 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20  y->aAction[1] = 
11860 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 38  (u8)((flags >> 8
11870 20 29 20 26 20 30 78 66 66 29 3b 20 20 20 20 2f   ) & 0xff);    /
11880 2a 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69  * ON UPDATE acti
11890 6f 6e 20 2a 2f 0a 0a 20 20 70 4e 65 78 74 54 6f  on */..  pNextTo
118a0 20 3d 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74   = (FKey *)sqlit
118b0 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d  e3HashInsert(&p-
118c0 3e 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61  >pSchema->fkeyHa
118d0 73 68 2c 20 0a 20 20 20 20 20 20 70 46 4b 65 79  sh, .      pFKey
118e0 2d 3e 7a 54 6f 2c 20 73 71 6c 69 74 65 33 53 74  ->zTo, sqlite3St
118f0 72 6c 65 6e 33 30 28 70 46 4b 65 79 2d 3e 7a 54  rlen30(pFKey->zT
11900 6f 29 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b 65  o), (void *)pFKe
11910 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  y.  );.  if( pNe
11920 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20  xtTo==pFKey ){. 
11930 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
11940 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74  led = 1;.    got
11950 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  o fk_end;.  }.  
11960 69 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20  if( pNextTo ){. 
11970 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 78 74     assert( pNext
11980 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29  To->pPrevTo==0 )
11990 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65  ;.    pFKey->pNe
119a0 78 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a  xtTo = pNextTo;.
119b0 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72      pNextTo->pPr
119c0 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20  evTo = pFKey;.  
119d0 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  }..  /* Link the
119e0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20   foreign key to 
119f0 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65  the table as the
11a00 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f   last step..  */
11a10 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46  .  p->pFKey = pF
11a20 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30  Key;.  pFKey = 0
11a30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c  ;..fk_end:.  sql
11a40 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
11a50 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  FKey);.#endif /*
11a60 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
11a70 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
11a80 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  Y) */.  sqlite3E
11a90 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
11aa0 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73  , pFromCol);.  s
11ab0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
11ac0 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29  lete(db, pToCol)
11ad0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
11ae0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
11af0 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41  d when an INITIA
11b00 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72  LLY IMMEDIATE or
11b10 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
11b20 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73  RED.** clause is
11b30 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66   seen as part of
11b40 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64   a foreign key d
11b50 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20  efinition.  The 
11b60 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61  isDeferred.** pa
11b70 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72  rameter is 1 for
11b80 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
11b90 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e  RED and 0 for IN
11ba0 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
11bb0 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69  E..** The behavi
11bc0 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  or of the most r
11bd0 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20  ecently created 
11be0 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61  foreign key is a
11bf0 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72  djusted.** accor
11c00 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  dingly..*/.void 
11c10 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65  sqlite3DeferFore
11c20 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50  ignKey(Parse *pP
11c30 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65  arse, int isDefe
11c40 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53  rred){.#ifndef S
11c50 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
11c60 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a  GN_KEY.  Table *
11c70 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46  pTab;.  FKey *pF
11c80 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62  Key;.  if( (pTab
11c90 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
11ca0 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b  able)==0 || (pFK
11cb0 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79  ey = pTab->pFKey
11cc0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
11cd0 20 61 73 73 65 72 74 28 20 69 73 44 65 66 65 72   assert( isDefer
11ce0 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65  red==0 || isDefe
11cf0 72 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56  rred==1 ); /* EV
11d00 3a 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37 20  : R-30323-21917 
11d10 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65  */.  pFKey->isDe
11d20 66 65 72 72 65 64 20 3d 20 28 75 38 29 69 73 44  ferred = (u8)isD
11d30 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a  eferred;.#endif.
11d40 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
11d50 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
11d60 20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c   erase and refil
11d70 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20  l index *pIdx.  
11d80 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20  This is.** used 
11d90 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20  to initialize a 
11da0 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e  newly created in
11db0 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70  dex or to recomp
11dc0 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ute the.** conte
11dd0 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69  nt of an index i
11de0 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20  n response to a 
11df0 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e  REINDEX command.
11e00 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f  .**.** if memRoo
11e10 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67  tPage is not neg
11e20 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20  ative, it means 
11e30 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69  that the index i
11e40 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74  s newly.** creat
11e50 65 64 2e 20 20 54 68 65 20 72 65 67 69 73 74 65  ed.  The registe
11e60 72 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d  r specified by m
11e70 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61  emRootPage conta
11e80 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20  ins the.** root 
11e90 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
11ea0 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65  he index.  If me
11eb0 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67  mRootPage is neg
11ec0 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  ative, then.** t
11ed0 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  he index already
11ee0 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74   exists and must
11ef0 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f   be cleared befo
11f00 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65  re being refille
11f10 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f  d and.** the roo
11f20 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
11f30 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61   the index is ta
11f40 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d  ken from pIndex-
11f50 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  >tnum..*/.static
11f60 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66   void sqlite3Ref
11f70 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a  illIndex(Parse *
11f80 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
11f90 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f  Index, int memRo
11fa0 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65  otPage){.  Table
11fb0 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
11fc0 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65  >pTable;  /* The
11fd0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69   table that is i
11fe0 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
11ff0 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iTab = pParse->n
12000 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74  Tab++;     /* Bt
12010 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  ree cursor used 
12020 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e  for pTab */.  in
12030 74 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d  t iIdx = pParse-
12040 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20  >nTab++;     /* 
12050 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65  Btree cursor use
12060 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a  d for pIndex */.
12070 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
12080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12090 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
120a0 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20  op of loop */.  
120b0 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20  int tnum;       
120c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
120d0 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69  * Root page of i
120e0 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ndex */.  Vdbe *
120f0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
12100 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
12110 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
12120 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
12130 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ine */.  KeyInfo
12140 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20   *pKey;         
12150 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e          /* KeyIn
12160 66 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a  fo for index */.
12170 20 20 69 6e 74 20 72 65 67 49 64 78 4b 65 79 3b    int regIdxKey;
12180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12190 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 63 6f   /* Registers co
121a0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64  ntaining the ind
121b0 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  ex key */.  int 
121c0 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20  regRecord;      
121d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
121e0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61  gister holding a
121f0 73 73 65 6d 62 6c 69 65 64 20 69 6e 64 65 78 20  ssemblied index 
12200 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69  record */.  sqli
12210 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
12220 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68  ->db;      /* Th
12230 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
12240 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
12250 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
12260 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49  maToIndex(db, pI
12270 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  ndex->pSchema);.
12280 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12290 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
122a0 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ON.  if( sqlite3
122b0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
122c0 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58  , SQLITE_REINDEX
122d0 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
122e0 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44   0,.      db->aD
122f0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29  b[iDb].zName ) )
12300 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
12310 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  }.#endif..  /* R
12320 65 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c  equire a write-l
12330 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
12340 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73   to perform this
12350 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
12360 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
12370 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
12380 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61  ab->tnum, 1, pTa
12390 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20  b->zName);..  v 
123a0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
123b0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
123c0 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
123d0 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65   if( memRootPage
123e0 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20  >=0 ){.    tnum 
123f0 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20  = memRootPage;. 
12400 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d   }else{.    tnum
12410 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b   = pIndex->tnum;
12420 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12430 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65  AddOp2(v, OP_Cle
12440 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ar, tnum, iDb);.
12450 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c    }.  pKey = sql
12460 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
12470 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29  (pParse, pIndex)
12480 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12490 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
124a0 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75  Write, iIdx, tnu
124b0 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20  m, iDb, .       
124c0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
124d0 61 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45  ar *)pKey, P4_KE
124e0 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
124f0 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67    if( memRootPag
12500 65 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  e>=0 ){.    sqli
12510 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
12520 76 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  v, 1);.  }.  sql
12530 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
12540 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c  arse, iTab, iDb,
12550 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
12560 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  ad);.  addr1 = s
12570 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12580 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
12590 54 61 62 2c 20 30 29 3b 0a 20 20 72 65 67 52 65  Tab, 0);.  regRe
125a0 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
125b0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
125c0 3b 0a 20 20 72 65 67 49 64 78 4b 65 79 20 3d 20  ;.  regIdxKey = 
125d0 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
125e0 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20  ndexKey(pParse, 
125f0 70 49 6e 64 65 78 2c 20 69 54 61 62 2c 20 72 65  pIndex, iTab, re
12600 67 52 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20 69  gRecord, 1);.  i
12610 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  f( pIndex->onErr
12620 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20  or!=OE_None ){. 
12630 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 72 65 67     const int reg
12640 52 6f 77 69 64 20 3d 20 72 65 67 49 64 78 4b 65  Rowid = regIdxKe
12650 79 20 2b 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  y + pIndex->nCol
12660 75 6d 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69  umn;.    const i
12670 6e 74 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56  nt j2 = sqlite3V
12680 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
12690 29 20 2b 20 32 3b 0a 20 20 20 20 76 6f 69 64 20  ) + 2;.    void 
126a0 2a 20 63 6f 6e 73 74 20 70 52 65 67 4b 65 79 20  * const pRegKey 
126b0 3d 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  = SQLITE_INT_TO_
126c0 50 54 52 28 72 65 67 49 64 78 4b 65 79 29 3b 0a  PTR(regIdxKey);.
126d0 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 67 69  .    /* The regi
126e0 73 74 65 72 73 20 61 63 63 65 73 73 65 64 20 62  sters accessed b
126f0 79 20 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75  y the OP_IsUniqu
12700 65 20 6f 70 63 6f 64 65 20 77 65 72 65 20 61 6c  e opcode were al
12710 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 75  located.    ** u
12720 73 69 6e 67 20 73 71 6c 69 74 65 33 47 65 74 54  sing sqlite3GetT
12730 65 6d 70 52 61 6e 67 65 28 29 20 69 6e 73 69 64  empRange() insid
12740 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  e of the sqlite3
12750 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
12760 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61  ().    ** call a
12770 62 6f 76 65 2e 20 4a 75 73 74 20 62 65 66 6f 72  bove. Just befor
12780 65 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20  e that function 
12790 77 61 73 20 66 72 65 65 64 20 74 68 65 79 20 77  was freed they w
127a0 65 72 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20  ere released.   
127b0 20 2a 2a 20 28 6d 61 64 65 20 61 76 61 69 6c 61   ** (made availa
127c0 62 6c 65 20 74 6f 20 74 68 65 20 63 6f 6d 70 69  ble to the compi
127d0 6c 65 72 20 66 6f 72 20 72 65 75 73 65 29 20 75  ler for reuse) u
127e0 73 69 6e 67 20 0a 20 20 20 20 2a 2a 20 73 71 6c  sing .    ** sql
127f0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
12800 61 6e 67 65 28 29 2e 20 53 6f 20 69 6e 20 73 6f  ange(). So in so
12810 6d 65 20 77 61 79 73 20 68 61 76 69 6e 67 20 74  me ways having t
12820 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 0a 20  he OP_IsUnique. 
12830 20 20 20 2a 2a 20 6f 70 63 6f 64 65 20 75 73 65     ** opcode use
12840 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72   the values stor
12850 65 64 20 77 69 74 68 69 6e 20 73 65 65 6d 73 20  ed within seems 
12860 64 61 6e 67 65 72 6f 75 73 2e 20 48 6f 77 65 76  dangerous. Howev
12870 65 72 2c 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a  er, since.    **
12880 20 77 65 20 63 61 6e 20 62 65 20 73 75 72 65 20   we can be sure 
12890 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 74 65  that no other te
128a0 6d 70 20 72 65 67 69 73 74 65 72 73 20 68 61 76  mp registers hav
128b0 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  e been allocated
128c0 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 73 71  .    ** since sq
128d0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
128e0 52 61 6e 67 65 28 29 20 77 61 73 20 63 61 6c 6c  Range() was call
128f0 65 64 2c 20 69 74 20 69 73 20 73 61 66 65 20 74  ed, it is safe t
12900 6f 20 64 6f 20 73 6f 2e 0a 20 20 20 20 2a 2f 0a  o do so..    */.
12910 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12920 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 73 55 6e  ddOp4(v, OP_IsUn
12930 69 71 75 65 2c 20 69 49 64 78 2c 20 6a 32 2c 20  ique, iIdx, j2, 
12940 72 65 67 52 6f 77 69 64 2c 20 70 52 65 67 4b 65  regRowid, pRegKe
12950 79 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20  y, P4_INT32);.  
12960 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e    sqlite3HaltCon
12970 73 74 72 61 69 6e 74 28 0a 20 20 20 20 20 20 20  straint(.       
12980 20 70 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72   pParse, OE_Abor
12990 74 2c 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75  t, "indexed colu
129a0 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71  mns are not uniq
129b0 75 65 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b  ue", P4_STATIC);
129c0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
129d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
129e0 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20  dxInsert, iIdx, 
129f0 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
12a00 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
12a10 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
12a20 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71  EEKRESULT);.  sq
12a30 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
12a40 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
12a50 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
12a60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12a70 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
12a80 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  dr1+1);.  sqlite
12a90 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
12aa0 20 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74   addr1);.  sqlit
12ab0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
12ac0 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b  OP_Close, iTab);
12ad0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
12ae0 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
12af0 2c 20 69 49 64 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , iIdx);.}../*.*
12b00 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69  * Create a new i
12b10 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20  ndex for an SQL 
12b20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70  table.  pName1.p
12b30 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d  Name2 is the nam
12b40 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a  e of the index .
12b50 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20  ** and pTblList 
12b60 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
12b70 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
12b80 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
12b90 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62   Both will .** b
12ba0 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69  e NULL for a pri
12bb0 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69  mary key or an i
12bc0 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65  ndex that is cre
12bd0 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  ated to satisfy 
12be0 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73  a.** UNIQUE cons
12bf0 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62  traint.  If pTab
12c00 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72  le and pIndex ar
12c10 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72  e NULL, use pPar
12c20 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a  se->pNewTable.**
12c30 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f   as the table to
12c40 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50   be indexed.  pP
12c50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
12c60 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  is a table that 
12c70 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  is.** currently 
12c80 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
12c90 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41  d by a CREATE TA
12ca0 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
12cb0 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20  *.** pList is a 
12cc0 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
12cd0 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
12ce0 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55  pList will be NU
12cf0 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73  LL if this.** is
12d00 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
12d10 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61  r unique-constra
12d20 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20  int on the most 
12d30 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64  recent column ad
12d40 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61  ded.** to the ta
12d50 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
12d60 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
12d70 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
12d80 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65   index is create
12d90 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
12da0 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
12db0 20 74 6f 20 74 68 65 20 6e 65 77 20 49 6e 64 65   to the new Inde
12dc0 78 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  x.** structure. 
12dd0 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
12de0 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72  sqlite3AddPrimar
12df0 79 4b 65 79 28 29 20 74 6f 20 6d 61 72 6b 20 74  yKey() to mark t
12e00 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 74  he index.** as t
12e10 68 65 20 74 61 62 6c 65 73 20 70 72 69 6d 61 72  he tables primar
12e20 79 20 6b 65 79 20 28 49 6e 64 65 78 2e 61 75 74  y key (Index.aut
12e30 6f 49 6e 64 65 78 3d 3d 32 29 2e 0a 2a 2f 0a 49  oIndex==2)..*/.I
12e40 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 43 72 65  ndex *sqlite3Cre
12e50 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ateIndex(.  Pars
12e60 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
12e70 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * All informatio
12e80 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72  n about this par
12e90 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
12ea0 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69  Name1,     /* Fi
12eb0 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65  rst part of inde
12ec0 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
12ed0 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
12ee0 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53  pName2,     /* S
12ef0 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e  econd part of in
12f00 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
12f10 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69   NULL */.  SrcLi
12f20 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a  st *pTblName, /*
12f30 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e   Table to index.
12f40 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   Use pParse->pNe
12f50 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20  wTable if 0 */. 
12f60 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
12f70 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66  ,   /* A list of
12f80 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
12f90 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
12fa0 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f  onError,       /
12fb0 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49  * OE_Abort, OE_I
12fc0 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63  gnore, OE_Replac
12fd0 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f  e, or OE_None */
12fe0 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  .  Token *pStart
12ff0 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
13000 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
13010 65 67 69 6e 73 20 74 68 69 73 20 73 74 61 74 65  egins this state
13020 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ment */.  Token 
13030 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 2f 2a 20  *pEnd,       /* 
13040 54 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f  The ")" that clo
13050 73 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49  ses the CREATE I
13060 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
13070 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
13080 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f  r,     /* Sort o
13090 72 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20  rder of primary 
130a0 6b 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d  key when pList==
130b0 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66  NULL */.  int if
130c0 4e 6f 74 45 78 69 73 74 20 20 20 20 20 2f 2a 20  NotExist     /* 
130d0 4f 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e  Omit error if in
130e0 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
130f0 74 73 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  ts */.){.  Index
13100 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20   *pRet = 0;     
13110 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 72 65  /* Pointer to re
13120 74 75 72 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20  turn */.  Table 
13130 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f  *pTab = 0;     /
13140 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  * Table to be in
13150 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  dexed */.  Index
13160 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20   *pIndex = 0;   
13170 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
13180 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  be created */.  
13190 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
131a0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
131b0 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  the index */.  i
131c0 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
131d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
131e0 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a   characters in z
131f0 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  Name */.  int i,
13200 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c   j;.  Token null
13210 49 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 61  Id;        /* Fa
13220 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20  ke token for an 
13230 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f  empty ID list */
13240 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b  .  DbFixer sFix;
13250 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61          /* For a
13260 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73  ssigning databas
13270 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c  e names to pTabl
13280 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  e */.  int sortO
13290 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31  rderMask;   /* 1
132a0 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69   to honor DESC i
132b0 6e 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69  n index.  0 to i
132c0 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69  gnore. */.  sqli
132d0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
132e0 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b  ->db;.  Db *pDb;
132f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13300 54 68 65 20 73 70 65 63 69 66 69 63 20 74 61 62  The specific tab
13310 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
13320 65 20 69 6e 64 65 78 65 64 20 64 61 74 61 62 61  e indexed databa
13330 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  se */.  int iDb;
13340 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13350 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  Index of the dat
13360 61 62 61 73 65 20 74 68 61 74 20 69 73 20 62 65  abase that is be
13370 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  ing written */. 
13380 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20   Token *pName = 
13390 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69  0;    /* Unquali
133a0 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65  fied name of the
133b0 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65   index to create
133c0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70   */.  struct Exp
133d0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73  rList_item *pLis
133e0 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f  tItem; /* For lo
133f0 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74  oping over pList
13400 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a   */.  int nCol;.
13410 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30    int nExtra = 0
13420 3b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61  ;.  char *zExtra
13430 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 74  ;..  assert( pSt
13440 61 72 74 3d 3d 30 20 7c 7c 20 70 45 6e 64 21 3d  art==0 || pEnd!=
13450 30 20 29 3b 20 2f 2a 20 70 45 6e 64 20 6d 75 73  0 ); /* pEnd mus
13460 74 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66  t be non-NULL if
13470 20 70 53 74 61 72 74 20 69 73 20 2a 2f 0a 20 20   pStart is */.  
13480 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
13490 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 20 20 20  nErr==0 );      
134a0 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20  /* Never called 
134b0 77 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72  with prior error
134c0 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d  s */.  if( db->m
134d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49  allocFailed || I
134e0 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
134f0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
13500 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
13510 7d 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  }.  if( SQLITE_O
13520 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
13530 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
13540 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
13550 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
13560 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
13570 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
13580 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
13590 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69    Return early i
135a0 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a  f not found..  *
135b0 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65  /.  if( pTblName
135c0 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55  !=0 ){..    /* U
135d0 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20  se the two-part 
135e0 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65  index name to de
135f0 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61  termine the data
13600 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20  base .    ** to 
13610 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74  search for the t
13620 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20  able. 'Fix' the 
13630 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
13640 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66  is db.    ** bef
13650 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74  ore looking up t
13660 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  he table..    */
13670 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
13680 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b  me1 && pName2 );
13690 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
136a0 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
136b0 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
136c0 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
136d0 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67     if( iDb<0 ) g
136e0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
136f0 69 6e 64 65 78 3b 0a 0a 23 69 66 6e 64 65 66 20  index;..#ifndef 
13700 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50  SQLITE_OMIT_TEMP
13710 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  DB.    /* If the
13720 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20   index name was 
13730 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65  unqualified, che
13740 63 6b 20 69 66 20 74 68 65 20 74 68 65 20 74 61  ck if the the ta
13750 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20  ble.    ** is a 
13760 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73  temp table. If s
13770 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  o, set the datab
13780 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74  ase to 1. Do not
13790 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   do this.    ** 
137a0 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20  if initialising 
137b0 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  a database schem
137c0 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  a..    */.    if
137d0 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
137e0 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   ){.      pTab =
137f0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c   sqlite3SrcListL
13800 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54  ookup(pParse, pT
13810 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  blName);.      i
13820 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20  f( pName2->n==0 
13830 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d  && pTab && pTab-
13840 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
13850 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a  b[1].pSchema ){.
13860 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b          iDb = 1;
13870 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
13880 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 73  endif..    if( s
13890 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
138a0 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
138b0 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65  , "index", pName
138c0 29 20 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c  ) &&.        sql
138d0 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26  ite3FixSrcList(&
138e0 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a  sFix, pTblName).
138f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
13900 42 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73  Because the pars
13910 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54  er constructs pT
13920 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69  blName from a si
13930 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c  ngle identifier,
13940 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
13950 33 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20  3FixSrcList can 
13960 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20  never fail. */. 
13970 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a       assert(0);.
13980 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d      }.    pTab =
13990 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
139a0 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ble(pParse, 0, p
139b0 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  TblName->a[0].zN
139c0 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54  ame, .        pT
139d0 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61  blName->a[0].zDa
139e0 74 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28  tabase);.    if(
139f0 20 21 70 54 61 62 20 7c 7c 20 64 62 2d 3e 6d 61   !pTab || db->ma
13a00 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
13a10 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
13a20 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dex;.    assert(
13a30 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
13a40 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
13a50 68 65 6d 61 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  hema );.  }else{
13a60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
13a70 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61  me==0 );.    pTa
13a80 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
13a90 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21  Table;.    if( !
13aa0 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74  pTab ) goto exit
13ab0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13ac0 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
13ad0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
13ae0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
13af0 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64  ;.  }.  pDb = &d
13b00 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
13b10 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
13b20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
13b30 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a  rse->nErr==0 );.
13b40 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
13b50 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d  NICmp(pTab->zNam
13b60 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
13b70 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 6d  ==0 .       && m
13b80 65 6d 63 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61  emcmp(&pTab->zNa
13b90 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f  me[7],"altertab_
13ba0 22 2c 39 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  ",9)!=0 ){.    s
13bb0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13bc0 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
13bd0 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
13be0 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  xed", pTab->zNam
13bf0 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
13c00 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
13c10 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
13c20 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69  TE_OMIT_VIEW.  i
13c30 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
13c40 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
13c50 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
13c60 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62  "views may not b
13c70 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20  e indexed");.   
13c80 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
13c90 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e  e_index;.  }.#en
13ca0 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
13cb0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
13cc0 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72  ABLE.  if( IsVir
13cd0 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
13ce0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13cf0 67 28 70 50 61 72 73 65 2c 20 22 76 69 72 74 75  g(pParse, "virtu
13d00 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f  al tables may no
13d10 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a  t be indexed");.
13d20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
13d30 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
13d40 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a  #endif..  /*.  *
13d50 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20  * Find the name 
13d60 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d  of the index.  M
13d70 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
13d80 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e  s not already an
13d90 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78  other.  ** index
13da0 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74   or table with t
13db0 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a  he same name.  .
13dc0 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74    **.  ** Except
13dd0 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20  ion:  If we are 
13de0 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65  reading the name
13df0 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69  s of permanent i
13e00 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a  ndices from the.
13e10 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74    ** sqlite_mast
13e20 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73  er table (becaus
13e30 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
13e40 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65  cess changed the
13e50 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a   schema) and.  *
13e60 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64  * one of the ind
13e70 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65  ex names collide
13e80 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20  s with the name 
13e90 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  of a temporary t
13ea0 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64  able or.  ** ind
13eb0 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ex, then we will
13ec0 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f   continue to pro
13ed0 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e  cess this index.
13ee0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e  .  **.  ** If pN
13ef0 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
13f00 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a  that we are.  **
13f10 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
13f20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55  primary key or U
13f30 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
13f40 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  .  We have to in
13f50 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77  vent our.  ** ow
13f60 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  n name..  */.  i
13f70 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( pName ){.    
13f80 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
13f90 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
13fa0 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   pName);.    if(
13fb0 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f   zName==0 ) goto
13fc0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
13fd0 65 78 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  ex;.    if( SQLI
13fe0 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
13ff0 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
14000 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
14010 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
14020 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
14030 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d    }.    if( !db-
14040 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
14050 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
14060 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
14070 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20  me, 0)!=0 ){.   
14080 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
14090 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68  rMsg(pParse, "th
140a0 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
140b0 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22   table named %s"
140c0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
140d0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
140e0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
140f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
14100 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
14110 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d  (db, zName, pDb-
14120 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  >zName)!=0 ){.  
14130 20 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78      if( !ifNotEx
14140 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ist ){.        s
14150 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14160 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73  Parse, "index %s
14170 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
14180 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
14190 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  }.      goto exi
141a0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
141b0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
141c0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e     int n;.    In
141d0 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20  dex *pLoop;.    
141e0 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e  for(pLoop=pTab->
141f0 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f  pIndex, n=1; pLo
14200 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
14210 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20  >pNext, n++){}. 
14220 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
14230 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73  e3MPrintf(db, "s
14240 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
14250 25 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s_%d", pTab->zN
14260 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28  ame, n);.    if(
14270 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
14280 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
14290 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
142a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
142b0 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69   for authorizati
142c0 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  on to create an 
142d0 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e  index..  */.#ifn
142e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
142f0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
14300 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
14310 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61   *zDb = pDb->zNa
14320 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
14330 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
14340 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
14350 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
14360 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29  (iDb), 0, zDb) )
14370 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
14380 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
14390 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51      }.    i = SQ
143a0 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45  LITE_CREATE_INDE
143b0 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54  X;.    if( !OMIT
143c0 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
143d0 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43  1 ) i = SQLITE_C
143e0 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
143f0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
14400 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
14410 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61  e, i, zName, pTa
14420 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
14430 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
14440 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
14450 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
14460 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d  ..  /* If pList=
14470 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69  =0, it means thi
14480 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
14490 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70  lled to make a p
144a0 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20  rimary.  ** key 
144b0 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20  out of the last 
144c0 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20  column added to 
144d0 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
144e0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20  construction..  
144f0 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66  ** So create a f
14500 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75  ake list to simu
14510 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a  late this..  */.
14520 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
14530 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d  {.    nullId.z =
14540 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62   pTab->aCol[pTab
14550 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b  ->nCol-1].zName;
14560 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20  .    nullId.n = 
14570 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
14580 28 63 68 61 72 2a 29 6e 75 6c 6c 49 64 2e 7a 29  (char*)nullId.z)
14590 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  ;.    pList = sq
145a0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
145b0 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30  end(pParse, 0, 0
145c0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
145d0 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
145e0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
145f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
14600 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  tSetName(pParse,
14610 20 70 4c 69 73 74 2c 20 26 6e 75 6c 6c 49 64 2c   pList, &nullId,
14620 20 30 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e   0);.    pList->
14630 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  a[0].sortOrder =
14640 20 28 75 38 29 73 6f 72 74 4f 72 64 65 72 3b 0a   (u8)sortOrder;.
14650 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65    }..  /* Figure
14660 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79   out how many by
14670 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 72 65  tes of space are
14680 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
14690 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20  re explicitly.  
146a0 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c  ** specified col
146b0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
146c0 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  names..  */.  fo
146d0 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
146e0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
146f0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
14700 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
14710 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 20  ;.    if( pExpr 
14720 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
14730 20 2a 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d   *pColl = pExpr-
14740 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 2f 2a  >pColl;.      /*
14750 20 45 69 74 68 65 72 20 70 43 6f 6c 6c 21 3d 30   Either pColl!=0
14760 20 6f 72 20 74 68 65 72 65 20 77 61 73 20 61 6e   or there was an
14770 20 4f 4f 4d 20 66 61 69 6c 75 72 65 2e 20 20 42   OOM failure.  B
14780 75 74 20 69 66 20 61 6e 20 4f 4f 4d 0a 20 20 20  ut if an OOM.   
14790 20 20 20 2a 2a 20 66 61 69 6c 75 72 65 20 77 65     ** failure we
147a0 20 68 61 76 65 20 71 75 69 74 20 62 65 66 6f 72   have quit befor
147b0 65 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20  e reaching this 
147c0 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  point. */.      
147d0 69 66 28 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c  if( ALWAYS(pColl
147e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 78  ) ){.        nEx
147f0 74 72 61 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69  tra += (1 + sqli
14800 74 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c  te3Strlen30(pCol
14810 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  l->zName));.    
14820 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
14830 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61   /* .  ** Alloca
14840 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72  te the index str
14850 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20  ucture. .  */.  
14860 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
14870 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
14880 20 20 6e 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e    nCol = pList->
14890 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 20  nExpr;.  pIndex 
148a0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
148b0 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20 20 20  cZero(db, .     
148c0 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b   sizeof(Index) +
148d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
148e0 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
148f0 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f    */.      sizeo
14900 66 28 69 6e 74 29 2a 6e 43 6f 6c 20 2b 20 20 20  f(int)*nCol +   
14910 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
14920 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20  .aiColumn   */. 
14930 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29       sizeof(int)
14940 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20  *(nCol+1) +     
14950 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77    /* Index.aiRow
14960 45 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20 73  Est   */.      s
14970 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 2a 6e 43  izeof(char *)*nC
14980 6f 6c 20 2b 20 20 20 20 20 20 20 20 2f 2a 20 49  ol +        /* I
14990 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20  ndex.azColl     
149a0 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
149b0 75 38 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20  u8)*nCol +      
149c0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
149d0 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 20  SortOrder */.   
149e0 20 20 20 6e 4e 61 6d 65 20 2b 20 31 20 2b 20 20     nName + 1 +  
149f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a00 2f 2a 20 49 6e 64 65 78 2e 7a 4e 61 6d 65 20 20  /* Index.zName  
14a10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6e 45 78      */.      nEx
14a20 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20  tra             
14a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
14a40 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
14a50 6e 61 6d 65 73 20 2a 2f 0a 20 20 29 3b 0a 20 20  names */.  );.  
14a60 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
14a70 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
14a80 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
14a90 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  ex;.  }.  pIndex
14aa0 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72  ->azColl = (char
14ab0 2a 2a 29 28 26 70 49 6e 64 65 78 5b 31 5d 29 3b  **)(&pIndex[1]);
14ac0 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  .  pIndex->aiCol
14ad0 75 6d 6e 20 3d 20 28 69 6e 74 20 2a 29 28 26 70  umn = (int *)(&p
14ae0 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43  Index->azColl[nC
14af0 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  ol]);.  pIndex->
14b00 61 69 52 6f 77 45 73 74 20 3d 20 28 75 6e 73 69  aiRowEst = (unsi
14b10 67 6e 65 64 20 2a 29 28 26 70 49 6e 64 65 78 2d  gned *)(&pIndex-
14b20 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 5d 29  >aiColumn[nCol])
14b30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72  ;.  pIndex->aSor
14b40 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a 29 28  tOrder = (u8 *)(
14b50 26 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73  &pIndex->aiRowEs
14b60 74 5b 6e 43 6f 6c 2b 31 5d 29 3b 0a 20 20 70 49  t[nCol+1]);.  pI
14b70 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63  ndex->zName = (c
14b80 68 61 72 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e  har *)(&pIndex->
14b90 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d  aSortOrder[nCol]
14ba0 29 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 28 63  );.  zExtra = (c
14bb0 68 61 72 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e  har *)(&pIndex->
14bc0 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 2b 31 5d 29 3b  zName[nName+1]);
14bd0 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65 78  .  memcpy(pIndex
14be0 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ->zName, zName, 
14bf0 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64  nName+1);.  pInd
14c00 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  ex->pTable = pTa
14c10 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  b;.  pIndex->nCo
14c20 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  lumn = pList->nE
14c30 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f  xpr;.  pIndex->o
14c40 6e 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45  nError = (u8)onE
14c50 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  rror;.  pIndex->
14c60 61 75 74 6f 49 6e 64 65 78 20 3d 20 28 75 38 29  autoIndex = (u8)
14c70 28 70 4e 61 6d 65 3d 3d 30 29 3b 0a 20 20 70 49  (pName==0);.  pI
14c80 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20  ndex->pSchema = 
14c90 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
14ca0 68 65 6d 61 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  hema;..  /* Chec
14cb0 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 73  k to see if we s
14cc0 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43  hould honor DESC
14cd0 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64   requests on ind
14ce0 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a  ex columns.  */.
14cf0 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
14d00 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  ma->file_format>
14d10 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72  =4 ){.    sortOr
14d20 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20  derMask = -1;   
14d30 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f  /* Honor DESC */
14d40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f  .  }else{.    so
14d50 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b  rtOrderMask = 0;
14d60 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45      /* Ignore DE
14d70 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  SC */.  }..  /* 
14d80 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  Scan the names o
14d90 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  f the columns of
14da0 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
14db0 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a   indexed and.  *
14dc0 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d  * load the colum
14dd0 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74  n indices into t
14de0 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  he Index structu
14df0 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65  re.  Report an e
14e00 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79  rror.  ** if any
14e10 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66   column is not f
14e20 6f 75 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ound..  **.  ** 
14e30 54 4f 44 4f 3a 20 20 41 64 64 20 61 20 74 65 73  TODO:  Add a tes
14e40 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  t to make sure t
14e50 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 6f 6c  hat the same col
14e60 75 6d 6e 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64  umn is not named
14e70 0a 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  .  ** more than 
14e80 6f 6e 63 65 20 77 69 74 68 69 6e 20 74 68 65 20  once within the 
14e90 73 61 6d 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c  same index.  Onl
14ea0 79 20 74 68 65 20 66 69 72 73 74 20 69 6e 73 74  y the first inst
14eb0 61 6e 63 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65  ance of.  ** the
14ec0 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65   column will eve
14ed0 72 20 62 65 20 75 73 65 64 20 62 79 20 74 68 65  r be used by the
14ee0 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74   optimizer.  Not
14ef0 65 20 74 68 61 74 20 75 73 69 6e 67 20 74 68 65  e that using the
14f00 0a 20 20 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d  .  ** same colum
14f10 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  n more than once
14f20 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72   cannot be an er
14f30 72 6f 72 20 62 65 63 61 75 73 65 20 74 68 61 74  ror because that
14f40 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 62 72 65   would .  ** bre
14f50 61 6b 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  ak backwards com
14f60 70 61 74 69 62 69 6c 69 74 79 20 2d 20 69 74 20  patibility - it 
14f70 6e 65 65 64 73 20 74 6f 20 62 65 20 61 20 77 61  needs to be a wa
14f80 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f  rning..  */.  fo
14f90 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d  r(i=0, pListItem
14fa0 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69  =pList->a; i<pLi
14fb0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
14fc0 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20  pListItem++){.  
14fd0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
14fe0 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74 49 74  olName = pListIt
14ff0 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 43  em->zName;.    C
15000 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a  olumn *pTabCol;.
15010 20 20 20 20 69 6e 74 20 72 65 71 75 65 73 74 65      int requeste
15020 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  dSortOrder;.    
15030 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20  char *zColl;    
15040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15050 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  * Collation sequ
15060 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20  ence name */..  
15070 20 20 66 6f 72 28 6a 3d 30 2c 20 70 54 61 62 43    for(j=0, pTabC
15080 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a  ol=pTab->aCol; j
15090 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
150a0 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20  , pTabCol++){.  
150b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
150c0 74 72 49 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c  trICmp(zColName,
150d0 20 70 54 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29   pTabCol->zName)
150e0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
150f0 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54   }.    if( j>=pT
15100 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
15110 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
15120 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
15130 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d   %s has no colum
15140 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20  n named %s",.   
15150 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
15160 2c 20 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20  , zColName);.   
15170 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
15180 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
15190 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  .    pIndex->aiC
151a0 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20  olumn[i] = j;.  
151b0 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69    /* Justificati
151c0 6f 6e 20 6f 66 20 74 68 65 20 41 4c 57 41 59 53  on of the ALWAYS
151d0 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70  (pListItem->pExp
151e0 72 2d 3e 70 43 6f 6c 6c 29 3a 20 20 42 65 63 61  r->pColl):  Beca
151f0 75 73 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  use of.    ** th
15200 65 20 77 61 79 20 74 68 65 20 22 69 64 78 6c 69  e way the "idxli
15210 73 74 22 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c  st" non-terminal
15220 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20   is constructed 
15230 62 79 20 74 68 65 20 70 61 72 73 65 72 2c 0a 20  by the parser,. 
15240 20 20 20 2a 2a 20 69 66 20 70 4c 69 73 74 49 74     ** if pListIt
15250 65 6d 2d 3e 70 45 78 70 72 20 69 73 20 6e 6f 74  em->pExpr is not
15260 20 6e 75 6c 6c 20 74 68 65 6e 20 65 69 74 68 65   null then eithe
15270 72 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  r pListItem->pEx
15280 70 72 2d 3e 70 43 6f 6c 6c 0a 20 20 20 20 2a 2a  pr->pColl.    **
15290 20 6d 75 73 74 20 65 78 69 73 74 20 6f 72 20 65   must exist or e
152a0 6c 73 65 20 74 68 65 72 65 20 6d 75 73 74 20 68  lse there must h
152b0 61 76 65 20 62 65 65 6e 20 61 6e 20 4f 4f 4d 20  ave been an OOM 
152c0 65 72 72 6f 72 2e 20 20 42 75 74 20 69 66 20 74  error.  But if t
152d0 68 65 72 65 0a 20 20 20 20 2a 2a 20 77 61 73 20  here.    ** was 
152e0 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2c 20 77 65  an OOM error, we
152f0 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 72 65 61   would never rea
15300 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a  ch this point. *
15310 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 49  /.    if( pListI
15320 74 65 6d 2d 3e 70 45 78 70 72 20 26 26 20 41 4c  tem->pExpr && AL
15330 57 41 59 53 28 70 4c 69 73 74 49 74 65 6d 2d 3e  WAYS(pListItem->
15340 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 29 20 29 7b  pExpr->pColl) ){
15350 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c  .      int nColl
15360 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  ;.      zColl = 
15370 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
15380 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a  ->pColl->zName;.
15390 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71        nColl = sq
153a0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
153b0 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  oll) + 1;.      
153c0 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d  assert( nExtra>=
153d0 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d  nColl );.      m
153e0 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 7a 43  emcpy(zExtra, zC
153f0 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20  oll, nColl);.   
15400 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72     zColl = zExtr
15410 61 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20  a;.      zExtra 
15420 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  += nColl;.      
15430 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b  nExtra -= nColl;
15440 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15450 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e    zColl = pTab->
15460 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20  aCol[j].zColl;. 
15470 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20       if( !zColl 
15480 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c  ){.        zColl
15490 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
154a0 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ->zName;.      }
154b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
154c0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
154d0 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43   !sqlite3LocateC
154e0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
154f0 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 67  Coll) ){.      g
15500 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
15510 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
15520 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
15530 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20  i] = zColl;.    
15540 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
15550 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e  er = pListItem->
15560 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74  sortOrder & sort
15570 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70  OrderMask;.    p
15580 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
15590 72 5b 69 5d 20 3d 20 28 75 38 29 72 65 71 75 65  r[i] = (u8)reque
155a0 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20  stedSortOrder;. 
155b0 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61   }.  sqlite3Defa
155c0 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78  ultRowEst(pIndex
155d0 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  );..  if( pTab==
155e0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
155f0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  e ){.    /* This
15600 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65   routine has bee
15610 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  n called to crea
15620 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  te an automatic 
15630 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a  index as a.    *
15640 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52  * result of a PR
15650 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
15660 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20  QUE clause on a 
15670 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f  column definitio
15680 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50  n, or.    ** a P
15690 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
156a0 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c  IQUE clause foll
156b0 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e  owing the column
156c0 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20   definitions..  
156d0 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66    ** i.e. one of
156e0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
156f0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78  CREATE TABLE t(x
15700 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29   PRIMARY KEY, y)
15710 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20  ;.    ** CREATE 
15720 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e  TABLE t(x, y, UN
15730 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20  IQUE(x, y));.   
15740 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65   **.    ** Eithe
15750 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20  r way, check to 
15760 73 65 65 20 69 66 20 74 68 65 20 74 61 62 6c 65  see if the table
15770 20 61 6c 72 65 61 64 79 20 68 61 73 20 73 75 63   already has suc
15780 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20  h an index. If. 
15790 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20     ** so, don't 
157a0 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67 20  bother creating 
157b0 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f  this one. This o
157c0 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20  nly applies to. 
157d0 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61     ** automatica
157e0 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 69  lly created indi
157f0 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64  ces. Users can d
15800 6f 20 61 73 20 74 68 65 79 20 77 69 73 68 20 77  o as they wish w
15810 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69  ith.    ** expli
15820 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20  cit indices..   
15830 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 77 6f 20 55   **.    ** Two U
15840 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59  NIQUE or PRIMARY
15850 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73   KEY constraints
15860 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
15870 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 2a  equivalent.    *
15880 2a 20 28 61 6e 64 20 74 68 75 73 20 73 75 70 70  * (and thus supp
15890 72 65 73 73 69 6e 67 20 74 68 65 20 73 65 63 6f  ressing the seco
158a0 6e 64 20 6f 6e 65 29 20 65 76 65 6e 20 69 66 20  nd one) even if 
158b0 74 68 65 79 20 68 61 76 65 20 64 69 66 66 65 72  they have differ
158c0 65 6e 74 0a 20 20 20 20 2a 2a 20 73 6f 72 74 20  ent.    ** sort 
158d0 6f 72 64 65 72 73 2e 0a 20 20 20 20 2a 2a 0a 20  orders..    **. 
158e0 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 61     ** If there a
158f0 72 65 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6c  re different col
15900 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
15910 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6c 75 6d   or if the colum
15920 6e 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  ns of.    ** the
15930 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 63 63 75   constraint occu
15940 72 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 6f  r in different o
15950 72 64 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20  rders, then the 
15960 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a  constraints are.
15970 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65      ** considere
15980 64 20 64 69 73 74 69 6e 63 74 20 61 6e 64 20 62  d distinct and b
15990 6f 74 68 20 72 65 73 75 6c 74 20 69 6e 20 73 65  oth result in se
159a0 70 61 72 61 74 65 20 69 6e 64 69 63 65 73 2e 0a  parate indices..
159b0 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78      */.    Index
159c0 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
159d0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
159e0 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
159f0 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
15a00 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61    int k;.      a
15a10 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45  ssert( pIdx->onE
15a20 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b  rror!=OE_None );
15a30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15a40 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29  Idx->autoIndex )
15a50 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15a60 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
15a70 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20  =OE_None );..   
15a80 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f     if( pIdx->nCo
15a90 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43  lumn!=pIndex->nC
15aa0 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65  olumn ) continue
15ab0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b  ;.      for(k=0;
15ac0 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   k<pIdx->nColumn
15ad0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
15ae0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 3b 0a  const char *z1;.
15af0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
15b00 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20  ar *z2;.        
15b10 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
15b20 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61  mn[k]!=pIndex->a
15b30 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65  iColumn[k] ) bre
15b40 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d  ak;.        z1 =
15b50 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d   pIdx->azColl[k]
15b60 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70  ;.        z2 = p
15b70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d  Index->azColl[k]
15b80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 31  ;.        if( z1
15b90 21 3d 7a 32 20 26 26 20 73 71 6c 69 74 65 33 53  !=z2 && sqlite3S
15ba0 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29  trICmp(z1, z2) )
15bb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
15bc0 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64        if( k==pId
15bd0 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  x->nColumn ){.  
15be0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
15bf0 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d  onError!=pIndex-
15c00 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  >onError ){.    
15c10 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f        /* This co
15c20 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65 73  nstraint creates
15c30 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20   the same index 
15c40 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20  as a previous.  
15c50 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74          ** const
15c60 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64 20  raint specified 
15c70 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65  somewhere in the
15c80 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
15c90 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20  atement..       
15ca0 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68     ** However th
15cb0 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  e ON CONFLICT cl
15cc0 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65 72  auses are differ
15cd0 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69  ent. If both thi
15ce0 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
15cf0 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74  constraint and t
15d00 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75 69  he previous equi
15d10 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e  valent constrain
15d20 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a  t have explicit.
15d30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20            ** ON 
15d40 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
15d50 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f   this is an erro
15d60 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73  r. Otherwise, us
15d70 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  e the.          
15d80 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70  ** explicitly sp
15d90 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f 75  ecified behaviou
15da0 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e  r for the index.
15db0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
15dc0 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70 49          if( !(pI
15dd0 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
15de0 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65  Default || pInde
15df0 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
15e00 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20  efault) ){.     
15e10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
15e20 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
15e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e40 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20  "conflicting ON 
15e50 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
15e60 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b   specified", 0);
15e70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15e80 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
15e90 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
15ea0 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ault ){.        
15eb0 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f      pIdx->onErro
15ec0 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  r = pIndex->onEr
15ed0 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ror;.          }
15ee0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15ef0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
15f00 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
15f10 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
15f20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20  /* Link the new 
15f30 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
15f40 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64  to its table and
15f50 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20   to the other.  
15f60 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
15f70 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73  abase structures
15f80 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  . .  */.  if( db
15f90 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
15fa0 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
15fb0 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
15fc0 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e  Insert(&pIndex->
15fd0 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
15fe0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
15ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
16000 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 71 6c 69  dex->zName, sqli
16010 74 65 33 53 74 72 6c 65 6e 33 30 28 70 49 6e 64  te3Strlen30(pInd
16020 65 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20  ex->zName),.    
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16040 20 20 20 20 20 20 70 49 6e 64 65 78 29 3b 0a 20        pIndex);. 
16050 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
16060 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e    assert( p==pIn
16070 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  dex );  /* Mallo
16080 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
16090 65 64 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e  ed */.      db->
160a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
160b0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
160c0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
160d0 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c      }.    db->fl
160e0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
160f0 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20  ternChanges;.   
16100 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
16110 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78   ){.      pIndex
16120 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69  ->tnum = db->ini
16130 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d  t.newTnum;.    }
16140 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
16150 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
16160 69 73 20 30 20 74 68 65 6e 20 63 72 65 61 74 65  is 0 then create
16170 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69   the index on di
16180 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69  sk.  This.  ** i
16190 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20  nvolves writing 
161a0 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74  the index into t
161b0 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
161c0 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  and filling in t
161d0 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69  he.  ** index wi
161e0 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  th the current t
161f0 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20  able contents.. 
16200 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d   **.  ** The db-
16210 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20  >init.busy is 0 
16220 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 66 69  when the user fi
16230 72 73 74 20 65 6e 74 65 72 73 20 61 20 43 52 45  rst enters a CRE
16240 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20  ATE INDEX .  ** 
16250 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e  command.  db->in
16260 69 74 2e 62 75 73 79 20 69 73 20 31 20 77 68 65  it.busy is 1 whe
16270 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20  n a database is 
16280 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a  opened and .  **
16290 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
162a0 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61  atements are rea
162b0 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73  d out of the mas
162c0 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20  ter table.  In. 
162d0 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63   ** the latter c
162e0 61 73 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c  ase the index al
162f0 72 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20  ready exists on 
16300 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77  disk, which is w
16310 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74  hy.  ** we don't
16320 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74   want to recreat
16330 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  e it..  **.  ** 
16340 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69  If pTblName==0 i
16350 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64  t means this ind
16360 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  ex is generated 
16370 61 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  as a primary key
16380 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20  .  ** or UNIQUE 
16390 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20  constraint of a 
163a0 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
163b0 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74  tement.  Since t
163c0 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61  he table.  ** ha
163d0 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61  s just been crea
163e0 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ted, it contains
163f0 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65   no data and the
16400 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a   index initializ
16410 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20  ation.  ** step 
16420 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a  can be skipped..
16430 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 20 2f 2a 20    */.  else{ /* 
16440 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
16450 79 3d 3d 30 20 29 20 2a 2f 0a 20 20 20 20 56 64  y==0 ) */.    Vd
16460 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20  be *v;.    char 
16470 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20  *zStmt;.    int 
16480 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
16490 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d 20  >nMem;..    v = 
164a0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
164b0 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
164c0 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  v==0 ) goto exit
164d0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
164e0 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74  .    /* Create t
164f0 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20  he rootpage for 
16500 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f  the index.    */
16510 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
16520 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
16530 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
16540 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16550 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65  AddOp2(v, OP_Cre
16560 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 69  ateIndex, iDb, i
16570 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61  Mem);..    /* Ga
16580 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  ther the complet
16590 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52  e text of the CR
165a0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
165b0 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a  ment into.    **
165c0 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61   the zStmt varia
165d0 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ble.    */.    i
165e0 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20  f( pStart ){.   
165f0 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 21     assert( pEnd!
16600 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 );.      /* A
16610 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74   named index wit
16620 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52  h an explicit CR
16630 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
16640 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53  ment */.      zS
16650 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
16660 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54 45  intf(db, "CREATE
16670 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a  %s INDEX %.*s",.
16680 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d          onError=
16690 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20  =OE_None ? "" : 
166a0 22 20 55 4e 49 51 55 45 22 2c 0a 20 20 20 20 20  " UNIQUE",.     
166b0 20 20 20 70 45 6e 64 2d 3e 7a 20 2d 20 70 4e 61     pEnd->z - pNa
166c0 6d 65 2d 3e 7a 20 2b 20 31 2c 0a 20 20 20 20 20  me->z + 1,.     
166d0 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20     pName->z);.  
166e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
166f0 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  * An automatic i
16700 6e 64 65 78 20 63 72 65 61 74 65 64 20 62 79 20  ndex created by 
16710 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
16720 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
16730 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a  nt */.      /* z
16740 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
16750 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20  rintf(""); */.  
16760 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20      zStmt = 0;. 
16770 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
16780 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c   an entry in sql
16790 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74  ite_master for t
167a0 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f  his index.    */
167b0 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
167c0 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
167d0 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54  .        "INSERT
167e0 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55   INTO %Q.%s VALU
167f0 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51  ES('index',%Q,%Q
16800 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20  ,#%d,%Q);",.    
16810 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
16820 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
16830 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20  ABLE(iDb),.     
16840 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
16850 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ,.        pTab->
16860 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 69  zName,.        i
16870 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53 74  Mem,.        zSt
16880 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  mt.    );.    sq
16890 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
168a0 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  zStmt);..    /* 
168b0 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77  Fill the index w
168c0 69 74 68 20 64 61 74 61 20 61 6e 64 20 72 65 70  ith data and rep
168d0 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e  arse the schema.
168e0 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69   Code an OP_Expi
168f0 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76  re.    ** to inv
16900 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d  alidate all pre-
16910 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
16920 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nts..    */.    
16930 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a  if( pTblName ){.
16940 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66        sqlite3Ref
16950 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
16960 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a   pIndex, iMem);.
16970 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61        sqlite3Cha
16980 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
16990 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
169a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
169b0 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  v, OP_ParseSchem
169c0 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 0a 20 20  a, iDb, 0, 0,.  
169d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
169e0 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d  rintf(db, "name=
169f0 27 25 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a  '%q'", pIndex->z
16a00 4e 61 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d 49  Name), P4_DYNAMI
16a10 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
16a20 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
16a30 50 5f 45 78 70 69 72 65 2c 20 30 29 3b 0a 20 20  P_Expire, 0);.  
16a40 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68    }.  }..  /* Wh
16a50 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64  en adding an ind
16a60 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ex to the list o
16a70 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20  f indices for a 
16a80 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a  table, make.  **
16a90 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65   sure all indice
16aa0 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70  s labeled OE_Rep
16ab0 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20  lace come after 
16ac0 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65  all those labele
16ad0 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65  d.  ** OE_Ignore
16ae0 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
16af0 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72  sary for the cor
16b00 72 65 63 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  rect constraint 
16b10 63 68 65 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65  check.  ** proce
16b20 73 73 69 6e 67 20 28 69 6e 20 73 71 6c 69 74 65  ssing (in sqlite
16b30 33 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61  3GenerateConstra
16b40 69 6e 74 43 68 65 63 6b 73 28 29 29 20 61 73 20  intChecks()) as 
16b50 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44  part of.  ** UPD
16b60 41 54 45 20 61 6e 64 20 49 4e 53 45 52 54 20 73  ATE and INSERT s
16b70 74 61 74 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a  tatements.  .  *
16b80 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
16b90 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d  .busy || pTblNam
16ba0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  e==0 ){.    if( 
16bb0 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
16bc0 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e  ace || pTab->pIn
16bd0 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  dex==0.         
16be0 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d  || pTab->pIndex-
16bf0 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70  >onError==OE_Rep
16c00 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e  lace){.      pIn
16c10 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61  dex->pNext = pTa
16c20 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
16c30 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20   pTab->pIndex = 
16c40 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73  pIndex;.    }els
16c50 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
16c60 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70  pOther = pTab->p
16c70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69  Index;.      whi
16c80 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  le( pOther->pNex
16c90 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65  t && pOther->pNe
16ca0 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  xt->onError!=OE_
16cb0 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20  Replace ){.     
16cc0 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68     pOther = pOth
16cd0 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
16ce0 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d   }.      pIndex-
16cf0 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d  >pNext = pOther-
16d00 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f  >pNext;.      pO
16d10 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49  ther->pNext = pI
16d20 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
16d30 70 52 65 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20  pRet = pIndex;. 
16d40 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20     pIndex = 0;. 
16d50 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75   }..  /* Clean u
16d60 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  p before exiting
16d70 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f   */.exit_create_
16d80 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e  index:.  if( pIn
16d90 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dex ){.    sqlit
16da0 65 33 5f 66 72 65 65 28 70 49 6e 64 65 78 2d 3e  e3_free(pIndex->
16db0 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 73 71  zColAff);.    sq
16dc0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16dd0 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73  pIndex);.  }.  s
16de0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
16df0 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
16e00 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
16e10 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 62 6c  tDelete(db, pTbl
16e20 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
16e30 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
16e40 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
16e50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20  ;.}../*.** Fill 
16e60 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45  the Index.aiRowE
16e70 73 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20  st[] array with 
16e80 64 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74  default informat
16e90 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f  ion - informatio
16ea0 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 20  n.** to be used 
16eb0 77 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f 74  when we have not
16ec0 20 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45   run the ANALYZE
16ed0 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
16ee0 61 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20 73  aiRowEst[0] is s
16ef0 75 70 70 6f 73 65 20 74 6f 20 63 6f 6e 74 61 69  uppose to contai
16f00 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
16f10 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
16f20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20  index..** Since 
16f30 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20  we do not know, 
16f40 67 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e  guess 1 million.
16f50 20 20 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73    aiRowEst[1] is
16f60 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
16f70 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
16f80 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
16f90 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e  le that match an
16fa0 79 20 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c  y particular val
16fb0 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72  ue of the.** fir
16fc0 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
16fd0 20 69 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73   index.  aiRowEs
16fe0 74 5b 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d  t[2] is an estim
16ff0 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
17000 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61  r.** of rows tha
17010 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74  t match any part
17020 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 69 61 74  icular combiniat
17030 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74  ion of the first
17040 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66   2 columns.** of
17050 20 74 68 65 20 69 6e 64 65 78 2e 20 20 41 6e 64   the index.  And
17060 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 74 20 6d   so forth.  It m
17070 75 73 74 20 61 6c 77 61 79 73 20 62 65 20 74 68  ust always be th
17080 65 20 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a  e case that.*.**
17090 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77             aiRow
170a0 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74  Est[N]<=aiRowEst
170b0 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20  [N-1].**        
170c0 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d     aiRowEst[N]>=
170d0 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72  1.**.** Apart fr
170e0 6f 6d 20 74 68 61 74 2c 20 77 65 20 68 61 76 65  om that, we have
170f0 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e   little to go on
17100 20 62 65 73 69 64 65 73 20 69 6e 74 75 69 74 69   besides intuiti
17110 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20  on as to.** how 
17120 61 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c  aiRowEst[] shoul
17130 64 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  d be initialized
17140 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 73 20 67  .  The numbers g
17150 65 6e 65 72 61 74 65 64 20 68 65 72 65 0a 2a 2a  enerated here.**
17160 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74 79   are based on ty
17170 70 69 63 61 6c 20 76 61 6c 75 65 73 20 66 6f 75  pical values fou
17180 6e 64 20 69 6e 20 61 63 74 75 61 6c 20 69 6e 64  nd in actual ind
17190 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ices..*/.void sq
171a0 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45  lite3DefaultRowE
171b0 73 74 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  st(Index *pIdx){
171c0 0a 20 20 75 6e 73 69 67 6e 65 64 20 2a 61 20 3d  .  unsigned *a =
171d0 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 3b   pIdx->aiRowEst;
171e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
171f0 72 74 28 20 61 21 3d 30 20 29 3b 0a 20 20 61 5b  rt( a!=0 );.  a[
17200 30 5d 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20  0] = 1000000;.  
17210 66 6f 72 28 69 3d 70 49 64 78 2d 3e 6e 43 6f 6c  for(i=pIdx->nCol
17220 75 6d 6e 3b 20 69 3e 3d 35 3b 20 69 2d 2d 29 7b  umn; i>=5; i--){
17230 0a 20 20 20 20 61 5b 69 5d 20 3d 20 35 3b 0a 20  .    a[i] = 5;. 
17240 20 7d 0a 20 20 77 68 69 6c 65 28 20 69 3e 3d 31   }.  while( i>=1
17250 20 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 31   ){.    a[i] = 1
17260 31 20 2d 20 69 3b 0a 20 20 20 20 69 2d 2d 3b 0a  1 - i;.    i--;.
17270 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78 2d 3e    }.  if( pIdx->
17280 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
17290 20 29 7b 0a 20 20 20 20 61 5b 70 49 64 78 2d 3e   ){.    a[pIdx->
172a0 6e 43 6f 6c 75 6d 6e 5d 20 3d 20 31 3b 0a 20 20  nColumn] = 1;.  
172b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
172c0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f  routine will dro
172d0 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61  p an existing na
172e0 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73  med index.  This
172f0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c   routine.** impl
17300 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20  ements the DROP 
17310 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e  INDEX statement.
17320 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
17330 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20  DropIndex(Parse 
17340 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
17350 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45   *pName, int ifE
17360 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65 78 20  xists){.  Index 
17370 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20  *pIndex;.  Vdbe 
17380 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
17390 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
173a0 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73    int iDb;..  as
173b0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
173c0 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e 65  rr==0 );   /* Ne
173d0 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ver called with 
173e0 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a  prior errors */.
173f0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
17400 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
17410 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
17420 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ex;.  }.  assert
17430 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
17440 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45   );.  if( SQLITE
17450 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
17460 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
17470 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
17480 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
17490 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
174a0 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
174b0 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pName->a[0].zNam
174c0 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
174d0 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28  Database);.  if(
174e0 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20   pIndex==0 ){.  
174f0 20 20 69 66 28 20 21 69 66 45 78 69 73 74 73 20    if( !ifExists 
17500 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
17510 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
17520 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a   "no such index:
17530 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b   %S", pName, 0);
17540 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
17550 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
17560 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   1;.    goto exi
17570 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
17580 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  }.  if( pIndex->
17590 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20  autoIndex ){.   
175a0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
175b0 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
175c0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
175d0 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22  UNIQUE ".      "
175e0 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
175f0 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74  onstraint cannot
17600 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29   be dropped", 0)
17610 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
17620 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
17630 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
17640 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
17650 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
17660 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
17670 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
17680 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
17690 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
176a0 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54  ROP_INDEX;.    T
176b0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
176c0 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  dex->pTable;.   
176d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
176e0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
176f0 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  zName;.    const
17700 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43   char *zTab = SC
17710 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b  HEMA_TABLE(iDb);
17720 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
17730 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
17740 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
17750 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29   zTab, 0, zDb) )
17760 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
17770 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
17780 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49    }.    if( !OMI
17790 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 20  T_TEMPDB && iDb 
177a0 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  ) code = SQLITE_
177b0 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  DROP_TEMP_INDEX;
177c0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
177d0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
177e0 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e  , code, pIndex->
177f0 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
17800 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
17810 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
17820 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
17830 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
17840 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
17850 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78  remove the index
17860 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61   and from the ma
17870 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
17880 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
17890 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
178a0 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
178b0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
178c0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
178d0 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
178e0 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
178f0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45  arse,.       "DE
17900 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
17910 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a  WHERE name=%Q",.
17920 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
17930 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
17940 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20  A_TABLE(iDb),.  
17950 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
17960 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  me.    );.    if
17970 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
17980 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73  le(db, "sqlite_s
17990 74 61 74 31 22 2c 20 64 62 2d 3e 61 44 62 5b 69  tat1", db->aDb[i
179a0 44 62 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  Db].zName) ){.  
179b0 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
179c0 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
179d0 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
179e0 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74  ROM %Q.sqlite_st
179f0 61 74 31 20 57 48 45 52 45 20 69 64 78 3d 25 51  at1 WHERE idx=%Q
17a00 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  ",.        db->a
17a10 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 70  Db[iDb].zName, p
17a20 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20  Index->zName.   
17a30 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
17a40 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
17a50 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
17a60 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  ;.    destroyRoo
17a70 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49  tPage(pParse, pI
17a80 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  ndex->tnum, iDb)
17a90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17aa0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72  eAddOp4(v, OP_Dr
17ab0 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c  opIndex, iDb, 0,
17ac0 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d   0, pIndex->zNam
17ad0 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74  e, 0);.  }..exit
17ae0 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73  _drop_index:.  s
17af0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
17b00 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ete(db, pName);.
17b10 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20  }../*.** pArray 
17b20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
17b30 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65  an array of obje
17b40 63 74 73 2e 20 20 45 61 63 68 20 6f 62 6a 65 63  cts.  Each objec
17b50 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61  t in the.** arra
17b60 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74  y is szEntry byt
17b70 65 73 20 69 6e 20 73 69 7a 65 2e 20 20 54 68 69  es in size.  Thi
17b80 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61  s routine alloca
17b90 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6f 62 6a  tes a new.** obj
17ba0 65 63 74 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f  ect on the end o
17bb0 66 20 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a 0a  f the array..**.
17bc0 2a 2a 20 2a 70 6e 45 6e 74 72 79 20 69 73 20 74  ** *pnEntry is t
17bd0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
17be0 72 69 65 73 20 61 6c 72 65 61 64 79 20 69 6e 20  ries already in 
17bf0 75 73 65 2e 20 20 2a 70 6e 41 6c 6c 6f 63 20 69  use.  *pnAlloc i
17c00 73 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75  s.** the previou
17c10 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 69  sly allocated si
17c20 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e  ze of the array.
17c30 20 20 69 6e 69 74 53 69 7a 65 20 69 73 20 74 68    initSize is th
17c40 65 0a 2a 2a 20 73 75 67 67 65 73 74 65 64 20 69  e.** suggested i
17c50 6e 69 74 69 61 6c 20 61 72 72 61 79 20 73 69 7a  nitial array siz
17c60 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  e allocation..**
17c70 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 6f 66  .** The index of
17c80 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69   the new entry i
17c90 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20 2a 70  s returned in *p
17ca0 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Idx..**.** This 
17cb0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
17cc0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
17cd0 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   array of object
17ce0 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 69 67 68  s.  This.** migh
17cf0 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
17d00 20 74 68 65 20 70 41 72 72 61 79 20 70 61 72 61   the pArray para
17d10 6d 65 74 65 72 20 6f 72 20 69 74 20 6d 69 67 68  meter or it migh
17d20 74 20 62 65 20 61 20 64 69 66 66 65 72 65 6e 74  t be a different
17d30 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 66 20 74  .** pointer if t
17d40 68 65 20 61 72 72 61 79 20 77 61 73 20 72 65 73  he array was res
17d50 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ized..*/.void *s
17d60 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
17d70 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ate(.  sqlite3 *
17d80 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  db,      /* Conn
17d90 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79  ection to notify
17da0 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   of malloc failu
17db0 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  res */.  void *p
17dc0 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72  Array,     /* Ar
17dd0 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20  ray of objects. 
17de0 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f   Might be reallo
17df0 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73  cated */.  int s
17e00 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20  zEntry,      /* 
17e10 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a  Size of each obj
17e20 65 63 74 20 69 6e 20 74 68 65 20 61 72 72 61 79  ect in the array
17e30 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 69 74 53 69   */.  int initSi
17e40 7a 65 2c 20 20 20 20 20 2f 2a 20 53 75 67 67 65  ze,     /* Sugge
17e50 73 74 65 64 20 69 6e 69 74 69 61 6c 20 61 6c 6c  sted initial all
17e60 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d  ocation, in elem
17e70 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ents */.  int *p
17e80 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e  nEntry,     /* N
17e90 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73  umber of objects
17ea0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
17eb0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 41 6c  e */.  int *pnAl
17ec0 6c 6f 63 2c 20 20 20 20 20 2f 2a 20 43 75 72 72  loc,     /* Curr
17ed0 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
17ee0 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65  allocation, in e
17ef0 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  lements */.  int
17f00 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f   *pIdx         /
17f10 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e 64 65  * Write the inde
17f20 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20  x of a new slot 
17f30 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  here */.){.  cha
17f40 72 20 2a 7a 3b 0a 20 20 69 66 28 20 2a 70 6e 45  r *z;.  if( *pnE
17f50 6e 74 72 79 20 3e 3d 20 2a 70 6e 41 6c 6c 6f 63  ntry >= *pnAlloc
17f60 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e   ){.    void *pN
17f70 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 65 77 53  ew;.    int newS
17f80 69 7a 65 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65  ize;.    newSize
17f90 20 3d 20 28 2a 70 6e 41 6c 6c 6f 63 29 2a 32 20   = (*pnAlloc)*2 
17fa0 2b 20 69 6e 69 74 53 69 7a 65 3b 0a 20 20 20 20  + initSize;.    
17fb0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
17fc0 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72  Realloc(db, pArr
17fd0 61 79 2c 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e  ay, newSize*szEn
17fe0 74 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  try);.    if( pN
17ff0 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  ew==0 ){.      *
18000 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pIdx = -1;.     
18010 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a   return pArray;.
18020 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e 41 6c 6c      }.    *pnAll
18030 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  oc = sqlite3DbMa
18040 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e 65  llocSize(db, pNe
18050 77 29 2f 73 7a 45 6e 74 72 79 3b 0a 20 20 20 20  w)/szEntry;.    
18060 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20  pArray = pNew;. 
18070 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29   }.  z = (char*)
18080 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74  pArray;.  memset
18090 28 26 7a 5b 2a 70 6e 45 6e 74 72 79 20 2a 20 73  (&z[*pnEntry * s
180a0 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e  zEntry], 0, szEn
180b0 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  try);.  *pIdx = 
180c0 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 2b 2b 2a 70  *pnEntry;.  ++*p
180d0 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e  nEntry;.  return
180e0 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a   pArray;.}../*.*
180f0 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65  * Append a new e
18100 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69  lement to the gi
18110 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65  ven IdList.  Cre
18120 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74  ate a new IdList
18130 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a   if.** need be..
18140 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69  **.** A new IdLi
18150 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  st is returned, 
18160 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f  or NULL if mallo
18170 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64  c() fails..*/.Id
18180 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
18190 69 73 74 41 70 70 65 6e 64 28 73 71 6c 69 74 65  istAppend(sqlite
181a0 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
181b0 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
181c0 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ken){.  int i;. 
181d0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
181e0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
181f0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
18200 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69  (db, sizeof(IdLi
18210 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
18220 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
18230 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   0;.    pList->n
18240 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  Alloc = 0;.  }. 
18250 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69   pList->a = sqli
18260 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
18270 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20  (.      db,.    
18280 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20    pList->a,.    
18290 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e    sizeof(pList->
182a0 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 35 2c 0a  a[0]),.      5,.
182b0 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49        &pList->nI
182c0 64 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d  d,.      &pList-
182d0 3e 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 26  >nAlloc,.      &
182e0 69 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30  i.  );.  if( i<0
182f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   ){.    sqlite3I
18300 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
18310 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75  pList);.    retu
18320 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
18330 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
18340 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
18350 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29  oken(db, pToken)
18360 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
18370 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
18380 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a  e an IdList..*/.
18390 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69  void sqlite3IdLi
183a0 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
183b0 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c   *db, IdList *pL
183c0 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
183d0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
183e0 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
183f0 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; i<pList->nId;
18400 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
18410 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69  e3DbFree(db, pLi
18420 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
18430 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
18440 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Free(db, pList->
18450 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  a);.  sqlite3DbF
18460 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ree(db, pList);.
18470 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
18480 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69  the index in pLi
18490 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69  st of the identi
184a0 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20  fier named zId. 
184b0 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66   Return -1.** if
184c0 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69   not found..*/.i
184d0 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  nt sqlite3IdList
184e0 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c  Index(IdList *pL
184f0 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ist, const char 
18500 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
18510 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
18520 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
18530 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
18540 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
18550 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
18560 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
18570 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30  zName, zName)==0
18580 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d   ) return i;.  }
18590 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
185a0 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68  ./*.** Expand th
185b0 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  e space allocate
185c0 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  d for the given 
185d0 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62  SrcList object b
185e0 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45  y.** creating nE
185f0 78 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62  xtra new slots b
18600 65 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61  eginning at iSta
18610 72 74 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a  rt.  iStart is z
18620 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65  ero based..** Ne
18630 77 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f  w slots are zero
18640 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ed..**.** For ex
18650 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61  ample, suppose a
18660 20 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c   SrcList initial
18670 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20  ly contains two 
18680 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a  entries: A,B..**
18690 20 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77   To append 3 new
186a0 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68   entries onto th
186b0 65 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a  e end, do this:.
186c0 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33  **.**    sqlite3
186d0 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64  SrcListEnlarge(d
186e0 62 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20  b, pSrclist, 3, 
186f0 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  2);.**.** After 
18700 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69  the call above i
18710 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a  t would contain:
18720 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c    A, B, nil, nil
18730 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65  , nil..** If the
18740 20 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74   iStart argument
18750 20 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74   had been 1 inst
18760 65 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74  ead of 2, then t
18770 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75  he result.** wou
18780 6c 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41  ld have been:  A
18790 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c  , nil, nil, nil,
187a0 20 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20   B.  To prepend 
187b0 74 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a  the new slots,.*
187c0 2a 20 74 68 65 20 69 53 74 61 72 74 20 76 61 6c  * the iStart val
187d0 75 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20  ue would be 0.  
187e0 54 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20  The result then 
187f0 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c  would.** be: nil
18800 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42  , nil, nil, A, B
18810 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
18820 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
18830 61 69 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74  ails the SrcList
18840 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20   is unchanged.  
18850 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f  The.** db->mallo
18860 63 46 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c  cFailed flag wil
18870 6c 20 62 65 20 73 65 74 20 74 6f 20 74 72 75 65  l be set to true
18880 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
18890 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
188a0 72 67 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  rge(.  sqlite3 *
188b0 64 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74  db,       /* Dat
188c0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
188d0 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f   to notify of OO
188e0 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72  M errors */.  Sr
188f0 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
18900 20 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20   /* The SrcList 
18910 74 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a  to be enlarged *
18920 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
18930 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18940 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f   of new slots to
18950 20 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b   add to pSrc->a[
18960 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72  ] */.  int iStar
18970 74 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  t         /* Ind
18980 65 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20  ex in pSrc->a[] 
18990 6f 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f  of first new slo
189a0 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
189b0 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
189c0 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e  ecking on callin
189d0 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  g parameters */.
189e0 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74    assert( iStart
189f0 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
18a00 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20   nExtra>=1 );.  
18a10 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20  assert( pSrc!=0 
18a20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
18a30 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20  art<=pSrc->nSrc 
18a40 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
18a50 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61  e additional spa
18a60 63 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  ce if needed */.
18a70 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
18a80 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41  +nExtra>pSrc->nA
18a90 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c  lloc ){.    SrcL
18aa0 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69  ist *pNew;.    i
18ab0 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63  nt nAlloc = pSrc
18ac0 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20  ->nSrc+nExtra;. 
18ad0 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20     int nGot;.   
18ae0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
18af0 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72  bRealloc(db, pSr
18b00 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  c,.             
18b10 20 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20    sizeof(*pSrc) 
18b20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a  + (nAlloc-1)*siz
18b30 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20  eof(pSrc->a[0]) 
18b40 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
18b50 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
18b60 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
18b70 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
18b80 74 75 72 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d  turn pSrc;.    }
18b90 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77  .    pSrc = pNew
18ba0 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20 28 73 71  ;.    nGot = (sq
18bb0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
18bc0 65 28 64 62 2c 20 70 4e 65 77 29 20 2d 20 73 69  e(db, pNew) - si
18bd0 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f 73 69 7a  zeof(*pSrc))/siz
18be0 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b  eof(pSrc->a[0])+
18bf0 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c  1;.    pSrc->nAl
18c00 6c 6f 63 20 3d 20 28 75 31 36 29 6e 47 6f 74 3b  loc = (u16)nGot;
18c10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  .  }..  /* Move 
18c20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74  existing slots t
18c30 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74  hat come after t
18c40 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65  he newly inserte
18c50 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74  d slots.  ** out
18c60 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20   of the way */. 
18c70 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
18c80 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20  c-1; i>=iStart; 
18c90 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e  i--){.    pSrc->
18ca0 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53  a[i+nExtra] = pS
18cb0 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  rc->a[i];.  }.  
18cc0 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 28 69  pSrc->nSrc += (i
18cd0 31 36 29 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a  16)nExtra;..  /*
18ce0 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20   Zero the newly 
18cf0 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20  allocated slots 
18d00 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72  */.  memset(&pSr
18d10 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c  c->a[iStart], 0,
18d20 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b   sizeof(pSrc->a[
18d30 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66  0])*nExtra);.  f
18d40 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69  or(i=iStart; i<i
18d50 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b  Start+nExtra; i+
18d60 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b  +){.    pSrc->a[
18d70 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b  i].iCursor = -1;
18d80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72  .  }..  /* Retur
18d90 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
18da0 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c  he enlarged SrcL
18db0 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ist */.  return 
18dc0 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  pSrc;.}.../*.** 
18dd0 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62  Append a new tab
18de0 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67  le name to the g
18df0 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43  iven SrcList.  C
18e00 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c  reate a new SrcL
18e10 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
18e20 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  e.  A new entry 
18e30 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  is created in th
18e40 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69  e SrcList even i
18e50 66 20 70 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c  f pTable is NULL
18e60 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73  ..**.** A SrcLis
18e70 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
18e80 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  r NULL if there 
18e90 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  is an OOM error.
18ea0 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a 2a    The returned.*
18eb0 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20  * SrcList might 
18ec0 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
18ed0 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
18ee0 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74 20  was input or it 
18ef0 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e 65  might be.** a ne
18f00 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f 4f  w one.  If an OO
18f10 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  M error does occ
18f20 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70 72  urs, then the pr
18f30 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c 69  ior value of pLi
18f40 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69 6e  st.** that is in
18f50 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
18f60 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69 63  ine is automatic
18f70 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a  ally freed..**.*
18f80 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20 69  * If pDatabase i
18f90 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d  s not null, it m
18fa0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 61  eans that the ta
18fb0 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f  ble has an optio
18fc0 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  nal.** database 
18fd0 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69  name prefix.  Li
18fe0 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61 62  ke this:  "datab
18ff0 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65  ase.table".  The
19000 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f   pDatabase.** po
19010 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c  ints to the tabl
19020 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70  e name and the p
19030 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20  Table points to 
19040 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
19050 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73  e..** The SrcLis
19060 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c  t.a[].zName fiel
19070 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  d is filled with
19080 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
19090 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63  which might.** c
190a0 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20  ome from pTable 
190b0 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69 73  (if pDatabase is
190c0 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70   NULL) or from p
190d0 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53  Database.  .** S
190e0 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61  rcList.a[].zData
190f0 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77  base is filled w
19100 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
19110 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   name from pTabl
19120 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55  e,.** or with NU
19130 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73  LL if no databas
19140 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a  e is specified..
19150 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  **.** In other w
19160 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69  ords, if call li
19170 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
19180 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
19190 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
191a0 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,0);.**.** Then
191b0 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61   B is a table na
191c0 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  me and the datab
191d0 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70  ase name is unsp
191e0 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c  ecified.  If cal
191f0 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73  led.** like this
19200 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
19210 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
19220 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a  pend(D,A,B,C);.*
19230 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74  *.** Then C is t
19240 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
19250 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62  d B is the datab
19260 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20 43 20  ase name.  If C 
19270 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74 68  is defined.** th
19280 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49 6e 20  en so is B.  In 
19290 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 65 20  other words, we 
192a0 6e 65 76 65 72 20 68 61 76 65 20 61 20 63 61 73  never have a cas
192b0 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  e where:.**.**  
192c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
192d0 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
192e0 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68  0,C);.**.** Both
192f0 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74   pTable and pDat
19300 61 62 61 73 65 20 61 72 65 20 61 73 73 75 6d 65  abase are assume
19310 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20  d to be quoted. 
19320 20 54 68 65 79 20 61 72 65 20 64 65 71 75 6f 74   They are dequot
19330 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65 69  ed.** before bei
19340 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ng added to the 
19350 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c  SrcList..*/.SrcL
19360 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
19370 69 73 74 41 70 70 65 6e 64 28 0a 20 20 73 71 6c  istAppend(.  sql
19380 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
19390 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74   /* Connection t
193a0 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c  o notify of mall
193b0 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20  oc failures */. 
193c0 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c   SrcList *pList,
193d0 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74       /* Append t
193e0 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e 20  o this SrcList. 
193f0 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20 6e  NULL creates a n
19400 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  ew SrcList */.  
19410 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20  Token *pTable,  
19420 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
19430 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65  append */.  Toke
19440 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20 20 20  n *pDatabase    
19450 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20 74  /* Database of t
19460 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  he table */.){. 
19470 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
19480 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61  item *pItem;.  a
19490 73 73 65 72 74 28 20 70 44 61 74 61 62 61 73 65  ssert( pDatabase
194a0 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d 30  ==0 || pTable!=0
194b0 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68   );  /* Cannot h
194c0 61 76 65 20 43 20 77 69 74 68 6f 75 74 20 42 20  ave C without B 
194d0 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  */.  if( pList==
194e0 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
194f0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
19500 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
19510 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  SrcList) );.    
19520 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
19530 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69  eturn 0;.    pLi
19540 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a  st->nAlloc = 1;.
19550 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73 71    }.  pList = sq
19560 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
19570 72 67 65 28 64 62 2c 20 70 4c 69 73 74 2c 20 31  rge(db, pList, 1
19580 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a  , pList->nSrc);.
19590 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
195a0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
195b0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
195c0 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
195d0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
195e0 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  .  pItem = &pLis
195f0 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63  t->a[pList->nSrc
19600 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61  -1];.  if( pData
19610 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73  base && pDatabas
19620 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70  e->z==0 ){.    p
19630 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
19640 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  }.  if( pDatabas
19650 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a  e ){.    Token *
19660 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73  pTemp = pDatabas
19670 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65  e;.    pDatabase
19680 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70   = pTable;.    p
19690 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20  Table = pTemp;. 
196a0 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d   }.  pItem->zNam
196b0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
196c0 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61  romToken(db, pTa
196d0 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a  ble);.  pItem->z
196e0 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
196f0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
19700 64 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a  db, pDatabase);.
19710 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
19720 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
19730 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78  VdbeCursor index
19740 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20   numbers to all 
19750 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c  tables in a SrcL
19760 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ist.*/.void sqli
19770 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
19780 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70  Cursors(Parse *p
19790 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
197a0 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
197b0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
197c0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
197d0 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c   assert(pList ||
197e0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
197f0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
19800 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
19810 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
19820 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74  List->a; i<pList
19830 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
19840 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  em++){.      if(
19850 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e   pItem->iCursor>
19860 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
19870 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72    pItem->iCursor
19880 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
19890 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  +;.      if( pIt
198a0 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
198b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
198c0 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
198d0 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  rs(pParse, pItem
198e0 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29  ->pSelect->pSrc)
198f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19900 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
19910 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72  ete an entire Sr
19920 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20  cList including 
19930 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63  all its substruc
19940 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
19950 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
19960 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
19970 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
19980 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
19990 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
199a0 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
199b0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
199c0 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
199d0 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
199e0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
199f0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
19a00 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
19a10 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
19a20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
19a30 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
19a40 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
19a50 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
19a60 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
19a70 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
19a80 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65  db, pItem->zInde
19a90 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  x);.    sqlite3D
19aa0 65 6c 65 74 65 54 61 62 6c 65 28 70 49 74 65 6d  eleteTable(pItem
19ab0 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c  ->pTab);.    sql
19ac0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
19ad0 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  (db, pItem->pSel
19ae0 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ect);.    sqlite
19af0 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
19b00 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20  pItem->pOn);.   
19b10 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
19b20 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
19b30 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73  pUsing);.  }.  s
19b40 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
19b50 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
19b60 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
19b70 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
19b80 70 61 72 73 65 72 20 74 6f 20 61 64 64 20 61 20  parser to add a 
19b90 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a  new term to the.
19ba0 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77  ** end of a grow
19bb0 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  ing FROM clause.
19bc0 20 20 54 68 65 20 22 70 22 20 70 61 72 61 6d 65    The "p" parame
19bd0 74 65 72 20 69 73 20 74 68 65 20 70 61 72 74 20  ter is the part 
19be0 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  of.** the FROM c
19bf0 6c 61 75 73 65 20 74 68 61 74 20 68 61 73 20 61  lause that has a
19c00 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73  lready been cons
19c10 74 72 75 63 74 65 64 2e 20 20 22 70 22 20 69 73  tructed.  "p" is
19c20 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73   NULL.** if this
19c30 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65   is the first te
19c40 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rm of the FROM c
19c50 6c 61 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61  lause.  pTable a
19c60 6e 64 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20  nd pDatabase.** 
19c70 61 72 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  are the name of 
19c80 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61  the table and da
19c90 74 61 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20  tabase named in 
19ca0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
19cb0 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61  term..** pDataba
19cc0 73 65 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68  se is NULL if th
19cd0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
19ce0 71 75 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73  qualifier is mis
19cf0 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73  sing - the.** us
19d00 75 61 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68  ual case.  If th
19d10 65 20 74 65 72 6d 20 68 61 73 20 61 20 61 6c 69  e term has a ali
19d20 61 73 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20  as, then pAlias 
19d30 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
19d40 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49   alias token.  I
19d50 66 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20  f the term is a 
19d60 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70  subquery, then p
19d70 53 75 62 71 75 65 72 79 20 69 73 20 74 68 65 0a  Subquery is the.
19d80 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
19d90 65 6e 74 20 74 68 61 74 20 74 68 65 20 73 75 62  ent that the sub
19da0 71 75 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20  query encodes.  
19db0 54 68 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a  The pTable and.*
19dc0 2a 20 70 44 61 74 61 62 61 73 65 20 70 61 72 61  * pDatabase para
19dd0 6d 65 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20  meters are NULL 
19de0 66 6f 72 20 73 75 62 71 75 65 72 69 65 73 2e 20  for subqueries. 
19df0 20 54 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73   The pOn and pUs
19e00 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ing.** parameter
19e10 73 20 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  s are the conten
19e20 74 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20  t of the ON and 
19e30 55 53 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a  USING clauses..*
19e40 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65  *.** Return a ne
19e50 77 20 53 72 63 4c 69 73 74 20 77 68 69 63 68 20  w SrcList which 
19e60 65 6e 63 6f 64 65 73 20 69 73 20 74 68 65 20 46  encodes is the F
19e70 52 4f 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77  ROM with the new
19e80 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a  .** term added..
19e90 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
19ea0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
19eb0 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73  FromTerm(.  Pars
19ec0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
19ed0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
19ee0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
19ef0 69 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ist *p,         
19f00 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20      /* The left 
19f10 70 61 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  part of the FROM
19f20 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20   clause already 
19f30 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  seen */.  Token 
19f40 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20  *pTable,        
19f50 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
19f60 20 74 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f   table to add to
19f70 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19f80 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61   */.  Token *pDa
19f90 74 61 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a  tabase,       /*
19fa0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
19fb0 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
19fc0 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b   pTable */.  Tok
19fd0 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20  en *pAlias,     
19fe0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
19ff0 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
1a000 68 65 20 41 53 20 73 75 62 65 78 70 72 65 73 73  he AS subexpress
1a010 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
1a020 2a 70 53 75 62 71 75 65 72 79 2c 20 20 20 20 20  *pSubquery,     
1a030 20 2f 2a 20 41 20 73 75 62 71 75 65 72 79 20 75   /* A subquery u
1a040 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  sed in place of 
1a050 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  a table name */.
1a060 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20    Expr *pOn,    
1a070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1a080 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20   ON clause of a 
1a090 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74  join */.  IdList
1a0a0 20 2a 70 55 73 69 6e 67 20 20 20 20 20 20 20 20   *pUsing        
1a0b0 20 20 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63    /* The USING c
1a0c0 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20  lause of a join 
1a0d0 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  */.){.  struct S
1a0e0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1a0f0 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
1a100 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1a110 20 20 69 66 28 20 21 70 20 26 26 20 28 70 4f 6e    if( !p && (pOn
1a120 20 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b 0a 20   || pUsing) ){. 
1a130 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1a140 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 4a 4f  sg(pParse, "a JO
1a150 49 4e 20 63 6c 61 75 73 65 20 69 73 20 72 65 71  IN clause is req
1a160 75 69 72 65 64 20 62 65 66 6f 72 65 20 25 73 22  uired before %s"
1a170 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e 20 3f 20  , .      (pOn ? 
1a180 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22 29 0a  "ON" : "USING").
1a190 20 20 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20      );.    goto 
1a1a0 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f  append_from_erro
1a1b0 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c  r;.  }.  p = sql
1a1c0 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1a1d0 64 28 64 62 2c 20 70 2c 20 70 54 61 62 6c 65 2c  d(db, p, pTable,
1a1e0 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69   pDatabase);.  i
1a1f0 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52  f( p==0 || NEVER
1a200 28 70 2d 3e 6e 53 72 63 3d 3d 30 29 20 29 7b 0a  (p->nSrc==0) ){.
1a210 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f      goto append_
1a220 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  from_error;.  }.
1a230 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b    pItem = &p->a[
1a240 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 61 73  p->nSrc-1];.  as
1a250 73 65 72 74 28 20 70 41 6c 69 61 73 21 3d 30 20  sert( pAlias!=0 
1a260 29 3b 0a 20 20 69 66 28 20 70 41 6c 69 61 73 2d  );.  if( pAlias-
1a270 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d  >n ){.    pItem-
1a280 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65  >zAlias = sqlite
1a290 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1a2a0 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a  b, pAlias);.  }.
1a2b0 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74    pItem->pSelect
1a2c0 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20   = pSubquery;.  
1a2d0 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e  pItem->pOn = pOn
1a2e0 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e  ;.  pItem->pUsin
1a2f0 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65  g = pUsing;.  re
1a300 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65 6e 64  turn p;.. append
1a310 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 61  _from_error:.  a
1a320 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20  ssert( p==0 );. 
1a330 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1a340 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20 73  te(db, pOn);.  s
1a350 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1a360 74 65 28 64 62 2c 20 70 55 73 69 6e 67 29 3b 0a  te(db, pUsing);.
1a370 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1a380 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 71 75  elete(db, pSubqu
1a390 65 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ery);.  return 0
1a3a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
1a3b0 6e 20 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20  n INDEXED BY or 
1a3c0 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75  NOT INDEXED clau
1a3d0 73 65 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72  se to the most r
1a3e0 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 0a 2a  ecently added .*
1a3f0 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  * element of the
1a400 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 70 61 73   source-list pas
1a410 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
1a420 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76  d argument..*/.v
1a430 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
1a440 73 74 49 6e 64 65 78 65 64 42 79 28 50 61 72 73  stIndexedBy(Pars
1a450 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
1a460 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70 49  st *p, Token *pI
1a470 6e 64 65 78 65 64 42 79 29 7b 0a 20 20 61 73 73  ndexedBy){.  ass
1a480 65 72 74 28 20 70 49 6e 64 65 78 65 64 42 79 21  ert( pIndexedBy!
1a490 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26  =0 );.  if( p &&
1a4a0 20 41 4c 57 41 59 53 28 70 2d 3e 6e 53 72 63 3e   ALWAYS(p->nSrc>
1a4b0 30 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  0) ){.    struct
1a4c0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1a4d0 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e  Item = &p->a[p->
1a4e0 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73  nSrc-1];.    ass
1a4f0 65 72 74 28 20 70 49 74 65 6d 2d 3e 6e 6f 74 49  ert( pItem->notI
1a500 6e 64 65 78 65 64 3d 3d 30 20 26 26 20 70 49 74  ndexed==0 && pIt
1a510 65 6d 2d 3e 7a 49 6e 64 65 78 3d 3d 30 20 29 3b  em->zIndex==0 );
1a520 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 65  .    if( pIndexe
1a530 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49  dBy->n==1 && !pI
1a540 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20  ndexedBy->z ){. 
1a550 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49       /* A "NOT I
1a560 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65 20 77  NDEXED" clause w
1a570 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53 65 65  as supplied. See
1a580 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20 20 20   parse.y .      
1a590 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22 69 6e  ** construct "in
1a5a0 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72 20 64  dexed_opt" for d
1a5b0 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20  etails. */.     
1a5c0 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78   pItem->notIndex
1a5d0 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ed = 1;.    }els
1a5e0 65 7b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  e{.      pItem->
1a5f0 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  zIndex = sqlite3
1a600 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
1a610 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78  arse->db, pIndex
1a620 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  edBy);.    }.  }
1a630 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62  .}../*.** When b
1a640 75 69 6c 64 69 6e 67 20 75 70 20 61 20 46 52 4f  uilding up a FRO
1a650 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  M clause in the 
1a660 70 61 72 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e  parser, the join
1a670 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20   operator.** is 
1a680 69 6e 69 74 69 61 6c 6c 79 20 61 74 74 61 63 68  initially attach
1a690 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ed to the left o
1a6a0 70 65 72 61 6e 64 2e 20 20 42 75 74 20 74 68 65  perand.  But the
1a6b0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   code generator.
1a6c0 2a 2a 20 65 78 70 65 63 74 73 20 74 68 65 20 6a  ** expects the j
1a6d0 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  oin operator to 
1a6e0 62 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  be on the right 
1a6f0 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72  operand.  This r
1a700 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73  outine.** Shifts
1a710 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74   all join operat
1a720 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  ors from left to
1a730 20 72 69 67 68 74 20 66 6f 72 20 61 6e 20 65 6e   right for an en
1a740 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61  tire FROM.** cla
1a750 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  use..**.** Examp
1a760 6c 65 3a 20 53 75 70 70 6f 73 65 20 74 68 65 20  le: Suppose the 
1a770 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74 68 69  join is like thi
1a780 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
1a790 20 20 20 41 20 6e 61 74 75 72 61 6c 20 63 72 6f     A natural cro
1a7a0 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20  ss join B.**.** 
1a7b0 54 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20  The operator is 
1a7c0 22 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a  "natural cross j
1a7d0 6f 69 6e 22 2e 20 20 54 68 65 20 41 20 61 6e 64  oin".  The A and
1a7e0 20 42 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20   B operands are 
1a7f0 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e  stored.** in p->
1a800 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d  a[0] and p->a[1]
1a810 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  , respectively. 
1a820 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 69 74   The parser init
1a830 69 61 6c 6c 79 20 73 74 6f 72 65 73 20 74 68 65  ially stores the
1a840 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77 69 74  .** operator wit
1a850 68 20 41 2e 20 20 54 68 69 73 20 72 6f 75 74 69  h A.  This routi
1a860 6e 65 20 73 68 69 66 74 73 20 74 68 61 74 20 6f  ne shifts that o
1a870 70 65 72 61 74 6f 72 20 6f 76 65 72 20 74 6f 20  perator over to 
1a880 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  B..*/.void sqlit
1a890 65 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f  e3SrcListShiftJo
1a8a0 69 6e 54 79 70 65 28 53 72 63 4c 69 73 74 20 2a  inType(SrcList *
1a8b0 70 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70  p){.  if( p && p
1a8c0 2d 3e 61 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ->a ){.    int i
1a8d0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e  ;.    for(i=p->n
1a8e0 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  Src-1; i>0; i--)
1a8f0 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e  {.      p->a[i].
1a900 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b  jointype = p->a[
1a910 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20  i-1].jointype;. 
1a920 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d     }.    p->a[0]
1a930 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20  .jointype = 0;. 
1a940 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69   }.}../*.** Begi
1a950 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
1a960 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
1a970 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28  eginTransaction(
1a980 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1a990 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69  nt type){.  sqli
1a9a0 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
1a9b0 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  *v;.  int i;..  
1a9c0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d  assert( pParse!=
1a9d0 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  0 );.  db = pPar
1a9e0 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
1a9f0 28 20 64 62 21 3d 30 20 29 3b 0a 2f 2a 20 20 69  ( db!=0 );./*  i
1aa00 66 28 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  f( db->aDb[0].pB
1aa10 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 2a  t==0 ) return; *
1aa20 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  /.  if( sqlite3A
1aa30 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
1aa40 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
1aa50 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c  ION, "BEGIN", 0,
1aa60 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   0) ){.    retur
1aa70 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c  n;.  }.  v = sql
1aa80 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1aa90 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20  se);.  if( !v ) 
1aaa0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79  return;.  if( ty
1aab0 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20  pe!=TK_DEFERRED 
1aac0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
1aad0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
1aae0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1aaf0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54  beAddOp2(v, OP_T
1ab00 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28  ransaction, i, (
1ab10 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49  type==TK_EXCLUSI
1ab20 56 45 29 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  VE)+1);.      sq
1ab30 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
1ab40 65 65 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  ee(v, i);.    }.
1ab50 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
1ab60 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75  eAddOp2(v, OP_Au
1ab70 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b  toCommit, 0, 0);
1ab80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
1ab90 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
1aba0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
1abb0 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28  mmitTransaction(
1abc0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
1abd0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1abe0 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73   Vdbe *v;..  ass
1abf0 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29  ert( pParse!=0 )
1ac00 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
1ac10 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  >db;.  assert( d
1ac20 62 21 3d 30 20 29 3b 0a 2f 2a 20 20 69 66 28 20  b!=0 );./*  if( 
1ac30 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d  db->aDb[0].pBt==
1ac40 30 20 29 20 72 65 74 75 72 6e 3b 20 2a 2f 0a 20  0 ) return; */. 
1ac50 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1ac60 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1ac70 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
1ac80 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
1ac90 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
1aca0 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74  .  }.  v = sqlit
1acb0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1acc0 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
1acd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ace0 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  Op2(v, OP_AutoCo
1acf0 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  mmit, 1, 0);.  }
1ad00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
1ad10 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
1ad20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ad30 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74  RollbackTransact
1ad40 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
1ad50 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
1ad60 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  b;.  Vdbe *v;.. 
1ad70 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
1ad80 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61  =0 );.  db = pPa
1ad90 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
1ada0 74 28 20 64 62 21 3d 30 20 29 3b 0a 2f 2a 20 20  t( db!=0 );./*  
1adb0 69 66 28 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  if( db->aDb[0].p
1adc0 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20  Bt==0 ) return; 
1add0 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
1ade0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1adf0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
1ae00 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22  TION, "ROLLBACK"
1ae10 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72  , 0, 0) ){.    r
1ae20 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d  eturn;.  }.  v =
1ae30 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1ae40 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
1ae50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1ae60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1ae70 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31  AutoCommit, 1, 1
1ae80 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1ae90 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1aea0 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
1aeb0 61 72 73 65 72 20 77 68 65 6e 20 69 74 20 70 61  arser when it pa
1aec0 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74  rses a command t
1aed0 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c  o create,.** rel
1aee0 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
1aef0 20 61 6e 20 53 51 4c 20 73 61 76 65 70 6f 69 6e   an SQL savepoin
1af00 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  t. .*/.void sqli
1af10 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50 61 72  te3Savepoint(Par
1af20 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1af30 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  op, Token *pName
1af40 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
1af50 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1af60 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
1af70 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  db, pName);.  if
1af80 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56  ( zName ){.    V
1af90 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
1afa0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1afb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1afc0 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
1afd0 4f 4e 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ON.    static co
1afe0 6e 73 74 20 63 68 61 72 20 2a 61 7a 5b 5d 20 3d  nst char *az[] =
1aff0 20 7b 20 22 42 45 47 49 4e 22 2c 20 22 52 45 4c   { "BEGIN", "REL
1b000 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43 4b  EASE", "ROLLBACK
1b010 22 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  " };.    assert(
1b020 20 21 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49   !SAVEPOINT_BEGI
1b030 4e 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52  N && SAVEPOINT_R
1b040 45 4c 45 41 53 45 3d 3d 31 20 26 26 20 53 41 56  ELEASE==1 && SAV
1b050 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d  EPOINT_ROLLBACK=
1b060 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  =2 );.#endif.   
1b070 20 69 66 28 20 21 76 20 7c 7c 20 73 71 6c 69 74   if( !v || sqlit
1b080 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1b090 73 65 2c 20 53 51 4c 49 54 45 5f 53 41 56 45 50  se, SQLITE_SAVEP
1b0a0 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e  OINT, az[op], zN
1b0b0 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ame, 0) ){.     
1b0c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
1b0d0 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Parse->db, zName
1b0e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
1b0f0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1b100 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1b110 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f 70  OP_Savepoint, op
1b120 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 50  , 0, 0, zName, P
1b130 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
1b140 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
1b150 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61  re the TEMP data
1b160 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64  base is open and
1b170 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
1b180 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  se.  Return.** t
1b190 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
1b1a0 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20  ors.  Leave any 
1b1b0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
1b1c0 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
1b1d0 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ucture..*/.int s
1b1e0 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61  qlite3OpenTempDa
1b1f0 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50  tabase(Parse *pP
1b200 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
1b210 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1b220 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62  b;.  if( db->aDb
1b230 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70  [1].pBt==0 && !p
1b240 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
1b250 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
1b260 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20    Btree *pBt;.  
1b270 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69    static const i
1b280 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20 20 20 20  nt flags = .    
1b290 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1b2a0 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20  N_READWRITE |.  
1b2b0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1b2c0 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
1b2d0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1b2e0 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20  EN_EXCLUSIVE |. 
1b2f0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1b300 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
1b310 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  SE |.          S
1b320 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
1b330 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  DB;..    rc = sq
1b340 6c 69 74 65 33 42 74 72 65 65 46 61 63 74 6f 72  lite3BtreeFactor
1b350 79 28 64 62 2c 20 30 2c 20 30 2c 20 53 51 4c 49  y(db, 0, 0, SQLI
1b360 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
1b370 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 26 70  _SIZE, flags, &p
1b380 42 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Bt);.    if( rc!
1b390 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b3a0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1b3b0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
1b3c0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  ble to open a te
1b3d0 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
1b3e0 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65   ".        "file
1b3f0 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d   for storing tem
1b400 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b  porary tables");
1b410 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
1b420 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  c = rc;.      re
1b430 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1b440 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74    db->aDb[1].pBt
1b450 20 3d 20 70 42 74 3b 0a 20 20 20 20 61 73 73 65   = pBt;.    asse
1b460 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  rt( db->aDb[1].p
1b470 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66  Schema );.    if
1b480 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d  ( SQLITE_NOMEM==
1b490 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
1b4a0 61 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d  ageSize(pBt, db-
1b4b0 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 20 2d  >nextPagesize, -
1b4c0 31 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 64  1, 0) ){.      d
1b4d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1b4e0 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 1;.      retur
1b4f0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  n 1;.    }.    s
1b500 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
1b510 61 6c 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74  alMode(sqlite3Bt
1b520 72 65 65 50 61 67 65 72 28 70 42 74 29 2c 20 64  reePager(pBt), d
1b530 62 2d 3e 64 66 6c 74 4a 6f 75 72 6e 61 6c 4d 6f  b->dfltJournalMo
1b540 64 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  de);.  }.  retur
1b550 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
1b560 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
1b570 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69 66   that will verif
1b580 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
1b590 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a 2a 2a  kie and start.**
1b5a0 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
1b5b0 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d 65  ion for all name
1b5c0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  d database files
1b5d0 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6d  ..**.** It is im
1b5e0 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c 6c  portant that all
1b5f0 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73 20   schema cookies 
1b600 62 65 20 76 65 72 69 66 69 65 64 20 61 6e 64 20  be verified and 
1b610 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61 6e  all.** read tran
1b620 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74 61 72  sactions be star
1b630 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79 74 68  ted before anyth
1b640 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65 6e 73  ing else happens
1b650 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45 20   in.** the VDBE 
1b660 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20 74 68  program.  But th
1b670 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  is routine can b
1b680 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 6d  e called after m
1b690 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f 64  uch other.** cod
1b6a0 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e 65 72  e has been gener
1b6b0 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65 20 69  ated.  So here i
1b6c0 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a 2a  s what we do:.**
1b6d0 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69  .** The first ti
1b6e0 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  me this routine 
1b6f0 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 63 6f  is called, we co
1b700 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 74 68  de an OP_Goto th
1b710 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70 20  at.** will jump 
1b720 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  to a subroutine 
1b730 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
1b740 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68 65 6e  e program.  Then
1b750 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65 76   we.** record ev
1b760 65 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61  ery database tha
1b770 74 20 6e 65 65 64 73 20 69 74 73 20 73 63 68 65  t needs its sche
1b780 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e 20 74  ma verified in t
1b790 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63 6f  he.** pParse->co
1b7a0 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e 20  okieMask field. 
1b7b0 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20 61 6c   Later, after al
1b7c0 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61 73  l other code has
1b7d0 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61 74   been.** generat
1b7e0 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69  ed, the subrouti
1b7f0 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74 68 65  ne that does the
1b800 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61   cookie verifica
1b810 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74 61  tions and.** sta
1b820 72 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  rts the transact
1b830 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f 64  ions will be cod
1b840 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f 47 6f  ed and the OP_Go
1b850 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20 77  to P2 value.** w
1b860 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 70  ill be made to p
1b870 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73 75 62  oint to that sub
1b880 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 67 65  routine.  The ge
1b890 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  neration of the.
1b8a0 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  ** cookie verifi
1b8b0 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e  cation subroutin
1b8c0 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73 20 69  e code happens i
1b8d0 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43  n sqlite3FinishC
1b8e0 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  oding()..**.** I
1b8f0 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63 6f 64  f iDb<0 then cod
1b900 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 6f 6e  e the OP_Goto on
1b910 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74 20 66  ly - don't set f
1b920 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20 74 68  lag to verify th
1b930 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e 20 61  e.** schema on a
1b940 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20 20 54  ny databases.  T
1b950 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
1b960 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20  to position the 
1b970 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c 79  OP_Goto.** early
1b980 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20 62 65   in the code, be
1b990 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69 66 20  fore we know if 
1b9a0 61 6e 79 20 64 61 74 61 62 61 73 65 20 74 61 62  any database tab
1b9b0 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64  les will be used
1b9c0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1b9d0 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
1b9e0 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  a(Parse *pParse,
1b9f0 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72   int iDb){.  Par
1ba00 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
1ba10 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
1ba20 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20  evel(pParse);.. 
1ba30 20 69 66 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e   if( pToplevel->
1ba40 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20 29 7b  cookieGoto==0 ){
1ba50 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73  .    Vdbe *v = s
1ba60 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 54  qlite3GetVdbe(pT
1ba70 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 69 66  oplevel);.    if
1ba80 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
1ba90 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68    /* This only h
1baa0 61 70 70 65 6e 73 20 69 66 20 74 68 65 72 65 20  appens if there 
1bab0 77 61 73 20 61 20 70 72 69 6f 72 20 65 72 72 6f  was a prior erro
1bac0 72 20 2a 2f 0a 20 20 20 20 70 54 6f 70 6c 65 76  r */.    pToplev
1bad0 65 6c 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d  el->cookieGoto =
1bae0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1baf0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
1bb00 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a 20 20 69 66  , 0)+1;.  }.  if
1bb10 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20  ( iDb>=0 ){.    
1bb20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 54  sqlite3 *db = pT
1bb30 6f 70 6c 65 76 65 6c 2d 3e 64 62 3b 0a 20 20 20  oplevel->db;.   
1bb40 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 20 20   int mask;..    
1bb50 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e  assert( iDb<db->
1bb60 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nDb );.    asser
1bb70 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  t( db->aDb[iDb].
1bb80 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31  pBt!=0 || iDb==1
1bb90 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1bba0 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41  iDb<SQLITE_MAX_A
1bbb0 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 20  TTACHED+2 );.   
1bbc0 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a   mask = 1<<iDb;.
1bbd0 20 20 20 20 69 66 28 20 28 70 54 6f 70 6c 65 76      if( (pToplev
1bbe0 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26  el->cookieMask &
1bbf0 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20   mask)==0 ){.   
1bc00 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f     pToplevel->co
1bc10 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  okieMask |= mask
1bc20 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65  ;.      pTopleve
1bc30 6c 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69  l->cookieValue[i
1bc40 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  Db] = db->aDb[iD
1bc50 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  b].pSchema->sche
1bc60 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20  ma_cookie;.     
1bc70 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
1bc80 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
1bc90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70         sqlite3Op
1bca0 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70  enTempDatabase(p
1bcb0 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 20  Toplevel);.     
1bcc0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
1bcd0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
1bce0 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72  DBE code that pr
1bcf0 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67  epares for doing
1bd00 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68   an operation th
1bd10 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e  at.** might chan
1bd20 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ge the database.
1bd30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1bd40 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77  ine starts a new
1bd50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
1bd60 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61  we are not alrea
1bd70 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74  dy within.** a t
1bd80 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
1bd90 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77  we are already w
1bda0 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
1bdb0 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63  ion, then a chec
1bdc0 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74  kpoint.** is set
1bdd0 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74 65   if the setState
1bde0 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69  ment parameter i
1bdf0 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b  s true.  A check
1be00 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  point should.** 
1be10 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61  be set for opera
1be20 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74  tions that might
1be30 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20   fail (due to a 
1be40 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74  constraint) part
1be50 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74   of.** the way t
1be60 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68  hrough and which
1be70 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e   will need to un
1be80 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77  do some writes w
1be90 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
1bea0 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65  .** rollback the
1beb0 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69   whole transacti
1bec0 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69  on.  For operati
1bed0 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f  ons where all co
1bee0 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e  nstraints.** can
1bef0 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f   be checked befo
1bf00 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61  re any changes a
1bf10 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  re made to the d
1bf20 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e  atabase, it is n
1bf30 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72  ever.** necessar
1bf40 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74  y to undo a writ
1bf50 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70  e and the checkp
1bf60 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  oint should not 
1bf70 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  be set..*/.void 
1bf80 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
1bf90 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65  eOperation(Parse
1bfa0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65   *pParse, int se
1bfb0 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20  tStatement, int 
1bfc0 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  iDb){.  Parse *p
1bfd0 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
1bfe0 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
1bff0 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
1c000 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
1c010 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
1c020 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72  .  pToplevel->wr
1c030 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 44  iteMask |= 1<<iD
1c040 62 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  b;.  pToplevel->
1c050 69 73 4d 75 6c 74 69 57 72 69 74 65 20 7c 3d 20  isMultiWrite |= 
1c060 73 65 74 53 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a  setStatement;.}.
1c070 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20  ./*.** Indicate 
1c080 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65  that the stateme
1c090 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  nt currently und
1c0a0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
1c0b0 6d 69 67 68 74 20 77 72 69 74 65 0a 2a 2a 20 6d  might write.** m
1c0c0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6e 74  ore than one ent
1c0d0 72 79 20 28 65 78 61 6d 70 6c 65 3a 20 64 65 6c  ry (example: del
1c0e0 65 74 69 6e 67 20 6f 6e 65 20 72 6f 77 20 74 68  eting one row th
1c0f0 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 61 6e 6f  en inserting ano
1c100 74 68 65 72 2c 0a 2a 2a 20 69 6e 73 65 72 74 69  ther,.** inserti
1c110 6e 67 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ng multiple rows
1c120 20 69 6e 20 61 20 74 61 62 6c 65 2c 20 6f 72 20   in a table, or 
1c130 69 6e 73 65 72 74 69 6e 67 20 61 20 72 6f 77 20  inserting a row 
1c140 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65  and index entrie
1c150 73 2e 29 0a 2a 2a 20 49 66 20 61 6e 20 61 62 6f  s.).** If an abo
1c160 72 74 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  rt occurs after 
1c170 73 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 77 72  some of these wr
1c180 69 74 65 73 20 68 61 76 65 20 63 6f 6d 70 6c 65  ites have comple
1c190 74 65 64 2c 20 74 68 65 6e 20 69 74 20 77 69 6c  ted, then it wil
1c1a0 6c 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72  l.** be necessar
1c1b0 79 20 74 6f 20 75 6e 64 6f 20 74 68 65 20 63 6f  y to undo the co
1c1c0 6d 70 6c 65 74 65 64 20 77 72 69 74 65 73 2e 0a  mpleted writes..
1c1d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d  */.void sqlite3M
1c1e0 75 6c 74 69 57 72 69 74 65 28 50 61 72 73 65 20  ultiWrite(Parse 
1c1f0 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73  *pParse){.  Pars
1c200 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
1c210 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
1c220 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70  vel(pParse);.  p
1c230 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74  Toplevel->isMult
1c240 69 57 72 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f  iWrite = 1;.}../
1c250 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67  * .** The code g
1c260 65 6e 65 72 61 74 6f 72 20 63 61 6c 6c 73 20 74  enerator calls t
1c270 68 69 73 20 72 6f 75 74 69 6e 65 20 69 66 20 69  his routine if i
1c280 73 20 64 69 73 63 6f 76 65 72 73 20 74 68 61 74  s discovers that
1c290 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62   it is.** possib
1c2a0 6c 65 20 74 6f 20 61 62 6f 72 74 20 61 20 73 74  le to abort a st
1c2b0 61 74 65 6d 65 6e 74 20 70 72 69 6f 72 20 74 6f  atement prior to
1c2c0 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 6e   completion.  In
1c2d0 20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a 20 70 65   order to .** pe
1c2e0 72 66 6f 72 6d 20 74 68 69 73 20 61 62 6f 72 74  rform this abort
1c2f0 20 77 69 74 68 6f 75 74 20 63 6f 72 72 75 70 74   without corrupt
1c300 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1c310 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b  , we need to mak
1c320 65 0a 2a 2a 20 73 75 72 65 20 74 68 61 74 20 74  e.** sure that t
1c330 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
1c340 70 72 6f 74 65 63 74 65 64 20 62 79 20 61 20 73  protected by a s
1c350 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
1c360 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68  tion..**.** Tech
1c370 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79  nically, we only
1c380 20 6e 65 65 64 20 74 6f 20 73 65 74 20 74 68 65   need to set the
1c390 20 6d 61 79 41 62 6f 72 74 20 66 6c 61 67 20 69   mayAbort flag i
1c3a0 66 20 74 68 65 0a 2a 2a 20 69 73 4d 75 6c 74 69  f the.** isMulti
1c3b0 57 72 69 74 65 20 66 6c 61 67 20 77 61 73 20 70  Write flag was p
1c3c0 72 65 76 69 6f 75 73 6c 79 20 73 65 74 2e 20 20  reviously set.  
1c3d0 54 68 65 72 65 20 69 73 20 61 20 74 69 6d 65 20  There is a time 
1c3e0 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 73 75  dependency.** su
1c3f0 63 68 20 74 68 61 74 20 74 68 65 20 61 62 6f 72  ch that the abor
1c400 74 20 6d 75 73 74 20 6f 63 63 75 72 20 61 66 74  t must occur aft
1c410 65 72 20 74 68 65 20 6d 75 6c 74 69 77 72 69 74  er the multiwrit
1c420 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 0a 2a  e.  This makes.*
1c430 2a 20 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e 74  * some statement
1c440 73 20 69 6e 76 6f 6c 76 69 6e 67 20 74 68 65 20  s involving the 
1c450 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74  REPLACE conflict
1c460 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
1c470 72 69 74 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69  rithm.** go a li
1c480 74 74 6c 65 20 66 61 73 74 65 72 2e 20 20 42 75  ttle faster.  Bu
1c490 74 20 74 61 6b 69 6e 67 20 61 64 76 61 6e 74 61  t taking advanta
1c4a0 67 65 20 6f 66 20 74 68 69 73 20 74 69 6d 65 20  ge of this time 
1c4b0 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61  dependency.** ma
1c4c0 6b 65 73 20 69 74 20 6d 6f 72 65 20 64 69 66 66  kes it more diff
1c4d0 69 63 75 6c 74 20 74 6f 20 70 72 6f 76 65 20 74  icult to prove t
1c4e0 68 61 74 20 74 68 65 20 63 6f 64 65 20 69 73 20  hat the code is 
1c4f0 63 6f 72 72 65 63 74 20 28 69 6e 20 0a 2a 2a 20  correct (in .** 
1c500 70 61 72 74 69 63 75 6c 61 72 2c 20 69 74 20 70  particular, it p
1c510 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20  revents us from 
1c520 77 72 69 74 69 6e 67 20 61 6e 20 65 66 66 65 63  writing an effec
1c530 74 69 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tive.** implemen
1c540 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  tation of sqlite
1c550 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  3AssertMayAbort(
1c560 29 29 20 61 6e 64 20 73 6f 20 77 65 20 68 61 76  )) and so we hav
1c570 65 20 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74  e chosen.** to t
1c580 61 6b 65 20 74 68 65 20 73 61 66 65 20 72 6f 75  ake the safe rou
1c590 74 65 20 61 6e 64 20 73 6b 69 70 20 74 68 65 20  te and skip the 
1c5a0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f  optimization..*/
1c5b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 79  .void sqlite3May
1c5c0 41 62 6f 72 74 28 50 61 72 73 65 20 2a 70 50 61  Abort(Parse *pPa
1c5d0 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  rse){.  Parse *p
1c5e0 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
1c5f0 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
1c600 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c  pParse);.  pTopl
1c610 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72 74 20 3d  evel->mayAbort =
1c620 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64   1;.}../*.** Cod
1c630 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 74 68 61  e an OP_Halt tha
1c640 74 20 63 61 75 73 65 73 20 74 68 65 20 76 64 62  t causes the vdb
1c650 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 53  e to return an S
1c660 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
1c670 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68 65 20 6f  .** error. The o
1c680 6e 45 72 72 6f 72 20 70 61 72 61 6d 65 74 65 72  nError parameter
1c690 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63   determines whic
1c6a0 68 20 28 69 66 20 61 6e 79 29 20 6f 66 20 74 68  h (if any) of th
1c6b0 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61  e statement.** a
1c6c0 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74 20 74 72  nd/or current tr
1c6d0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
1c6e0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69  led back..*/.voi
1c6f0 64 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e  d sqlite3HaltCon
1c700 73 74 72 61 69 6e 74 28 50 61 72 73 65 20 2a 70  straint(Parse *p
1c710 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72  Parse, int onErr
1c720 6f 72 2c 20 63 68 61 72 20 2a 70 34 2c 20 69 6e  or, char *p4, in
1c730 74 20 70 34 74 79 70 65 29 7b 0a 20 20 56 64 62  t p4type){.  Vdb
1c740 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
1c750 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1c760 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45   if( onError==OE
1c770 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 73 71  _Abort ){.    sq
1c780 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50  lite3MayAbort(pP
1c790 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  arse);.  }.  sql
1c7a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1c7b0 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54  , OP_Halt, SQLIT
1c7c0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 6f 6e  E_CONSTRAINT, on
1c7d0 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34  Error, 0, p4, p4
1c7e0 74 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  type);.}../*.** 
1c7f0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1c800 70 49 6e 64 65 78 20 75 73 65 73 20 74 68 65 20  pIndex uses the 
1c810 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
1c820 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72  ce pColl.  Retur
1c830 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20  n.** true if it 
1c840 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69  does and false i
1c850 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  f it does not..*
1c860 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1c870 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
1c880 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69  atic int collati
1c890 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68  onMatch(const ch
1c8a0 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78  ar *zColl, Index
1c8b0 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74   *pIndex){.  int
1c8c0 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43   i;.  assert( zC
1c8d0 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  oll!=0 );.  for(
1c8e0 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e  i=0; i<pIndex->n
1c8f0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
1c900 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
1c910 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  = pIndex->azColl
1c920 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
1c930 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   z!=0 );.    if(
1c940 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
1c950 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  mp(z, zColl) ){.
1c960 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1c970 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1c980 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
1c990 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20  /*.** Recompute 
1c9a0 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70  all indices of p
1c9b0 54 61 62 20 74 68 61 74 20 75 73 65 20 74 68 65  Tab that use the
1c9c0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1c9d0 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66  nce pColl..** If
1c9e0 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72   pColl==0 then r
1c9f0 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
1ca00 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f  ices of pTab..*/
1ca10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ca20 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61  OMIT_REINDEX.sta
1ca30 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78  tic void reindex
1ca40 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
1ca50 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
1ca60 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43  , char const *zC
1ca70 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  oll){.  Index *p
1ca80 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
1ca90 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
1caa0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1cab0 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70  pTab */..  for(p
1cac0 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64  Index=pTab->pInd
1cad0 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
1cae0 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74  ex=pIndex->pNext
1caf0 29 7b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c  ){.    if( zColl
1cb00 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e  ==0 || collation
1cb10 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e  Match(zColl, pIn
1cb20 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  dex) ){.      in
1cb30 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
1cb40 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
1cb50 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
1cb60 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73  Schema);.      s
1cb70 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
1cb80 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
1cb90 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  , 0, iDb);.     
1cba0 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
1cbb0 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
1cbc0 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20  ex, -1);.    }. 
1cbd0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
1cbe0 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c  ** Recompute all
1cbf0 20 69 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20   indices of all 
1cc00 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61  tables in all da
1cc10 74 61 62 61 73 65 73 20 77 68 65 72 65 20 74 68  tabases where th
1cc20 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65  e.** indices use
1cc30 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
1cc40 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20  equence pColl.  
1cc50 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e  If pColl==0 then
1cc60 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c   recompute.** al
1cc70 6c 20 69 6e 64 69 63 65 73 20 65 76 65 72 79 77  l indices everyw
1cc80 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  here..*/.#ifndef
1cc90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
1cca0 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64  NDEX.static void
1ccb0 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
1ccc0 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
1ccd0 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f   char const *zCo
1cce0 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20  ll){.  Db *pDb; 
1ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd00 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64     /* A single d
1cd10 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
1cd20 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
1cd30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1cd40 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e  database index n
1cd50 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
1cd60 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1cd70 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  >db;   /* The da
1cd80 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1cd90 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20  n */.  HashElem 
1cda0 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *k;             
1cdb0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
1cdc0 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e  g over tables in
1cdd0 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20   pDb */.  Table 
1cde0 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
1cdf0 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
1ce00 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1ce10 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 44 62 3d 30   */..  for(iDb=0
1ce20 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69  , pDb=db->aDb; i
1ce30 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1ce40 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61  +, pDb++){.    a
1ce50 73 73 65 72 74 28 20 70 44 62 21 3d 30 20 29 3b  ssert( pDb!=0 );
1ce60 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74  .    for(k=sqlit
1ce70 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d  eHashFirst(&pDb-
1ce80 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
1ce90 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65  h);  k; k=sqlite
1cea0 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20  HashNext(k)){.  
1ceb0 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c      pTab = (Tabl
1cec0 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  e*)sqliteHashDat
1ced0 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e  a(k);.      rein
1cee0 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c  dexTable(pParse,
1cef0 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20   pTab, zColl);. 
1cf00 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
1cf10 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
1cf20 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52  e code for the R
1cf30 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
1cf40 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49  **.**        REI
1cf50 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20 20  NDEX            
1cf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf70 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 1.**        R
1cf80 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69  EINDEX  <collati
1cf90 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20 20  on>             
1cfa0 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20    -- 2.**       
1cfb0 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61   REINDEX  ?<data
1cfc0 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d  base>.?<tablenam
1cfd0 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20  e>  -- 3.**     
1cfe0 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61     REINDEX  ?<da
1cff0 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e  tabase>.?<indexn
1d000 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a  ame>  -- 4.**.**
1d010 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61   Form 1 causes a
1d020 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c  ll indices in al
1d030 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
1d040 61 73 65 73 20 74 6f 20 62 65 20 72 65 62 75 69  ases to be rebui
1d050 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65  lt..** Form 2 re
1d060 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63  builds all indic
1d070 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61  es in all databa
1d080 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65  ses that use the
1d090 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74   named.** collat
1d0a0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46  ing function.  F
1d0b0 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62  orms 3 and 4 reb
1d0c0 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69  uild the named i
1d0d0 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69  ndex or all.** i
1d0e0 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
1d0f0 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64  d with the named
1d100 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64   table..*/.#ifnd
1d110 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
1d120 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69  EINDEX.void sqli
1d130 74 65 33 52 65 69 6e 64 65 78 28 50 61 72 73 65  te3Reindex(Parse
1d140 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
1d150 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a  *pName1, Token *
1d160 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53  pName2){.  CollS
1d170 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
1d180 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
1d190 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ing sequence to 
1d1a0 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72  be reindexed, or
1d1b0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20   NULL */.  char 
1d1c0 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *z;             
1d1d0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1d1e0 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  f a table or ind
1d1f0 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ex */.  const ch
1d200 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20  ar *zDb;        
1d210 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1d220 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
1d230 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
1d240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d250 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  A table in the d
1d260 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64  atabase */.  Ind
1d270 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
1d280 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
1d290 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
1d2a0 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69  with pTab */.  i
1d2b0 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
1d2c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d2d0 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  e database index
1d2e0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c   number */.  sql
1d2f0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1d300 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20  e->db;   /* The 
1d310 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1d320 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ion */.  Token *
1d330 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20  pObjName;       
1d340 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1d350 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  the table or ind
1d360 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ex to be reindex
1d370 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64  ed */..  /* Read
1d380 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
1d390 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f  hema. If an erro
1d3a0 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
1d3b0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
1d3c0 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69  .  ** and code i
1d3d0 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
1d3e0 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69  urn NULL. */.  i
1d3f0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
1d400 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
1d410 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72  pParse) ){.    r
1d420 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66  eturn;.  }..  if
1d430 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20  ( pName1==0 ){. 
1d440 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61     reindexDataba
1d450 73 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a  ses(pParse, 0);.
1d460 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65      return;.  }e
1d470 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28 70 4e  lse if( NEVER(pN
1d480 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d  ame2==0) || pNam
1d490 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  e2->z==0 ){.    
1d4a0 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20  char *zColl;.   
1d4b0 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d   assert( pName1-
1d4c0 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20  >z );.    zColl 
1d4d0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1d4e0 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
1d4f0 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  b, pName1);.    
1d500 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74  if( !zColl ) ret
1d510 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  urn;.    pColl =
1d520 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
1d530 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
1d540 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20   zColl, 0);.    
1d550 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
1d560 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61     reindexDataba
1d570 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  ses(pParse, zCol
1d580 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1d590 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c  3DbFree(db, zCol
1d5a0 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  l);.      return
1d5b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1d5c0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
1d5d0 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20  oll);.  }.  iDb 
1d5e0 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
1d5f0 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
1d600 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f  me1, pName2, &pO
1d610 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69  bjName);.  if( i
1d620 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db<0 ) return;. 
1d630 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65   z = sqlite3Name
1d640 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f  FromToken(db, pO
1d650 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  bjName);.  if( z
1d660 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1d670 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
1d680 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62  b].zName;.  pTab
1d690 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
1d6a0 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b  ble(db, z, zDb);
1d6b0 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20  .  if( pTab ){. 
1d6c0 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
1d6d0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29  pParse, pTab, 0)
1d6e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
1d6f0 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
1d700 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49  return;.  }.  pI
1d710 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69  ndex = sqlite3Fi
1d720 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a  ndIndex(db, z, z
1d730 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  Db);.  sqlite3Db
1d740 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69  Free(db, z);.  i
1d750 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
1d760 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1d770 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
1d780 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
1d790 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
1d7a0 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
1d7b0 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  ex, -1);.    ret
1d7c0 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
1d7d0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1d7e0 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64  e, "unable to id
1d7f0 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63  entify the objec
1d800 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  t to be reindexe
1d810 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  d");.}.#endif../
1d820 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 64 79  *.** Return a dy
1d830 6e 61 6d 69 63 6c 79 20 61 6c 6c 6f 63 61 74 65  namicly allocate
1d840 64 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  d KeyInfo struct
1d850 75 72 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ure that can be 
1d860 75 73 65 64 0a 2a 2a 20 77 69 74 68 20 4f 50 5f  used.** with OP_
1d870 4f 70 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f  OpenRead or OP_O
1d880 70 65 6e 57 72 69 74 65 20 74 6f 20 61 63 63 65  penWrite to acce
1d890 73 73 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  ss database inde
1d8a0 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66  x pIdx..**.** If
1d8b0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 70   successful, a p
1d8c0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65  ointer to the ne
1d8d0 77 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72  w structure is r
1d8e0 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73  eturned. In this
1d8f0 20 63 61 73 65 0a 2a 2a 20 74 68 65 20 63 61 6c   case.** the cal
1d900 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
1d910 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 20 73  le for calling s
1d920 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1d930 20 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e   ) on the return
1d940 65 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 20  ed .** pointer. 
1d950 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1d960 72 73 20 28 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  rs (out of memor
1d970 79 20 6f 72 20 6d 69 73 73 69 6e 67 20 63 6f 6c  y or missing col
1d980 6c 61 74 69 6f 6e 20 0a 2a 2a 20 73 65 71 75 65  lation .** seque
1d990 6e 63 65 29 2c 20 4e 55 4c 4c 20 69 73 20 72 65  nce), NULL is re
1d9a0 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73  turned and the s
1d9b0 74 61 74 65 20 6f 66 20 70 50 61 72 73 65 20 75  tate of pParse u
1d9c0 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65 63  pdated to reflec
1d9d0 74 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 0a  t.** the error..
1d9e0 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
1d9f0 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
1da00 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
1da10 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69  ndex *pIdx){.  i
1da20 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  nt i;.  int nCol
1da30 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   = pIdx->nColumn
1da40 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 20 3d  ;.  int nBytes =
1da50 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29   sizeof(KeyInfo)
1da60 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65   + (nCol-1)*size
1da70 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 6e  of(CollSeq*) + n
1da80 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Col;.  sqlite3 *
1da90 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1daa0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
1dab0 20 3d 20 28 4b 65 79 49 6e 66 6f 20 2a 29 73 71   = (KeyInfo *)sq
1dac0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
1dad0 6f 28 64 62 2c 20 6e 42 79 74 65 73 29 3b 0a 0a  o(db, nBytes);..
1dae0 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
1daf0 20 20 70 4b 65 79 2d 3e 64 62 20 3d 20 70 50 61    pKey->db = pPa
1db00 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 4b 65  rse->db;.    pKe
1db10 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  y->aSortOrder = 
1db20 28 75 38 20 2a 29 26 28 70 4b 65 79 2d 3e 61 43  (u8 *)&(pKey->aC
1db30 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 20 20  oll[nCol]);.    
1db40 61 73 73 65 72 74 28 20 26 70 4b 65 79 2d 3e 61  assert( &pKey->a
1db50 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 3d  SortOrder[nCol]=
1db60 3d 26 28 28 28 75 38 20 2a 29 70 4b 65 79 29 5b  =&(((u8 *)pKey)[
1db70 6e 42 79 74 65 73 5d 29 20 29 3b 0a 20 20 20 20  nBytes]) );.    
1db80 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
1db90 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61   i++){.      cha
1dba0 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d  r *zColl = pIdx-
1dbb0 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >azColl[i];.    
1dbc0 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 20    assert( zColl 
1dbd0 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61  );.      pKey->a
1dbe0 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65  Coll[i] = sqlite
1dbf0 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
1dc00 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  Parse, zColl);. 
1dc10 20 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74       pKey->aSort
1dc20 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d  Order[i] = pIdx-
1dc30 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a  >aSortOrder[i];.
1dc40 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 2d 3e      }.    pKey->
1dc50 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 43  nField = (u16)nC
1dc60 6f 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  ol;.  }..  if( p
1dc70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
1dc80 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1dc90 28 64 62 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  (db, pKey);.    
1dca0 70 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pKey = 0;.  }.  
1dcb0 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a     return pKey;.}.