/ Hex Artifact Content
Login

Artifact 99894b89b7943b6f8337757facc4e61cef1d9508:


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 7b 0a 20 20 20   0;.  }else{.   
19c0: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
19d0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
19e0: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
19f0: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d   0;.  pParse->nM
1a00: 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  em = 0;.  pParse
1a10: 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70 50  ->nSet = 0;.  pP
1a20: 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a  arse->nVar = 0;.
1a30: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
1a40: 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 72  Mask = 0;.  pPar
1a50: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d  se->cookieGoto =
1a60: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e   0;.}../*.** Run
1a70: 20 74 68 65 20 70 61 72 73 65 72 20 61 6e 64 20   the parser and 
1a80: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 72  code generator r
1a90: 65 63 75 72 73 69 76 65 6c 79 20 69 6e 20 6f 72  ecursively in or
1aa0: 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a  der to generate.
1ab0: 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  ** code for the 
1ac0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 67 69  SQL statement gi
1ad0: 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ven onto the end
1ae0: 20 6f 66 20 74 68 65 20 70 50 61 72 73 65 20 63   of the pParse c
1af0: 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72 65 6e  ontext.** curren
1b00: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
1b10: 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 68  uction.  When th
1b20: 65 20 70 61 72 73 65 72 20 69 73 20 72 75 6e 20  e parser is run 
1b30: 72 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74  recursively.** t
1b40: 68 69 73 20 77 61 79 2c 20 74 68 65 20 66 69 6e  his way, the fin
1b50: 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20 6e 6f  al OP_Halt is no
1b60: 74 20 61 70 70 65 6e 64 65 64 20 61 6e 64 20 6f  t appended and o
1b70: 74 68 65 72 20 69 6e 69 74 69 61 6c 69 7a 61 74  ther initializat
1b80: 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e 61 6c  ion.** and final
1b90: 69 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 61 72  ization steps ar
1ba0: 65 20 6f 6d 69 74 74 65 64 20 62 65 63 61 75 73  e omitted becaus
1bb0: 65 20 74 68 6f 73 65 20 61 72 65 20 68 61 6e 64  e those are hand
1bc0: 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20 6f  ling by the.** o
1bd0: 75 74 65 72 6d 6f 73 74 20 70 61 72 73 65 72 2e  utermost parser.
1be0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72 79  .**.** Not every
1bf0: 74 68 69 6e 67 20 69 73 20 6e 65 73 74 61 62 6c  thing is nestabl
1c00: 65 2e 20 20 54 68 69 73 20 66 61 63 69 6c 69 74  e.  This facilit
1c10: 79 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f  y is designed to
1c20: 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53 45 52   permit.** INSER
1c30: 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20 44  T, UPDATE, and D
1c40: 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73  ELETE operations
1c50: 20 61 67 61 69 6e 73 74 20 53 51 4c 49 54 45 5f   against SQLITE_
1c60: 4d 41 53 54 45 52 2e 20 20 55 73 65 0a 2a 2a 20  MASTER.  Use.** 
1c70: 63 61 72 65 20 69 66 20 79 6f 75 20 64 65 63 69  care if you deci
1c80: 64 65 20 74 6f 20 74 72 79 20 74 6f 20 75 73 65  de to try to use
1c90: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 6f   this routine fo
1ca0: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72  r some other pur
1cb0: 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  poses..*/.void s
1cc0: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
1cd0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1ce0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
1cf0: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
1d00: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72  _list ap;.  char
1d10: 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a   *zSql;.  char *
1d20: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 73  zErrMsg = 0;.  s
1d30: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1d40: 72 73 65 2d 3e 64 62 3b 0a 23 20 64 65 66 69 6e  rse->db;.# defin
1d50: 65 20 53 41 56 45 5f 53 5a 20 20 28 73 69 7a 65  e SAVE_SZ  (size
1d60: 6f 66 28 50 61 72 73 65 29 20 2d 20 6f 66 66 73  of(Parse) - offs
1d70: 65 74 6f 66 28 50 61 72 73 65 2c 6e 56 61 72 29  etof(Parse,nVar)
1d80: 29 0a 20 20 63 68 61 72 20 73 61 76 65 42 75 66  ).  char saveBuf
1d90: 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66  [SAVE_SZ];..  if
1da0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
1db0: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
1dc0: 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  t( pParse->neste
1dd0: 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65 73 74  d<10 );  /* Nest
1de0: 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ing should only 
1df0: 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20 64 65  be of limited de
1e00: 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74 61 72  pth */.  va_star
1e10: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
1e20: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
1e30: 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a 46 6f  VMPrintf(db, zFo
1e40: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
1e50: 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a  end(ap);.  if( z
1e60: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Sql==0 ){.    re
1e70: 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c  turn;   /* A mal
1e80: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
1e90: 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50  iled */.  }.  pP
1ea0: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a  arse->nested++;.
1eb0: 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42 75 66    memcpy(saveBuf
1ec0: 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  , &pParse->nVar,
1ed0: 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d   SAVE_SZ);.  mem
1ee0: 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e 56 61  set(&pParse->nVa
1ef0: 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  r, 0, SAVE_SZ);.
1f00: 20 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73    sqlite3RunPars
1f10: 65 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c  er(pParse, zSql,
1f20: 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71   &zErrMsg);.  sq
1f30: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1f40: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
1f50: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
1f60: 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70  ql);.  memcpy(&p
1f70: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73 61 76  Parse->nVar, sav
1f80: 65 42 75 66 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  eBuf, SAVE_SZ);.
1f90: 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64    pParse->nested
1fa0: 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  --;.}../*.** Loc
1fb0: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
1fc0: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
1fd0: 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72   describes a par
1fe0: 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
1ff0: 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20  .** table given 
2000: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74  the name of that
2010: 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69   table and (opti
2020: 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65  onally) the name
2030: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
2040: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
2050: 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
2060: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
2070: 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44  und..**.** If zD
2080: 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c  atabase is 0, al
2090: 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  l databases are 
20a0: 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65  searched for the
20b0: 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a 2a   table and the.*
20c0: 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  * first matching
20d0: 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72 6e   table is return
20e0: 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e  ed.  (No checkin
20f0: 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  g for duplicate 
2100: 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 69  table.** names i
2110: 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65  s done.)  The se
2120: 61 72 63 68 20 6f 72 64 65 72 20 69 73 20 54 45  arch order is TE
2130: 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d  MP first, then M
2140: 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a  AIN, then any.**
2150: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
2160: 61 73 65 73 20 61 64 64 65 64 20 75 73 69 6e 67  ases added using
2170: 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d   the ATTACH comm
2180: 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  and..**.** See a
2190: 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  lso sqlite3Locat
21a0: 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62  eTable()..*/.Tab
21b0: 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 54  le *sqlite3FindT
21c0: 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62  able(sqlite3 *db
21d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
21e0: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
21f0: 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20 54  *zDatabase){.  T
2200: 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69  able *p = 0;.  i
2210: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d  nt i;.  int nNam
2220: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 4e 61  e;.  assert( zNa
2230: 6d 65 21 3d 30 20 29 3b 0a 20 20 6e 4e 61 6d 65  me!=0 );.  nName
2240: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2250: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72  30(zName);.  for
2260: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
2270: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
2280: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
2290: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20  2) ? i^1 : i;   
22a0: 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62  /* Search TEMP b
22b0: 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20  efore MAIN */.  
22c0: 20 20 69 66 28 20 7a 44 61 74 61 62 61 73 65 21    if( zDatabase!
22d0: 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  =0 && sqlite3Str
22e0: 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c 20  ICmp(zDatabase, 
22f0: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65  db->aDb[j].zName
2300: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2310: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
2320: 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a  hFind(&db->aDb[j
2330: 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ].pSchema->tblHa
2340: 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  sh, zName, nName
2350: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62  );.    if( p ) b
2360: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
2370: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn p;.}../*.** L
2380: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
2390: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
23a0: 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70  at describes a p
23b0: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
23c0: 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65  se.** table give
23d0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
23e0: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
23f0: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
2400: 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  me of the.** dat
2410: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
2420: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
2430: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
2440: 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61  found.  Also lea
2450: 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d  ve an.** error m
2460: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
2470: 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  ->zErrMsg..**.**
2480: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
2490: 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
24a0: 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33  tine and sqlite3
24b0: 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73 20 74  FindTable() is t
24c0: 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hat this.** rout
24d0: 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72  ine leaves an er
24e0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
24f0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77  Parse->zErrMsg w
2500: 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46  here.** sqlite3F
2510: 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20  indTable() does 
2520: 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  not..*/.Table *s
2530: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
2540: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
2550: 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 63  se,         /* c
2560: 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63 68 20  ontext in which 
2570: 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73  to report errors
2580: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77   */.  int isView
2590: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
25a0: 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69 6e 67 20  True if looking 
25b0: 66 6f 72 20 61 20 56 49 45 57 20 72 61 74 68 65  for a VIEW rathe
25c0: 72 20 74 68 61 6e 20 61 20 54 41 42 4c 45 20 2a  r than a TABLE *
25d0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
25e0: 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61  zName,     /* Na
25f0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
2600: 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66  we are looking f
2610: 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  or */.  const ch
2620: 61 72 20 2a 7a 44 62 61 73 65 20 20 20 20 20 2f  ar *zDbase     /
2630: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
2640: 74 61 62 61 73 65 2e 20 20 4d 69 67 68 74 20 62  tabase.  Might b
2650: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54  e NULL */.){.  T
2660: 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52  able *p;..  /* R
2670: 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
2680: 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65   schema. If an e
2690: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61  rror occurs, lea
26a0: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
26b0: 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64  age.  ** and cod
26c0: 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
26d0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a  return NULL. */.
26e0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
26f0: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
2700: 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
2710: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2720: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69  .  p = sqlite3Fi
2730: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
2740: 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73  db, zName, zDbas
2750: 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  e);.  if( p==0 )
2760: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2770: 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69 65 77 20   *zMsg = isView 
2780: 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65 77 22  ? "no such view"
2790: 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c   : "no such tabl
27a0: 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 61  e";.    if( zDba
27b0: 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  se ){.      sqli
27c0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
27d0: 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c  se, "%s: %s.%s",
27e0: 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a   zMsg, zDbase, z
27f0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
2800: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2810: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2820: 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20  "%s: %s", zMsg, 
2830: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
2840: 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
2850: 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20  chema = 1;.  }. 
2860: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
2870: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
2880: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
2890: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
28a0: 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c  s .** a particul
28b0: 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74  ar index given t
28c0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
28d0: 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65  index.** and the
28e0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
28f0: 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61  abase that conta
2900: 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ins the index..*
2910: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
2920: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
2930: 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69  * If zDatabase i
2940: 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73  s 0, all databas
2950: 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20  es are searched 
2960: 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  for the.** table
2970: 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d   and the first m
2980: 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73  atching index is
2990: 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20   returned.  (No 
29a0: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20  checking.** for 
29b0: 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20  duplicate index 
29c0: 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20  names is done.) 
29d0: 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65   The search orde
29e0: 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72  r is.** TEMP fir
29f0: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
2a00: 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72  hen any auxiliar
2a10: 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65  y databases adde
2a20: 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41  d.** using the A
2a30: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
2a40: 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
2a50: 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65  FindIndex(sqlite
2a60: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
2a70: 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  r *zName, const 
2a80: 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e  char *zDb){.  In
2a90: 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e  dex *p = 0;.  in
2aa0: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  t i;.  int nName
2ab0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2ac0: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72  30(zName);.  for
2ad0: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
2ae0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
2af0: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
2b00: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f  2) ? i^1 : i;  /
2b10: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
2b20: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
2b30: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
2b40: 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53   = db->aDb[j].pS
2b50: 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72  chema;.    asser
2b60: 74 28 20 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  t( pSchema );.  
2b70: 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c    if( zDb && sql
2b80: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
2b90: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d   db->aDb[j].zNam
2ba0: 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
2bb0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
2bc0: 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d  shFind(&pSchema-
2bd0: 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  >idxHash, zName,
2be0: 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   nName);.    if(
2bf0: 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a   p ) break;.  }.
2c00: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
2c10: 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68 65  *.** Reclaim the
2c20: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
2c30: 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74  an index.*/.stat
2c40: 69 63 20 76 6f 69 64 20 66 72 65 65 49 6e 64 65  ic void freeInde
2c50: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  x(sqlite3 *db, I
2c60: 6e 64 65 78 20 2a 70 29 7b 0a 23 69 66 6e 64 65  ndex *p){.#ifnde
2c70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e  f SQLITE_OMIT_AN
2c80: 41 4c 59 5a 45 0a 20 20 73 71 6c 69 74 65 33 44  ALYZE.  sqlite3D
2c90: 65 6c 65 74 65 49 6e 64 65 78 53 61 6d 70 6c 65  eleteIndexSample
2ca0: 73 28 64 62 2c 20 70 29 3b 0a 23 65 6e 64 69 66  s(db, p);.#endif
2cb0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
2cc0: 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66 29  (db, p->zColAff)
2cd0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2ce0: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
2cf0: 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78  ** For the index
2d00: 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65   called zIdxName
2d10: 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20   which is found 
2d20: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2d30: 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74  iDb,.** unlike t
2d40: 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69  hat index from i
2d50: 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65  ts Table then re
2d60: 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 66  move the index f
2d70: 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  rom.** the index
2d80: 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20   hash table and 
2d90: 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  free all memory 
2da0: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
2db0: 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
2dc0: 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64  e index..*/.void
2dd0: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
2de0: 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c  dDeleteIndex(sql
2df0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
2e00: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
2e10: 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65  IdxName){.  Inde
2e20: 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74  x *pIndex;.  int
2e30: 20 6c 65 6e 3b 0a 20 20 48 61 73 68 20 2a 70 48   len;.  Hash *pH
2e40: 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  ash = &db->aDb[i
2e50: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db].pSchema->idx
2e60: 48 61 73 68 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73  Hash;..  len = s
2e70: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2e80: 49 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64  IdxName);.  pInd
2e90: 65 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ex = sqlite3Hash
2ea0: 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49  Insert(pHash, zI
2eb0: 64 78 4e 61 6d 65 2c 20 6c 65 6e 2c 20 30 29 3b  dxName, len, 0);
2ec0: 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b  .  if( pIndex ){
2ed0: 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d  .    if( pIndex-
2ee0: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d  >pTable->pIndex=
2ef0: 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20  =pIndex ){.     
2f00: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
2f10: 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
2f20: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
2f30: 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
2f40: 2a 70 3b 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73  *p;.      /* Jus
2f50: 74 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c  tification of AL
2f60: 57 41 59 53 28 29 3b 20 20 54 68 65 20 69 6e 64  WAYS();  The ind
2f70: 65 78 20 6d 75 73 74 20 62 65 20 6f 6e 20 74 68  ex must be on th
2f80: 65 20 6c 69 73 74 20 6f 66 0a 20 20 20 20 20 20  e list of.      
2f90: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20  ** indices. */. 
2fa0: 20 20 20 20 20 70 20 3d 20 70 49 6e 64 65 78 2d       p = pIndex-
2fb0: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b  >pTable->pIndex;
2fc0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
2fd0: 57 41 59 53 28 70 29 20 26 26 20 70 2d 3e 70 4e  WAYS(p) && p->pN
2fe0: 65 78 74 21 3d 70 49 6e 64 65 78 20 29 7b 20 70  ext!=pIndex ){ p
2ff0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20   = p->pNext; }. 
3000: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
3010: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70  p && p->pNext==p
3020: 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20  Index) ){.      
3030: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e    p->pNext = pIn
3040: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
3050: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72    }.    }.    fr
3060: 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  eeIndex(db, pInd
3070: 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66  ex);.  }.  db->f
3080: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
3090: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a  nternChanges;.}.
30a0: 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c  ./*.** Erase all
30b0: 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74   schema informat
30c0: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d  ion from the in-
30d0: 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c  memory hash tabl
30e0: 65 73 20 6f 66 0a 2a 2a 20 61 20 73 69 6e 67 6c  es of.** a singl
30f0: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
3100: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
3110: 6c 65 64 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d  led to reclaim m
3120: 65 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20  emory.** before 
3130: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6c 6f  the database clo
3140: 73 65 73 2e 20 20 49 74 20 69 73 20 61 6c 73 6f  ses.  It is also
3150: 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 61   called during a
3160: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20   rollback.** if 
3170: 74 68 65 72 65 20 77 65 72 65 20 73 63 68 65 6d  there were schem
3180: 61 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67  a changes during
3190: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
31a0: 20 6f 72 20 69 66 20 61 0a 2a 2a 20 73 63 68 65   or if a.** sche
31b0: 6d 61 2d 63 6f 6f 6b 69 65 20 6d 69 73 6d 61 74  ma-cookie mismat
31c0: 63 68 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  ch occurs..**.**
31d0: 20 49 66 20 69 44 62 3d 3d 30 20 74 68 65 6e 20   If iDb==0 then 
31e0: 72 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e  reset the intern
31f0: 61 6c 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73  al schema tables
3200: 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73   for all databas
3210: 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20 49 66 20  e.** files.  If 
3220: 69 44 62 3e 3d 31 20 74 68 65 6e 20 72 65 73 65  iDb>=1 then rese
3230: 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  t the internal s
3240: 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c 79 20 74  chema for only t
3250: 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 66 69 6c  he.** single fil
3260: 65 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a  e indicated..*/.
3270: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65  void sqlite3Rese
3280: 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28  tInternalSchema(
3290: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
32a0: 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20   iDb){.  int i, 
32b0: 6a 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  j;.  assert( iDb
32c0: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
32d0: 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  Db );..  if( iDb
32e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
32f0: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
3300: 64 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  db);.  }.  for(i
3310: 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  =iDb; i<db->nDb;
3320: 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
3330: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
3340: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
3350: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
3360: 61 73 73 65 72 74 28 69 3d 3d 31 20 7c 7c 20 28  assert(i==1 || (
3370: 70 44 62 2d 3e 70 42 74 20 26 26 20 73 71 6c 69  pDb->pBt && sqli
3380: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
3390: 65 78 28 70 44 62 2d 3e 70 42 74 29 29 29 3b 0a  ex(pDb->pBt)));.
33a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 68        sqlite3Sch
33b0: 65 6d 61 46 72 65 65 28 70 44 62 2d 3e 70 53 63  emaFree(pDb->pSc
33c0: 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hema);.    }.   
33d0: 20 69 66 28 20 69 44 62 3e 30 20 29 20 72 65 74   if( iDb>0 ) ret
33e0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
33f0: 74 28 20 69 44 62 3d 3d 30 20 29 3b 0a 20 20 64  t( iDb==0 );.  d
3400: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
3410: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
3420: 73 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  s;.  sqlite3Vtab
3430: 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a  UnlockList(db);.
3440: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
3450: 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f  aveAll(db);..  /
3460: 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  * If one or more
3470: 20 6f 66 20 74 68 65 20 61 75 78 69 6c 69 61 72   of the auxiliar
3480: 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  y database files
3490: 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64   has been closed
34a0: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 6d 6f  ,.  ** then remo
34b0: 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65  ve them from the
34c0: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
34d0: 61 73 65 20 6c 69 73 74 2e 20 20 57 65 20 74 61  ase list.  We ta
34e0: 6b 65 20 74 68 65 0a 20 20 2a 2a 20 6f 70 70 6f  ke the.  ** oppo
34f0: 72 74 75 6e 69 74 79 20 74 6f 20 64 6f 20 74 68  rtunity to do th
3500: 69 73 20 68 65 72 65 20 73 69 6e 63 65 20 77 65  is here since we
3510: 20 68 61 76 65 20 6a 75 73 74 20 64 65 6c 65 74   have just delet
3520: 65 64 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20  ed all of the.  
3530: 2a 2a 20 73 63 68 65 6d 61 20 68 61 73 68 20 74  ** schema hash t
3540: 61 62 6c 65 73 20 61 6e 64 20 74 68 65 72 65 66  ables and theref
3550: 6f 72 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  ore do not have 
3560: 74 6f 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e  to make any chan
3570: 67 65 73 0a 20 20 2a 2a 20 74 6f 20 61 6e 79 20  ges.  ** to any 
3580: 6f 66 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e  of those tables.
3590: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d  .  */.  for(i=j=
35a0: 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  2; i<db->nDb; i+
35b0: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44  +){.    struct D
35c0: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
35d0: 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
35e0: 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  b->pBt==0 ){.   
35f0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3600: 28 64 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29  (db, pDb->zName)
3610: 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61  ;.      pDb->zNa
3620: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f  me = 0;.      co
3630: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
3640: 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20    if( j<i ){.   
3650: 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20     db->aDb[j] = 
3660: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
3670: 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  }.    j++;.  }. 
3680: 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61 44 62   memset(&db->aDb
3690: 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62  [j], 0, (db->nDb
36a0: 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61  -j)*sizeof(db->a
36b0: 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e  Db[j]));.  db->n
36c0: 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62  Db = j;.  if( db
36d0: 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e  ->nDb<=2 && db->
36e0: 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61 74  aDb!=db->aDbStat
36f0: 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  ic ){.    memcpy
3700: 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c 20  (db->aDbStatic, 
3710: 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f  db->aDb, 2*sizeo
3720: 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a  f(db->aDb[0]));.
3730: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
3740: 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b 0a  e(db, db->aDb);.
3750: 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62      db->aDb = db
3760: 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20 7d  ->aDbStatic;.  }
3770: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
3780: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
3790: 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f   when a commit o
37a0: 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ccurs..*/.void s
37b0: 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65  qlite3CommitInte
37c0: 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69  rnalChanges(sqli
37d0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e  te3 *db){.  db->
37e0: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
37f0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
3800: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
3810: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64  memory allocated
3820: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
3830: 6e 61 6d 65 73 20 6f 66 20 61 20 74 61 62 6c 65  names of a table
3840: 20 6f 72 20 76 69 65 77 20 28 74 68 65 0a 2a 2a   or view (the.**
3850: 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61 72   Table.aCol[] ar
3860: 72 61 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ray)..*/.static 
3870: 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74  void sqliteDelet
3880: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 73 71 6c  eColumnNames(sql
3890: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
38a0: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20  *pTable){.  int 
38b0: 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  i;.  Column *pCo
38c0: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  l;.  assert( pTa
38d0: 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ble!=0 );.  if( 
38e0: 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e  (pCol = pTable->
38f0: 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  aCol)!=0 ){.    
3900: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c  for(i=0; i<pTabl
3910: 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  e->nCol; i++, pC
3920: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c  ol++){.      sql
3930: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3940: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
3950: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
3960: 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70  lete(db, pCol->p
3970: 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Dflt);.      sql
3980: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3990: 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20  Col->zDflt);.   
39a0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
39b0: 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  (db, pCol->zType
39c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
39d0: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
39e0: 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20  >zColl);.    }. 
39f0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3a00: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f  (db, pTable->aCo
3a10: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
3a20: 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f   Remove the memo
3a30: 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ry data structur
3a40: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
3a50: 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  th the given.** 
3a60: 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67  Table.  No chang
3a70: 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64  es are made to d
3a80: 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74  isk by this rout
3a90: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ine..**.** This 
3aa0: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c  routine just del
3ab0: 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74  etes the data st
3ac0: 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65  ructure.  It doe
3ad0: 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20  s not unlink.** 
3ae0: 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73  the table data s
3af0: 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
3b00: 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42  e hash table.  B
3b10: 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74 72  ut it does destr
3b20: 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72  oy.** memory str
3b30: 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20 69  uctures of the i
3b40: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
3b50: 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74  gn keys associat
3b60: 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20  ed with .** the 
3b70: 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
3b80: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
3b90: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  e(sqlite3 *db, T
3ba0: 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
3bb0: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20   Index *pIndex, 
3bc0: 2a 70 4e 65 78 74 3b 0a 0a 20 20 61 73 73 65 72  *pNext;..  asser
3bd0: 74 28 20 21 70 54 61 62 6c 65 20 7c 7c 20 70 54  t( !pTable || pT
3be0: 61 62 6c 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  able->nRef>0 );.
3bf0: 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c  .  /* Do not del
3c00: 65 74 65 20 74 68 65 20 74 61 62 6c 65 20 75 6e  ete the table un
3c10: 74 69 6c 20 74 68 65 20 72 65 66 65 72 65 6e 63  til the referenc
3c20: 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  e count reaches 
3c30: 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 21  zero. */.  if( !
3c40: 70 54 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b  pTable ) return;
3c50: 0a 20 20 69 66 28 20 28 28 21 64 62 20 7c 7c 20  .  if( ((!db || 
3c60: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
3c70: 3d 3d 30 29 20 26 26 20 28 2d 2d 70 54 61 62 6c  ==0) && (--pTabl
3c80: 65 2d 3e 6e 52 65 66 29 3e 30 29 20 29 20 72 65  e->nRef)>0) ) re
3c90: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  turn;..  /* Dele
3ca0: 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61  te all indices a
3cb0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
3cc0: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
3cd0: 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61  for(pIndex = pTa
3ce0: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e  ble->pIndex; pIn
3cf0: 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78  dex; pIndex=pNex
3d00: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
3d10: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
3d20: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65     assert( pInde
3d30: 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
3d40: 6c 65 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  le->pSchema );. 
3d50: 20 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62     if( !db || db
3d60: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
3d70: 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  0 ){.      char 
3d80: 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d  *zName = pIndex-
3d90: 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20 54  >zName; .      T
3da0: 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20  ESTONLY ( Index 
3db0: 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74 65  *pOld = ) sqlite
3dc0: 33 48 61 73 68 49 6e 73 65 72 74 28 0a 09 20 20  3HashInsert(..  
3dd0: 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61  &pIndex->pSchema
3de0: 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65  ->idxHash, zName
3df0: 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
3e00: 30 28 7a 4e 61 6d 65 29 2c 20 30 0a 20 20 20 20  0(zName), 0.    
3e10: 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
3e20: 74 28 20 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20  t( pOld==pIndex 
3e30: 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20  || pOld==0 );.  
3e40: 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65    }.    freeInde
3e50: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
3e60: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
3e70: 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  any foreign keys
3e80: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 69   attached to thi
3e90: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71  s table. */.  sq
3ea0: 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28 64 62  lite3FkDelete(db
3eb0: 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a  , pTable);..  /*
3ec0: 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c   Delete the Tabl
3ed0: 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  e structure itse
3ee0: 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  lf..  */.  sqlit
3ef0: 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d  eDeleteColumnNam
3f00: 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  es(db, pTable);.
3f10: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3f20: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  db, pTable->zNam
3f30: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
3f40: 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  ree(db, pTable->
3f50: 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69  zColAff);.  sqli
3f60: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
3f70: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  db, pTable->pSel
3f80: 65 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ect);.#ifndef SQ
3f90: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
3fa0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
3fb0: 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  ete(db, pTable->
3fc0: 70 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a  pCheck);.#endif.
3fd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3fe0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
3ff0: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c  .  sqlite3VtabCl
4000: 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ear(db, pTable);
4010: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
4020: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
4030: 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  le);.}../*.** Un
4040: 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74  link the given t
4050: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61  able from the ha
4060: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68  sh tables and th
4070: 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20  e delete the.** 
4080: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
4090: 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64  with all its ind
40a0: 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e  ices and foreign
40b0: 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   keys..*/.void s
40c0: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
40d0: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
40e0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
40f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
4100: 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  bName){.  Table 
4110: 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a  *p;.  Db *pDb;..
4120: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
4130: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
4140: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
4150: 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
4160: 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20 74 65  zTabName );.  te
4170: 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61 6d 65  stcase( zTabName
4180: 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a 65  [0]==0 );  /* Ze
4190: 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65 20  ro-length table 
41a0: 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77 65  names are allowe
41b0: 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62  d */.  pDb = &db
41c0: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20  ->aDb[iDb];.  p 
41d0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
41e0: 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  ert(&pDb->pSchem
41f0: 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62  a->tblHash, zTab
4200: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
4210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
4220: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
4230: 61 62 4e 61 6d 65 29 2c 30 29 3b 0a 20 20 73 71  abName),0);.  sq
4240: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
4250: 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e 66  (db, p);.  db->f
4260: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
4270: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a  nternChanges;.}.
4280: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74  ./*.** Given a t
4290: 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73  oken, return a s
42a0: 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69  tring that consi
42b0: 73 74 73 20 6f 66 20 74 68 65 20 74 65 78 74 20  sts of the text 
42c0: 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e  of that.** token
42d0: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
42e0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
42f0: 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69  ring.** is obtai
4300: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
4310: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
4320: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
4330: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
4340: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  tion..**.** Any 
4350: 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 20  quotation marks 
4360: 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20 27 6e  (ex:  "name", 'n
4370: 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72  ame', [name], or
4380: 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a 2a 2a   `name`) that.**
4390: 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20 62 6f   surround the bo
43a0: 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20  dy of the token 
43b0: 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a  are removed..**.
43c0: 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66  ** Tokens are of
43d0: 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72  ten just pointer
43e0: 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  s into the origi
43f0: 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64  nal SQL text and
4400: 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c   so.** are not \
4410: 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61  000 terminated a
4420: 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69  nd are not persi
4430: 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75  stent.  The retu
4440: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
4450: 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  s \000 terminate
4460: 64 20 61 6e 64 20 69 73 20 70 65 72 73 69 73 74  d and is persist
4470: 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  ent..*/.char *sq
4480: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
4490: 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  en(sqlite3 *db, 
44a0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
44b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
44c0: 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20  if( pName ){.   
44d0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
44e0: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
44f0: 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70  har*)pName->z, p
4500: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71  Name->n);.    sq
4510: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
4520: 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
4530: 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d    zName = 0;.  }
4540: 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
4550: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
4560: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
4570: 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e   table stored in
4580: 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   database number
4590: 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74   iDb for.** writ
45a0: 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69  ing. The table i
45b0: 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63  s opened using c
45c0: 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ursor 0..*/.void
45d0: 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74   sqlite3OpenMast
45e0: 65 72 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  erTable(Parse *p
45f0: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
4600: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
4610: 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73 71 6c  etVdbe(p);.  sql
4620: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  ite3TableLock(p,
4630: 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f   iDb, MASTER_ROO
4640: 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54 41 42  T, 1, SCHEMA_TAB
4650: 4c 45 28 69 44 62 29 29 3b 0a 20 20 73 71 6c 69  LE(iDb));.  sqli
4660: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4670: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30   OP_OpenWrite, 0
4680: 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69  , MASTER_ROOT, i
4690: 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Db);.  sqlite3Vd
46a0: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
46b0: 2c 20 28 63 68 61 72 20 2a 29 35 2c 20 50 34 5f  , (char *)5, P4_
46c0: 49 4e 54 33 32 29 3b 20 20 2f 2a 20 35 20 63 6f  INT32);  /* 5 co
46d0: 6c 75 6d 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20  lumn table */.  
46e0: 69 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29  if( p->nTab==0 )
46f0: 7b 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20  {.    p->nTab = 
4700: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
4710: 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20  Parameter zName 
4720: 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d  points to a nul-
4730: 74 65 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65  terminated buffe
4740: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
4750: 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61   name.** of a da
4760: 74 61 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20  tabase ("main", 
4770: 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61  "temp" or the na
4780: 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65  me of an attache
4790: 64 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66  d db). This.** f
47a0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
47b0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
47c0: 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
47d0: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72  in db->aDb[], or
47e0: 0a 2a 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61  .** -1 if the na
47f0: 6d 65 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65  med db cannot be
4800: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
4810: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
4820: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
4830: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
4840: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20  {.  int i = -1; 
4850: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
4860: 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
4870: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
4880: 20 44 62 20 2a 70 44 62 3b 0a 20 20 20 20 69 6e   Db *pDb;.    in
4890: 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
48a0: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
48b0: 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62    for(i=(db->nDb
48c0: 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44  -1), pDb=&db->aD
48d0: 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  b[i]; i>=0; i--,
48e0: 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69   pDb--){.      i
48f0: 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42  f( (!OMIT_TEMPDB
4900: 20 7c 7c 20 69 21 3d 31 20 29 20 26 26 20 6e 3d   || i!=1 ) && n=
4910: 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
4920: 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20  (pDb->zName) && 
4930: 0a 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71  .          0==sq
4940: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 44 62  lite3StrICmp(pDb
4950: 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20  ->zName, zName) 
4960: 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
4970: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4980: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
4990: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b  }../*.** The tok
49a0: 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69  en *pName contai
49b0: 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ns the name of a
49c0: 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65   database (eithe
49d0: 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22  r "main" or.** "
49e0: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
49f0: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
4a00: 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69   db). This routi
4a10: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
4a20: 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  * index of the n
4a30: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
4a40: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d   db->aDb[], or -
4a50: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
4a60: 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  b .** does not e
4a70: 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  xist..*/.int sql
4a80: 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74  ite3FindDb(sqlit
4a90: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
4aa0: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Name){.  int i; 
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4ad0: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
4ae0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
4af0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
4b00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
4b10: 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68  me we are search
4b20: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61  ing for */.  zNa
4b30: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
4b40: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
4b50: 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69  ame);.  i = sqli
4b60: 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
4b70: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  , zName);.  sqli
4b80: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
4b90: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ame);.  return i
4ba0: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c  ;.}../* The tabl
4bb0: 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69  e or view or tri
4bc0: 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73  gger name is pas
4bd0: 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74  sed to this rout
4be0: 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a  ine via tokens.*
4bf0: 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61  * pName1 and pNa
4c00: 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c  me2. If the tabl
4c10: 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79  e name was fully
4c20: 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20   qualified, for 
4c30: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43  example:.**.** C
4c40: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e  REATE TABLE xxx.
4c50: 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a  yyy (...);.** .*
4c60: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
4c70: 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e   set to "xxx" an
4c80: 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20  d pName2 "yyy". 
4c90: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
4ca0: 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  d if.** the tabl
4cb0: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
4cc0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
4cd0: 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  .e.:.**.** CREAT
4ce0: 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29  E TABLE yyy(...)
4cf0: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61  ;.**.** Then pNa
4d00: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
4d10: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
4d20: 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  s ""..**.** This
4d30: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
4d40: 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e  e *ppUnqual poin
4d50: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
4d60: 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65  the token (pName
4d70: 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20  1 or.** pName2) 
4d80: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20  that stores the 
4d90: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
4da0: 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64  e name.  The ind
4db0: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ex of the.** dat
4dc0: 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72  abase "xxx" is r
4dd0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
4de0: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
4df0: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
4e00: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
4e10: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
4e20: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
4e30: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
4e40: 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me1,      /* The
4e50: 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61   "xxx" in the na
4e60: 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20  me "xxx.yyy" or 
4e70: 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  "xxx" */.  Token
4e80: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f   *pName2,      /
4e90: 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74  * The "yyy" in t
4ea0: 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79  he name "xxx.yyy
4eb0: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70  " */.  Token **p
4ec0: 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72  Unqual     /* Wr
4ed0: 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66  ite the unqualif
4ee0: 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ied object name 
4ef0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
4f00: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
4f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
4f20: 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  base holding the
4f30: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
4f40: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
4f50: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 41 4c  e->db;..  if( AL
4f60: 57 41 59 53 28 70 4e 61 6d 65 32 21 3d 30 29 20  WAYS(pName2!=0) 
4f70: 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29  && pName2->n>0 )
4f80: 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e  {.    if( db->in
4f90: 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20 20 20  it.busy ) {.    
4fa0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4fb0: 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75  g(pParse, "corru
4fc0: 70 74 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20  pt database");. 
4fd0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
4fe0: 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r++;.      retur
4ff0: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
5000: 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65  *pUnqual = pName
5010: 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  2;.    iDb = sql
5020: 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70  ite3FindDb(db, p
5030: 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20  Name1);.    if( 
5040: 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73  iDb<0 ){.      s
5050: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5060: 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
5070: 64 61 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e  database %T", pN
5080: 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 70 50 61  ame1);.      pPa
5090: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
50a0: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
50b0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
50c0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69   assert( db->ini
50d0: 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e  t.iDb==0 || db->
50e0: 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20  init.busy );.   
50f0: 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e   iDb = db->init.
5100: 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61  iDb;.    *pUnqua
5110: 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a  l = pName1;.  }.
5120: 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a    return iDb;.}.
5130: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
5140: 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 63  ine is used to c
5150: 68 65 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d  heck if the UTF-
5160: 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69  8 string zName i
5170: 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71  s a legal.** unq
5180: 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f  ualified name fo
5190: 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f  r a new schema o
51a0: 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e  bject (table, in
51b0: 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20  dex, view or.** 
51c0: 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61  trigger). All na
51d0: 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78  mes are legal ex
51e0: 63 65 70 74 20 74 68 6f 73 65 20 74 68 61 74 20  cept those that 
51f0: 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 73  begin with the s
5200: 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65  tring.** "sqlite
5210: 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f  _" (in upper, lo
5220: 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73  wer or mixed cas
5230: 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e  e). This portion
5240: 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63   of the namespac
5250: 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64  e.** is reserved
5260: 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73   for internal us
5270: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
5280: 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
5290: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
52a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
52b0: 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73  e){.  if( !pPars
52c0: 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  e->db->init.busy
52d0: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74   && pParse->nest
52e0: 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  ed==0 .         
52f0: 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d   && (pParse->db-
5300: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
5310: 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a  WriteSchema)==0.
5320: 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d            && 0==
5330: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
5340: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
5350: 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  , 7) ){.    sqli
5360: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5370: 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65  se, "object name
5380: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e   reserved for in
5390: 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c  ternal use: %s",
53a0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74   zName);.    ret
53b0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
53c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
53d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
53e0: 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75  ** Begin constru
53f0: 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  cting a new tabl
5400: 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
5410: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
5420: 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  s is.** the firs
5430: 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74  t of several act
5440: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ion routines tha
5450: 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20  t get called in 
5460: 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61  response.** to a
5470: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
5480: 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72  atement.  In par
5490: 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f  ticular, this ro
54a0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a  utine is called.
54b0: 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67 20  ** after seeing 
54c0: 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20  tokens "CREATE" 
54d0: 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20  and "TABLE" and 
54e0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  the table name. 
54f0: 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c  The isTemp.** fl
5500: 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  ag is true if th
5510: 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62  e table should b
5520: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
5530: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
5540: 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65  se.** file inste
5550: 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69  ad of in the mai
5560: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
5570: 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
5580: 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77  ly the case.** w
5590: 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f  hen the "TEMP" o
55a0: 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65  r "TEMPORARY" ke
55b0: 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20  yword occurs in 
55c0: 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54  between.** CREAT
55d0: 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a  E and TABLE..**.
55e0: 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65  ** The new table
55f0: 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69   record is initi
5600: 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69  alized and put i
5610: 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  n pParse->pNewTa
5620: 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20  ble..** As more 
5630: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
5640: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73  BLE statement is
5650: 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f   parsed, additio
5660: 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f  nal action.** ro
5670: 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63  utines will be c
5680: 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72  alled to add mor
5690: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
56a0: 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a   this record..**
56b0: 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
56c0: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
56d0: 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73  statement, the s
56e0: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
56f0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
5700: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74  alled to complet
5710: 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69  e the constructi
5720: 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  on of the new ta
5730: 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76  ble record..*/.v
5740: 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61 72 74  oid sqlite3Start
5750: 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
5760: 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72  pParse,   /* Par
5770: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
5780: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
5790: 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20    /* First part 
57a0: 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  of the name of t
57b0: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
57c0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
57d0: 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64  me2,   /* Second
57e0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d   part of the nam
57f0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
5800: 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  r view */.  int 
5810: 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20  isTemp,      /* 
5820: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
5830: 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a  a TEMP table */.
5840: 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20    int isView,   
5850: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
5860: 69 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a  is is a VIEW */.
5870: 20 20 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c    int isVirtual,
5880: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
5890: 69 73 20 69 73 20 61 20 56 49 52 54 55 41 4c 20  is is a VIRTUAL 
58a0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  table */.  int n
58b0: 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44  oErr        /* D
58c0: 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62  o nothing if tab
58d0: 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
58e0: 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  s */.){.  Table 
58f0: 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20  *pTable;.  char 
5900: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54  *zName = 0; /* T
5910: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e  he name of the n
5920: 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ew table */.  sq
5930: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
5940: 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
5950: 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  v;.  int iDb;   
5960: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
5970: 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61  e number to crea
5980: 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20  te the table in 
5990: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
59a0: 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69  e;    /* Unquali
59b0: 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65  fied name of the
59c0: 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65   table to create
59d0: 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61   */..  /* The ta
59e0: 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65  ble or view name
59f0: 20 74 6f 20 63 72 65 61 74 65 20 69 73 20 70 61   to create is pa
5a00: 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75  ssed to this rou
5a10: 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a  tine via tokens.
5a20: 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20    ** pName1 and 
5a30: 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74  pName2. If the t
5a40: 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75  able name was fu
5a50: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66  lly qualified, f
5a60: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  or example:.  **
5a70: 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42  .  ** CREATE TAB
5a80: 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29  LE xxx.yyy (...)
5a90: 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65  ;.  ** .  ** The
5aa0: 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20  n pName1 is set 
5ab0: 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61  to "xxx" and pNa
5ac0: 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68  me2 "yyy". On th
5ad0: 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a  e other hand if.
5ae0: 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e    ** the table n
5af0: 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79  ame is not fully
5b00: 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e   qualified, i.e.
5b10: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41  :.  **.  ** CREA
5b20: 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e  TE TABLE yyy(...
5b30: 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  );.  **.  ** The
5b40: 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20  n pName1 is set 
5b50: 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61  to "yyy" and pNa
5b60: 6d 65 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a  me2 is ""..  **.
5b70: 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62 65    ** The call be
5b80: 6c 6f 77 20 73 65 74 73 20 74 68 65 20 70 4e 61  low sets the pNa
5b90: 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f  me pointer to po
5ba0: 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e  int at the token
5bb0: 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a   (pName1 or.  **
5bc0: 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74   pName2) that st
5bd0: 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69  ores the unquali
5be0: 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e  fied table name.
5bf0: 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 69 44   The variable iD
5c00: 62 20 69 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f  b is.  ** set to
5c10: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
5c20: 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
5c30: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
5c40: 77 20 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20  w is to be.  ** 
5c50: 63 72 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f  created in..  */
5c60: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
5c70: 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
5c80: 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
5c90: 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69  e2, &pName);.  i
5ca0: 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
5cb0: 6e 3b 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  n;.  if( !OMIT_T
5cc0: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
5cd0: 26 26 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20  && iDb>1 ){.    
5ce0: 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61  /* If creating a
5cf0: 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65   temp table, the
5d00: 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65   name may not be
5d10: 20 71 75 61 6c 69 66 69 65 64 20 2a 2f 0a 20 20   qualified */.  
5d20: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
5d30: 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f  g(pParse, "tempo
5d40: 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20  rary table name 
5d50: 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66  must be unqualif
5d60: 69 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ied");.    retur
5d70: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 4f 4d  n;.  }.  if( !OM
5d80: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54  IT_TEMPDB && isT
5d90: 65 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a  emp ) iDb = 1;..
5da0: 20 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54    pParse->sNameT
5db0: 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20  oken = *pName;. 
5dc0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
5dd0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
5de0: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
5df0: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
5e00: 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  n;.  if( SQLITE_
5e10: 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
5e20: 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
5e30: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
5e40: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
5e50: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69  e_error;.  }.  i
5e60: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d  f( db->init.iDb=
5e70: 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b  =1 ) isTemp = 1;
5e80: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5e90: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
5ea0: 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  ON.  assert( (is
5eb0: 54 65 6d 70 20 26 20 31 29 3d 3d 69 73 54 65 6d  Temp & 1)==isTem
5ec0: 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74  p );.  {.    int
5ed0: 20 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20   code;.    char 
5ee0: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
5ef0: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  Db].zName;.    i
5f00: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
5f10: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
5f20: 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
5f30: 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c  A_TABLE(isTemp),
5f40: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
5f50: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
5f60: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
5f70: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29      if( isView )
5f80: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
5f90: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
5fa0: 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  mp ){.        co
5fb0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
5fc0: 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  TE_TEMP_VIEW;.  
5fd0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5fe0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
5ff0: 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20  _CREATE_VIEW;.  
6000: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
6010: 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
6020: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
6030: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  p ){.        cod
6040: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
6050: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  E_TEMP_TABLE;.  
6060: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6070: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
6080: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20  _CREATE_TABLE;. 
6090: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
60a0: 20 69 66 28 20 21 69 73 56 69 72 74 75 61 6c 20   if( !isVirtual 
60b0: 26 26 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  && sqlite3AuthCh
60c0: 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
60d0: 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  , zName, 0, zDb)
60e0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
60f0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
6100: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
6110: 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  if..  /* Make su
6120: 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  re the new table
6130: 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63   name does not c
6140: 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65  ollide with an e
6150: 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64  xisting.  ** ind
6160: 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65  ex or table name
6170: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
6180: 61 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e  abase.  Issue an
6190: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
61a0: 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20  f.  ** it does. 
61b0: 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73  The exception is
61c0: 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
61d0: 74 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 77  t being parsed w
61e0: 61 73 20 70 61 73 73 65 64 0a 20 20 2a 2a 20 74  as passed.  ** t
61f0: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 64 65 63  o an sqlite3_dec
6200: 6c 61 72 65 5f 76 74 61 62 28 29 20 63 61 6c 6c  lare_vtab() call
6210: 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 6f  . In that case o
6220: 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  nly the column n
6230: 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79  ames.  ** and ty
6240: 70 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64  pes will be used
6250: 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f  , so there is no
6260: 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20 66 6f   need to test fo
6270: 72 20 6e 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a  r namespace.  **
6280: 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a   collisions..  *
6290: 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44 45 43 4c  /.  if( !IN_DECL
62a0: 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  ARE_VTAB ){.    
62b0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
62c0: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
62d0: 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
62e0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
62f0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
6300: 20 20 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c      pTable = sql
6310: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
6320: 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62  , zName, db->aDb
6330: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  [iDb].zName);.  
6340: 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a    if( pTable ){.
6350: 20 20 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72        if( !noErr
6360: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6370: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
6380: 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c  se, "table %T al
6390: 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 70  ready exists", p
63a0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
63b0: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
63c0: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
63d0: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
63e0: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
63f0: 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 26 26 20  zName, 0)!=0 && 
6400: 28 69 44 62 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e  (iDb==0 || !db->
6410: 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20  init.busy) ){.  
6420: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6430: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65  Msg(pParse, "the
6440: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
6450: 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22   index named %s"
6460: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
6470: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
6480: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
6490: 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71  }..  pTable = sq
64a0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
64b0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
64c0: 6c 65 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62  le));.  if( pTab
64d0: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  le==0 ){.    db-
64e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
64f0: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  1;.    pParse->r
6500: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
6510: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
6520: 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62  rr++;.    goto b
6530: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
6540: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e  ;.  }.  pTable->
6550: 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
6560: 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d   pTable->iPKey =
6570: 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70   -1;.  pTable->p
6580: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
6590: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  [iDb].pSchema;. 
65a0: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20   pTable->nRef = 
65b0: 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f  1;.  pTable->nRo
65c0: 77 45 73 74 20 3d 20 31 30 30 30 30 30 30 3b 0a  wEst = 1000000;.
65d0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
65e0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29  ->pNewTable==0 )
65f0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  ;.  pParse->pNew
6600: 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a  Table = pTable;.
6610: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
6620: 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74   the magic sqlit
6630: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
6640: 20 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63   used by autoinc
6650: 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65  rement,.  ** the
6660: 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74  n record a point
6670: 65 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  er to this table
6680: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
6690: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 0a  abase structure.
66a0: 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53    ** so that INS
66b0: 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65  ERT can find the
66c0: 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20   table easily.. 
66d0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
66e0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
66f0: 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61  EMENT.  if( !pPa
6700: 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73  rse->nested && s
6710: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  trcmp(zName, "sq
6720: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d  lite_sequence")=
6730: 3d 30 20 29 7b 0a 20 20 20 20 70 54 61 62 6c 65  =0 ){.    pTable
6740: 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54  ->pSchema->pSeqT
6750: 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d  ab = pTable;.  }
6760: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65  .#endif..  /* Be
6770: 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74  gin generating t
6780: 68 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  he code that wil
6790: 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62  l insert the tab
67a0: 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20  le record into. 
67b0: 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   ** the SQLITE_M
67c0: 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f  ASTER table.  No
67d0: 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72  te in particular
67e0: 20 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f   that we must go
67f0: 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20   ahead.  ** and 
6800: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63  allocate the rec
6810: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
6820: 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e  he table entry n
6830: 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a  ow.  Before any.
6840: 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59    ** PRIMARY KEY
6850: 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f   or UNIQUE keywo
6860: 72 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20  rds are parsed. 
6870: 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20   Those keywords 
6880: 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20  will cause.  ** 
6890: 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72  indices to be cr
68a0: 65 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61  eated and the ta
68b0: 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20  ble record must 
68c0: 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20  come before the 
68d0: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20  .  ** indices.  
68e0: 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72  Hence, the recor
68f0: 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  d number for the
6900: 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61   table must be a
6910: 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f  llocated.  ** no
6920: 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  w..  */.  if( !d
6930: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
6940: 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  (v = sqlite3GetV
6950: 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20  dbe(pParse))!=0 
6960: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20  ){.    int j1;. 
6970: 20 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61     int fileForma
6980: 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c  t;.    int reg1,
6990: 20 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20   reg2, reg3;.   
69a0: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
69b0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
69c0: 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 23 69  se, 0, iDb);..#i
69d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
69e0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
69f0: 20 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c     if( isVirtual
6a00: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6a10: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
6a20: 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d  P_VBegin);.    }
6a30: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
6a40: 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d  If the file form
6a50: 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20  at and encoding 
6a60: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
6a70: 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65  have not been se
6a80: 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74  t, .    ** set t
6a90: 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a  hem now..    */.
6aa0: 20 20 20 20 72 65 67 31 20 3d 20 70 50 61 72 73      reg1 = pPars
6ab0: 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b  e->regRowid = ++
6ac0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
6ad0: 20 20 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d    reg2 = pParse-
6ae0: 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61  >regRoot = ++pPa
6af0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
6b00: 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  eg3 = ++pParse->
6b10: 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
6b20: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6b30: 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44  P_ReadCookie, iD
6b40: 62 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46  b, reg3, BTREE_F
6b50: 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20  ILE_FORMAT);.   
6b60: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
6b70: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
6b80: 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
6b90: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
6ba0: 49 66 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 66  If, reg3);.    f
6bb0: 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d  ileFormat = (db-
6bc0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
6bd0: 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d  LegacyFileFmt)!=
6be0: 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  0 ?.            
6bf0: 20 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45        1 : SQLITE
6c00: 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  _MAX_FILE_FORMAT
6c10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6c20: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
6c30: 74 65 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61  teger, fileForma
6c40: 74 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71  t, reg3);.    sq
6c50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6c60: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
6c70: 20 69 44 62 2c 20 42 54 52 45 45 5f 46 49 4c 45   iDb, BTREE_FILE
6c80: 5f 46 4f 52 4d 41 54 2c 20 72 65 67 33 29 3b 0a  _FORMAT, reg3);.
6c90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6ca0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
6cb0: 67 65 72 2c 20 45 4e 43 28 64 62 29 2c 20 72 65  ger, ENC(db), re
6cc0: 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g3);.    sqlite3
6cd0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6ce0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
6cf0: 20 42 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f   BTREE_TEXT_ENCO
6d00: 44 49 4e 47 2c 20 72 65 67 33 29 3b 0a 20 20 20  DING, reg3);.   
6d10: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
6d20: 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20  Here(v, j1);..  
6d30: 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63    /* This just c
6d40: 72 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68  reates a place-h
6d50: 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20  older record in 
6d60: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
6d70: 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  r table..    ** 
6d80: 54 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74  The record creat
6d90: 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  ed does not cont
6da0: 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74  ain anything yet
6db0: 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65  .  It will be re
6dc0: 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79  placed.    ** by
6dd0: 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20   the real entry 
6de0: 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  in code generate
6df0: 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54  d at sqlite3EndT
6e00: 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  able()..    **. 
6e10: 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20     ** The rowid 
6e20: 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72  for the new entr
6e30: 79 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  y is left in reg
6e40: 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65  ister pParse->re
6e50: 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54  gRowid..    ** T
6e60: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
6e70: 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ber of the new t
6e80: 61 62 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20  able is left in 
6e90: 72 65 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52  reg pParse->regR
6ea0: 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  oot..    ** The 
6eb0: 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70  rowid and root p
6ec0: 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65  age number value
6ed0: 73 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  s are needed by 
6ee0: 74 68 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20  the code that.  
6ef0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54    ** sqlite3EndT
6f00: 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61  able will genera
6f10: 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21  te..    */.#if !
6f20: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6f30: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
6f40: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6f50: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
6f60: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 7c      if( isView |
6f70: 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20  | isVirtual ){. 
6f80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6f90: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
6fa0: 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a  eger, 0, reg2);.
6fb0: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
6fc0: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c  .    {.      sql
6fd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6fe0: 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65  , OP_CreateTable
6ff0: 2c 20 69 44 62 2c 20 72 65 67 32 29 3b 0a 20 20  , iDb, reg2);.  
7000: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
7010: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70  penMasterTable(p
7020: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
7030: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7040: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
7050: 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20  d, 0, reg1);.   
7060: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7070: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
7080: 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c  , reg3);.    sql
7090: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
70a0: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20  , OP_Insert, 0, 
70b0: 72 65 67 33 2c 20 72 65 67 31 29 3b 0a 20 20 20  reg3, reg1);.   
70c0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
70d0: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
70e0: 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69  PPEND);.    sqli
70f0: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
7100: 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a   OP_Close);.  }.
7110: 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f  .  /* Normal (no
7120: 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e  n-error) return.
7130: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20   */.  return;.. 
7140: 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
7150: 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20  occurs, we jump 
7160: 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61  here */.begin_ta
7170: 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c  ble_error:.  sql
7180: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
7190: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Name);.  return;
71a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d  .}../*.** This m
71b0: 61 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20  acro is used to 
71c0: 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 72 69  compare two stri
71d0: 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d 69 6e  ngs in a case-in
71e0: 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65 72  sensitive manner
71f0: 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69 67 68  ..** It is sligh
7200: 74 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e 20  tly faster than 
7210: 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 53  calling sqlite3S
7220: 74 72 49 43 6d 70 28 29 20 64 69 72 65 63 74 6c  trICmp() directl
7230: 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63  y, but.** produc
7240: 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a  es larger code..
7250: 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54  **.** WARNING: T
7260: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74  his macro is not
7270: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
7280: 20 74 68 65 20 73 74 72 63 6d 70 28 29 20 66 61   the strcmp() fa
7290: 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75  mily. It.** retu
72a0: 72 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 20  rns true if the 
72b0: 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72 65 20  two strings are 
72c0: 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69 73 65  equal, otherwise
72d0: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69   false..*/.#defi
72e0: 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20 79 29  ne STRICMP(x, y)
72f0: 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72   (\.sqlite3Upper
7300: 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e  ToLower[*(unsign
7310: 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d  ed char *)(x)]==
7320: 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70 70 65     \.sqlite3Uppe
7330: 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67  rToLower[*(unsig
7340: 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29 5d 20  ned char *)(y)] 
7350: 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74 65 33      \.&& sqlite3
7360: 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c 28 79  StrICmp((x)+1,(y
7370: 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a  )+1)==0 )../*.**
7380: 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d   Add a new colum
7390: 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  n to the table c
73a0: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
73b0: 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a  onstructed..**.*
73c0: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
73d0: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
73e0: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f  once for each co
73f0: 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  lumn declaration
7400: 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20  .** in a CREATE 
7410: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
7420: 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
7430: 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65  ble() gets calle
7440: 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65  d.** first to ge
7450: 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20  t things going. 
7460: 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   Then this routi
7470: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
7480: 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e   each.** column.
7490: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
74a0: 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20  AddColumn(Parse 
74b0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
74c0: 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  pName){.  Table 
74d0: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
74e0: 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e  har *z;.  Column
74f0: 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65   *pCol;.  sqlite
7500: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
7510: 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70  db;.  if( (p = p
7520: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
7530: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23  )==0 ) return;.#
7540: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
7550: 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 6e 43  LUMN.  if( p->nC
7560: 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  ol+1>db->aLimit[
7570: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
7580: 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  UMN] ){.    sqli
7590: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
75a0: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
75b0: 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d  lumns on %s", p-
75c0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
75d0: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
75e0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d    z = sqlite3Nam
75f0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
7600: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  Name);.  if( z==
7610: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
7620: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
7630: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
7640: 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43  STRICMP(z, p->aC
7650: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a  ol[i].zName) ){.
7660: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7670: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64  orMsg(pParse, "d
7680: 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20  uplicate column 
7690: 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20  name: %s", z);. 
76a0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
76b0: 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20  ee(db, z);.     
76c0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
76d0: 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f   }.  if( (p->nCo
76e0: 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20  l & 0x7)==0 ){. 
76f0: 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b     Column *aNew;
7700: 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69  .    aNew = sqli
7710: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
7720: 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c  p->aCol,(p->nCol
7730: 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43  +8)*sizeof(p->aC
7740: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  ol[0]));.    if(
7750: 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
7760: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7770: 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65  db, z);.      re
7780: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
7790: 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a  p->aCol = aNew;.
77a0: 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d    }.  pCol = &p-
77b0: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a  >aCol[p->nCol];.
77c0: 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30    memset(pCol, 0
77d0: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  , sizeof(p->aCol
77e0: 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a  [0]));.  pCol->z
77f0: 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a  Name = z;. .  /*
7800: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
7810: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
7820: 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65  columns have the
7830: 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74   default affinit
7840: 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49  y.  ** 'NONE'. I
7850: 66 20 74 68 65 72 65 20 69 73 20 61 20 74 79 70  f there is a typ
7860: 65 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65  e specified, the
7870: 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  n sqlite3AddColu
7880: 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20  mnType() will.  
7890: 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78  ** be called nex
78a0: 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61  t to set pCol->a
78b0: 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c  ffinity correctl
78c0: 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e  y..  */.  pCol->
78d0: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
78e0: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d  E_AFF_NONE;.  p-
78f0: 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nCol++;.}../*.*
7900: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
7910: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
7920: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
7930: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
7940: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
7950: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
7960: 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22  t.  A "NOT NULL"
7970: 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a   constraint has.
7980: 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20  ** been seen on 
7990: 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20  a column.  This 
79a0: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
79b0: 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e   notNull flag on
79c0: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  .** the column c
79d0: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
79e0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  onstruction..*/.
79f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e  void sqlite3AddN
7a00: 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50  otNull(Parse *pP
7a10: 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f  arse, int onErro
7a20: 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  r){.  Table *p;.
7a30: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
7a40: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
7a50: 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e  ==0 || NEVER(p->
7a60: 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74 75 72 6e  nCol<1) ) return
7a70: 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e  ;.  p->aCol[p->n
7a80: 43 6f 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d  Col-1].notNull =
7a90: 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 7d 0a   (u8)onError;.}.
7aa0: 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20  ./*.** Scan the 
7ab0: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65  column type name
7ac0: 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e   zType (length n
7ad0: 54 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e  Type) and return
7ae0: 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   the.** associat
7af0: 65 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65  ed affinity type
7b00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
7b10: 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65  tine does a case
7b20: 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61  -independent sea
7b30: 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72  rch of zType for
7b40: 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69   the .** substri
7b50: 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ngs in the follo
7b60: 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f  wing table. If o
7b70: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
7b80: 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64  ings is.** found
7b90: 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
7ba0: 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20  ing affinity is 
7bb0: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79  returned. If zTy
7bc0: 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d  pe contains.** m
7bd0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20  ore than one of 
7be0: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20  the substrings, 
7bf0: 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74  entries toward t
7c00: 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68  he top of .** th
7c10: 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69  e table take pri
7c20: 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70  ority. For examp
7c30: 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20  le, if zType is 
7c40: 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53  'BLOBINT', .** S
7c50: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
7c60: 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  R is returned..*
7c70: 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20  *.** Substring  
7c80: 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a     | Affinity.**
7c90: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
7ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cb0: 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20  -.** 'INT'      
7cc0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
7cd0: 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52  INTEGER.** 'CHAR
7ce0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
7cf0: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43  E_AFF_TEXT.** 'C
7d00: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
7d10: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
7d20: 20 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c   'TEXT'        |
7d30: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
7d40: 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20  .** 'BLOB'      
7d50: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e    | SQLITE_AFF_N
7d60: 4f 4e 45 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20  ONE.** 'REAL'   
7d70: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
7d80: 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27  F_REAL.** 'FLOA'
7d90: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
7da0: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f  _AFF_REAL.** 'DO
7db0: 55 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  UB'        | SQL
7dc0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a  ITE_AFF_REAL.**.
7dd0: 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  ** If none of th
7de0: 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20  e substrings in 
7df0: 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20  the above table 
7e00: 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51  are found,.** SQ
7e10: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
7e20: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
7e30: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66  .char sqlite3Aff
7e40: 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20  inityType(const 
7e50: 63 68 61 72 20 2a 7a 49 6e 29 7b 0a 20 20 75 33  char *zIn){.  u3
7e60: 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  2 h = 0;.  char 
7e70: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
7e80: 5f 4e 55 4d 45 52 49 43 3b 0a 0a 20 20 69 66 28  _NUMERIC;..  if(
7e90: 20 7a 49 6e 20 29 20 77 68 69 6c 65 28 20 7a 49   zIn ) while( zI
7ea0: 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20  n[0] ){.    h = 
7eb0: 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33  (h<<8) + sqlite3
7ec0: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a  UpperToLower[(*z
7ed0: 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a  In)&0xff];.    z
7ee0: 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d  In++;.    if( h=
7ef0: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27  =(('c'<<24)+('h'
7f00: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
7f10: 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20  r') ){          
7f20: 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20     /* CHAR */.  
7f30: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
7f40: 5f 41 46 46 5f 54 45 58 54 3b 20 0a 20 20 20 20  _AFF_TEXT; .    
7f50: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
7f60: 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  c'<<24)+('l'<<16
7f70: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20  )+('o'<<8)+'b') 
7f80: 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42  ){       /* CLOB
7f90: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
7fa0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
7fb0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
7fc0: 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65  ==(('t'<<24)+('e
7fd0: 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b  '<<16)+('x'<<8)+
7fe0: 27 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a  't') ){       /*
7ff0: 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61   TEXT */.      a
8000: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
8010: 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20  TEXT;.    }else 
8020: 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34  if( h==(('b'<<24
8030: 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27  )+('l'<<16)+('o'
8040: 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20  <<8)+'b')       
8050: 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20     /* BLOB */.  
8060: 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53        && (aff==S
8070: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
8080: 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  C || aff==SQLITE
8090: 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20  _AFF_REAL) ){.  
80a0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
80b0: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66 6e 64  _AFF_NONE;.#ifnd
80c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
80d0: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
80e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
80f0: 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c  ('r'<<24)+('e'<<
8100: 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27  16)+('a'<<8)+'l'
8110: 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45  )          /* RE
8120: 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26  AL */.        &&
8130: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
8140: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
8150: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
8160: 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c  FF_REAL;.    }el
8170: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c  se if( h==(('f'<
8180: 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28  <24)+('l'<<16)+(
8190: 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20  'o'<<8)+'a')    
81a0: 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f        /* FLOA */
81b0: 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d  .        && aff=
81c0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
81d0: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66  RIC ){.      aff
81e0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   = SQLITE_AFF_RE
81f0: 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  AL;.    }else if
8200: 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b  ( h==(('d'<<24)+
8210: 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c  ('o'<<16)+('u'<<
8220: 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20  8)+'b')         
8230: 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20   /* DOUB */.    
8240: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
8250: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
8260: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
8270: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23  LITE_AFF_REAL;.#
8280: 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20  endif.    }else 
8290: 69 66 28 20 28 68 26 30 78 30 30 46 46 46 46 46  if( (h&0x00FFFFF
82a0: 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28  F)==(('i'<<16)+(
82b0: 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20  'n'<<8)+'t') ){ 
82c0: 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20     /* INT */.   
82d0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
82e0: 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  AFF_INTEGER;.   
82f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8300: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 66    }..  return af
8310: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  f;.}../*.** This
8320: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
8330: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
8340: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
8350: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
8360: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
8370: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  E statement.  Th
8380: 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69  e pFirst token i
8390: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74  s the first.** t
83a0: 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75  oken in the sequ
83b0: 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74  ence of tokens t
83c0: 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65  hat describe the
83d0: 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20   type of the.** 
83e0: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
83f0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
8400: 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20  ion.   pLast is 
8410: 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a  the last token.*
8420: 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63  * in the sequenc
8430: 65 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e 66  e.  Use this inf
8440: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73  ormation to cons
8450: 74 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a  truct a string.*
8460: 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  * that contains 
8470: 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20  the typename of 
8480: 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73  the column and s
8490: 74 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e 67  tore that string
84a0: 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f  .** in zType..*/
84b0: 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64   .void sqlite3Ad
84c0: 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73  dColumnType(Pars
84d0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
84e0: 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c   *pType){.  Tabl
84f0: 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  e *p;.  Column *
8500: 70 43 6f 6c 3b 0a 0a 20 20 70 20 3d 20 70 50 61  pCol;..  p = pPa
8510: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
8520: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45    if( p==0 || NE
8530: 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29  VER(p->nCol<1) )
8540: 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20   return;.  pCol 
8550: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43  = &p->aCol[p->nC
8560: 6f 6c 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ol-1];.  assert(
8570: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20   pCol->zType==0 
8580: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  );.  pCol->zType
8590: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
85a0: 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
85b0: 64 62 2c 20 70 54 79 70 65 29 3b 0a 20 20 70 43  db, pType);.  pC
85c0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
85d0: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
85e0: 70 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b  pe(pCol->zType);
85f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78  .}../*.** The ex
8600: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
8610: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
8620: 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
8630: 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e  tly added column
8640: 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65  .** of the table
8650: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
8660: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
8670: 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c  *.** Default val
8680: 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d  ue expressions m
8690: 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e  ust be constant.
86a0: 20 20 52 61 69 73 65 20 61 6e 20 65 78 63 65 70    Raise an excep
86b0: 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20  tion if this.** 
86c0: 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e  is not the case.
86d0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
86e0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
86f0: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
8700: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
8710: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
8720: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
8730: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
8740: 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c  sqlite3AddDefaul
8750: 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50  tValue(Parse *pP
8760: 61 72 73 65 2c 20 45 78 70 72 53 70 61 6e 20 2a  arse, ExprSpan *
8770: 70 53 70 61 6e 29 7b 0a 20 20 54 61 62 6c 65 20  pSpan){.  Table 
8780: 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *p;.  Column *pC
8790: 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ol;.  sqlite3 *d
87a0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
87b0: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
87c0: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
87d0: 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20  !=0 ){.    pCol 
87e0: 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e  = &(p->aCol[p->n
87f0: 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28  Col-1]);.    if(
8800: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
8810: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
8820: 6e 28 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 20  n(pSpan->pExpr) 
8830: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8840: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8850: 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20   "default value 
8860: 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69  of column [%s] i
8870: 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c  s not constant",
8880: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d  .          pCol-
8890: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  >zName);.    }el
88a0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63  se{.      /* A c
88b0: 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69 73 20  opy of pExpr is 
88c0: 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  used instead of 
88d0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73  the original, as
88e0: 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a   pExpr contains.
88f0: 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20        ** tokens 
8900: 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f  that point to vo
8910: 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 20 54  latile memory. T
8920: 68 65 20 27 73 70 61 6e 27 20 6f 66 20 74 68 65  he 'span' of the
8930: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
8940: 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
8950: 20 62 79 20 70 72 61 67 6d 61 20 74 61 62 6c 65   by pragma table
8960: 5f 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a  _info..      */.
8970: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
8980: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  rDelete(db, pCol
8990: 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->pDflt);.      
89a0: 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71  pCol->pDflt = sq
89b0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
89c0: 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c 20 45   pSpan->pExpr, E
89d0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
89e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
89f0: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44  ree(db, pCol->zD
8a00: 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c  flt);.      pCol
8a10: 2d 3e 7a 44 66 6c 74 20 3d 20 73 71 6c 69 74 65  ->zDflt = sqlite
8a20: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28  3DbStrNDup(db, (
8a30: 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74  char*)pSpan->zSt
8a40: 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  art,.           
8a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a60: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
8a70: 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53  pSpan->zEnd - pS
8a80: 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20  pan->zStart));. 
8a90: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
8aa0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
8ab0: 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 3b 0a   pSpan->pExpr);.
8ac0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61  }../*.** Designa
8ad0: 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  te the PRIMARY K
8ae0: 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  EY for the table
8af0: 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  .  pList is a li
8b00: 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20  st of names .** 
8b10: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
8b20: 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79  form the primary
8b30: 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20   key.  If pList 
8b40: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
8b50: 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74  e.** most recent
8b60: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20  ly added column 
8b70: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
8b80: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
8b90: 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63  .**.** A table c
8ba0: 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  an have at most 
8bb0: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  one primary key.
8bc0: 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61    If the table a
8bd0: 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20  lready has.** a 
8be0: 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64  primary key (and
8bf0: 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63   this is the sec
8c00: 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29  ond primary key)
8c10: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a   then create an.
8c20: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
8c30: 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  If the PRIMARY K
8c40: 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c  EY is on a singl
8c50: 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64  e column whose d
8c60: 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47  atatype is INTEG
8c70: 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77  ER,.** then we w
8c80: 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74  ill try to use t
8c90: 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  hat column as th
8ca0: 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68  e rowid.  Set th
8cb0: 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a  e Table.iPKey.**
8cc0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61   field of the ta
8cd0: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
8ce0: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65  uction to be the
8cf0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
8d00: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
8d10: 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61   KEY column.  Ta
8d20: 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74  ble.iPKey is set
8d30: 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20   to -1 if there 
8d40: 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52  is.** no INTEGER
8d50: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a   PRIMARY KEY..**
8d60: 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69  .** If the key i
8d70: 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52  s not an INTEGER
8d80: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68   PRIMARY KEY, th
8d90: 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  en create a uniq
8da0: 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20  ue.** index for 
8db0: 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64  the key.  No ind
8dc0: 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f  ex is created fo
8dd0: 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  r INTEGER PRIMAR
8de0: 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20  Y KEYs..*/.void 
8df0: 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72  sqlite3AddPrimar
8e00: 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  yKey(.  Parse *p
8e10: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
8e20: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
8e30: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
8e40: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66  t,  /* List of f
8e50: 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65  ield names to be
8e60: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
8e70: 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
8e80: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
8e90: 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20  th a uniqueness 
8ea0: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e  conflict */.  in
8eb0: 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20  t autoInc,      
8ec0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41  /* True if the A
8ed0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79  UTOINCREMENT key
8ee0: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
8ef0: 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
8f00: 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  er     /* SQLITE
8f10: 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54  _SO_ASC or SQLIT
8f20: 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a  E_SO_DESC */.){.
8f30: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
8f40: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
8f50: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65  e;.  char *zType
8f60: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c   = 0;.  int iCol
8f70: 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20   = -1, i;.  if( 
8f80: 70 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45  pTab==0 || IN_DE
8f90: 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74  CLARE_VTAB ) got
8fa0: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
8fb0: 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  it;.  if( pTab->
8fc0: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61  tabFlags & TF_Ha
8fd0: 73 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20  sPrimaryKey ){. 
8fe0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8ff0: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
9000: 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20    "table \"%s\" 
9010: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
9020: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20  e primary key", 
9030: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
9040: 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b    goto primary_k
9050: 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70  ey_exit;.  }.  p
9060: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
9070: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
9080: 79 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  y;.  if( pList==
9090: 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  0 ){.    iCol = 
90a0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a  pTab->nCol - 1;.
90b0: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
90c0: 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d  Col].isPrimKey =
90d0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
90e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
90f0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
9100: 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30        for(iCol=0
9110: 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ; iCol<pTab->nCo
9120: 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
9130: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
9140: 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
9150: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i].zName, pTab->
9160: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
9170: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
9180: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
9190: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
91a0: 20 69 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e   if( iCol<pTab->
91b0: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
91c0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
91d0: 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a  .isPrimKey = 1;.
91e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
91f0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78    if( pList->nEx
9200: 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31  pr>1 ) iCol = -1
9210: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  ;.  }.  if( iCol
9220: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
9230: 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54  ->nCol ){.    zT
9240: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
9250: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
9260: 7d 0a 20 20 69 66 28 20 7a 54 79 70 65 20 26 26  }.  if( zType &&
9270: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
9280: 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22  zType, "INTEGER"
9290: 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20  )==0.        && 
92a0: 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54  sortOrder==SQLIT
92b0: 45 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20  E_SO_ASC ){.    
92c0: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43  pTab->iPKey = iC
92d0: 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65  ol;.    pTab->ke
92e0: 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72  yConf = (u8)onEr
92f0: 72 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ror;.    assert(
9300: 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61   autoInc==0 || a
9310: 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20  utoInc==1 );.   
9320: 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
9330: 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75  |= autoInc*TF_Au
9340: 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 7d  toincrement;.  }
9350: 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63  else if( autoInc
9360: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
9370: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
9380: 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65  EMENT.    sqlite
9390: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
93a0: 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  , "AUTOINCREMENT
93b0: 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64   is only allowed
93c0: 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20   on an ".       
93d0: 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59  "INTEGER PRIMARY
93e0: 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20   KEY");.#endif. 
93f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65   }else{.    Inde
9400: 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71  x *p;.    p = sq
9410: 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
9420: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30  (pParse, 0, 0, 0
9430: 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72  , pList, onError
9440: 2c 20 30 2c 20 30 2c 20 73 6f 72 74 4f 72 64 65  , 0, 0, sortOrde
9450: 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 0);.    if( p
9460: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74   ){.      p->aut
9470: 6f 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20 20 20  oIndex = 2;.    
9480: 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b  }.    pList = 0;
9490: 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65  .  }..primary_ke
94a0: 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65  y_exit:.  sqlite
94b0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
94c0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73  pParse->db, pLis
94d0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  t);.  return;.}.
94e0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
94f0: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
9500: 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  t to the table c
9510: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
9520: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  onstruction..*/.
9530: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
9540: 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a  heckConstraint(.
9550: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9560: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
9570: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
9580: 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a   *pCheckExpr  /*
9590: 20 54 68 65 20 63 68 65 63 6b 20 65 78 70 72 65   The check expre
95a0: 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71  ssion */.){.  sq
95b0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
95c0: 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20  se->db;.#ifndef 
95d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
95e0: 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  K.  Table *pTab 
95f0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
9600: 62 6c 65 3b 0a 20 20 69 66 28 20 70 54 61 62 20  ble;.  if( pTab 
9610: 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56  && !IN_DECLARE_V
9620: 54 41 42 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  TAB ){.    pTab-
9630: 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65  >pCheck = sqlite
9640: 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 54 61  3ExprAnd(db, pTa
9650: 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68 65 63  b->pCheck, pChec
9660: 6b 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65 0a  kExpr);.  }else.
9670: 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73  #endif.  {.    s
9680: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
9690: 28 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29  (db, pCheckExpr)
96a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
96b0: 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  et the collation
96c0: 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65   function of the
96d0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70   most recently p
96e0: 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75  arsed table colu
96f0: 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c  mn.** to the Col
9700: 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76  lSeq given..*/.v
9710: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
9720: 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20  llateType(Parse 
9730: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
9740: 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65  pToken){.  Table
9750: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
9760: 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20  char *zColl;    
9770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71            /* Deq
9780: 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f  uoted name of co
9790: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
97a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
97b0: 62 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70  b;..  if( (p = p
97c0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
97d0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
97e0: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
97f0: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
9800: 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  b;.  zColl = sql
9810: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
9820: 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  n(db, pToken);. 
9830: 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65   if( !zColl ) re
9840: 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c  turn;..  if( sql
9850: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
9860: 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  q(pParse, zColl)
9870: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
9880: 49 64 78 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c  Idx;.    p->aCol
9890: 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c  [i].zColl = zCol
98a0: 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  l;.  .    /* If 
98b0: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65  the column is de
98c0: 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65  clared as "<name
98d0: 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f  > PRIMARY KEY CO
98e0: 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20  LLATE <type>",. 
98f0: 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e     ** then an in
9900: 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65  dex may have bee
9910: 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69  n created on thi
9920: 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20  s column before 
9930: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61  the.    ** colla
9940: 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64  tion type was ad
9950: 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69  ded. Correct thi
9960: 73 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63  s if it is the c
9970: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
9980: 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64  for(pIdx=p->pInd
9990: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
99a0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
99b0: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
99c0: 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20  >nColumn==1 );. 
99d0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
99e0: 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b  iColumn[0]==i ){
99f0: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
9a00: 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43  zColl[0] = p->aC
9a10: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[i].zColl;.   
9a20: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
9a30: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  se{.    sqlite3D
9a40: 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29  bFree(db, zColl)
9a50: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
9a60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
9a70: 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  urns the collati
9a80: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
9a90: 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20  database native 
9aa0: 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67  text.** encoding
9ab0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
9ac0: 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c  he string zName,
9ad0: 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a   length nName..*
9ae0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75  *.** If the requ
9af0: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ested collation 
9b00: 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20  sequence is not 
9b10: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f  available, or no
9b20: 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69  t available.** i
9b30: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  n the database n
9b40: 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20  ative encoding, 
9b50: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
9b60: 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64  ctory is invoked
9b70: 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69   to.** request i
9b80: 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74  t. If the collat
9b90: 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73  ion factory does
9ba0: 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68   not supply such
9bb0: 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20   a sequence,.** 
9bc0: 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65  and the sequence
9bd0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e   is available in
9be0: 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e   another text en
9bf0: 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61  coding, then tha
9c00: 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  t is.** returned
9c10: 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
9c20: 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f  If no versions o
9c30: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
9c40: 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65  collations seque
9c50: 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c  nce are availabl
9c60: 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72  e, or.** another
9c70: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
9c80: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
9c90: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  and an error mes
9ca0: 73 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74  sage written int
9cb0: 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a  o.** pParse..**.
9cc0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9cd0: 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
9ce0: 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43  und sqlite3FindC
9cf0: 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20  ollSeq().  This 
9d00: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b  routine.** invok
9d10: 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  es the collation
9d20: 20 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20   factory if the 
9d30: 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  named collation 
9d40: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a  cannot be found.
9d50: 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73  ** and generates
9d60: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
9d70: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
9d80: 6f 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  o: sqlite3FindCo
9d90: 6c 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33  llSeq(), sqlite3
9da0: 47 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a  GetCollSeq().*/.
9db0: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
9dc0: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61  LocateCollSeq(Pa
9dd0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
9de0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
9df0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
9e00: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75   pParse->db;.  u
9e10: 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  8 enc = ENC(db);
9e20: 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d  .  u8 initbusy =
9e30: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a   db->init.busy;.
9e40: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
9e50: 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  ;..  pColl = sql
9e60: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
9e70: 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20  db, enc, zName, 
9e80: 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28  initbusy);.  if(
9e90: 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21   !initbusy && (!
9ea0: 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d  pColl || !pColl-
9eb0: 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43  >xCmp) ){.    pC
9ec0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
9ed0: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c  CollSeq(db, enc,
9ee0: 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a   pColl, zName);.
9ef0: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
9f00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
9f10: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
9f20: 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69  "no such collati
9f30: 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25 73 22  on sequence: %s"
9f40: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , zName);.    }.
9f50: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43    }..  return pC
9f60: 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  oll;.}.../*.** G
9f70: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
9f80: 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74  t will increment
9f90: 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
9fa0: 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63  ie..**.** The sc
9fb0: 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75  hema cookie is u
9fc0: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
9fd0: 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   when the schema
9fe0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61   for the.** data
9ff0: 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41  base changes.  A
a000: 66 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61  fter each schema
a010: 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f   change, the coo
a020: 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61  kie value.** cha
a030: 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72  nges.  When a pr
a040: 6f 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64  ocess first read
a050: 73 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20  s the schema it 
a060: 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63  records the.** c
a070: 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74  ookie.  Thereaft
a080: 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20  er, whenever it 
a090: 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74  goes to access t
a0a0: 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20  he database,.** 
a0b0: 69 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f  it checks the co
a0c0: 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  okie to make sur
a0d0: 65 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73  e the schema has
a0e0: 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20   not changed.** 
a0f0: 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73  since it was las
a100: 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  t read..**.** Th
a110: 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63  is plan is not c
a120: 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74  ompletely bullet
a130: 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70  -proof.  It is p
a140: 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74  ossible for.** t
a150: 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61  he schema to cha
a160: 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  nge multiple tim
a170: 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63  es and for the c
a180: 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73  ookie to be.** s
a190: 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72  et back to prior
a1a0: 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68   value.  But sch
a1b0: 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20  ema changes are 
a1c0: 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e  infrequent.** an
a1d0: 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  d the probabilit
a1e0: 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65  y of hitting the
a1f0: 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c   same cookie val
a200: 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20  ue is only.** 1 
a210: 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20  chance in 2^32. 
a220: 20 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65   So we're safe e
a230: 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73  nough..*/.void s
a240: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
a250: 69 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ie(Parse *pParse
a260: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e  , int iDb){.  in
a270: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
a280: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
a290: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
a2a0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
a2b0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
a2c0: 2d 3e 70 56 64 62 65 3b 0a 20 20 73 71 6c 69 74  ->pVdbe;.  sqlit
a2d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a2e0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e  OP_Integer, db->
a2f0: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
a300: 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b  ->schema_cookie+
a310: 31 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  1, r1);.  sqlite
a320: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
a330: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
a340: 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56  , BTREE_SCHEMA_V
a350: 45 52 53 49 4f 4e 2c 20 72 31 29 3b 0a 20 20 73  ERSION, r1);.  s
a360: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
a370: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
a380: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75  ;.}../*.** Measu
a390: 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  re the number of
a3a0: 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64   characters need
a3b0: 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65  ed to output the
a3c0: 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69   given.** identi
a3d0: 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65  fier.  The numbe
a3e0: 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75  r returned inclu
a3f0: 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75  des any quotes u
a400: 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20  sed.** but does 
a410: 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20  not include the 
a420: 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e  null terminator.
a430: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d  .**.** The estim
a440: 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74  ate is conservat
a450: 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62  ive.  It might b
a460: 65 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68  e larger that wh
a470: 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  at is.** really 
a480: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
a490: 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74  c int identLengt
a4a0: 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  h(const char *z)
a4b0: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72  {.  int n;.  for
a4c0: 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a  (n=0; *z; n++, z
a4d0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  ++){.    if( *z=
a4e0: 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20  ='"' ){ n++; }. 
a4f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20   }.  return n + 
a500: 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  2;.}../*.** The 
a510: 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20  first parameter 
a520: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
a530: 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  an output buffer
a540: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  . The second .**
a550: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
a560: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
a570: 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61  teger that conta
a580: 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20 61  ins the offset a
a590: 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72  t.** which to wr
a5a0: 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ite into the out
a5b0: 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 69 73  put buffer. This
a5c0: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73   function copies
a5d0: 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d   the.** nul-term
a5e0: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f  inated string po
a5f0: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
a600: 74 68 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c  third parameter,
a610: 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a   zSignedIdent,.*
a620: 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  * to the specifi
a630: 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  ed offset in the
a640: 20 62 75 66 66 65 72 20 61 6e 64 20 75 70 64 61   buffer and upda
a650: 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66  tes *pIdx to ref
a660: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  er.** to the fir
a670: 73 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68  st byte after th
a680: 65 20 6c 61 73 74 20 62 79 74 65 20 77 72 69 74  e last byte writ
a690: 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72  ten before retur
a6a0: 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  ning..** .** If 
a6b0: 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e  the string zSign
a6c0: 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73  edIdent consists
a6d0: 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70   entirely of alp
a6e0: 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68  ha-numeric.** ch
a6f0: 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e  aracters, does n
a700: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
a710: 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74  digit and is not
a720: 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c   an SQL keyword,
a730: 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63  .** then it is c
a740: 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74  opied to the out
a750: 70 75 74 20 62 75 66 66 65 72 20 65 78 61 63 74  put buffer exact
a760: 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68  ly as it is. Oth
a770: 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73  erwise,.** it is
a780: 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f   quoted using do
a790: 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a  uble-quotes..*/.
a7a0: 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e  static void iden
a7b0: 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e  tPut(char *z, in
a7c0: 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a  t *pIdx, char *z
a7d0: 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20  SignedIdent){.  
a7e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
a7f0: 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65  Ident = (unsigne
a800: 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49  d char*)zSignedI
a810: 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  dent;.  int i, j
a820: 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69  , needQuote;.  i
a830: 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72   = *pIdx;..  for
a840: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
a850: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   j++){.    if( !
a860: 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a  sqlite3Isalnum(z
a870: 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64  Ident[j]) && zId
a880: 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72  ent[j]!='_' ) br
a890: 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51  eak;.  }.  needQ
a8a0: 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73  uote = sqlite3Is
a8b0: 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29  digit(zIdent[0])
a8c0: 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f   || sqlite3Keywo
a8d0: 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a  rdCode(zIdent, j
a8e0: 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20  )!=TK_ID;.  if( 
a8f0: 21 6e 65 65 64 51 75 6f 74 65 20 29 7b 0a 20 20  !needQuote ){.  
a900: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 7a 49    needQuote = zI
a910: 64 65 6e 74 5b 6a 5d 3b 0a 20 20 7d 0a 0a 20 20  dent[j];.  }..  
a920: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
a930: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
a940: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
a950: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b  j]; j++){.    z[
a960: 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d  i++] = zIdent[j]
a970: 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74  ;.    if( zIdent
a980: 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b  [j]=='"' ) z[i++
a990: 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69  ] = '"';.  }.  i
a9a0: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
a9b0: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a  [i++] = '"';.  z
a9c0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78  [i] = 0;.  *pIdx
a9d0: 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = i;.}../*.** G
a9e0: 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45  enerate a CREATE
a9f0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
aa00: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
aa10: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61   the given.** ta
aa20: 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20  ble.  Memory to 
aa30: 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66  hold the text of
aa40: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
aa50: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  s obtained.** fr
aa60: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
aa70: 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
aa80: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
aa90: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
aaa0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65  static char *cre
aab0: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c  ateTableStmt(sql
aac0: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
aad0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c  *p){.  int i, k,
aae0: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d   n;.  char *zStm
aaf0: 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c  t;.  char *zSep,
ab00: 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a   *zSep2, *zEnd;.
ab10: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
ab20: 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70    n = 0;.  for(p
ab30: 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69  Col = p->aCol, i
ab40: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
ab50: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
ab60: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
ab70: 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b  h(pCol->zName) +
ab80: 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69   5;.  }.  n += i
ab90: 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e  dentLength(p->zN
aba0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30  ame);.  if( n<50
abb0: 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d 20   ){ .    zSep = 
abc0: 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20  "";.    zSep2 = 
abd0: 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20  ",";.    zEnd = 
abe0: 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ")";.  }else{.  
abf0: 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b    zSep = "\n  ";
ac00: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c  .    zSep2 = ",\
ac10: 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d  n  ";.    zEnd =
ac20: 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20   "\n)";.  }.  n 
ac30: 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f  += 35 + 6*p->nCo
ac40: 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c  l;.  zStmt = sql
ac50: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
ac60: 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53 74  0, n);.  if( zSt
ac70: 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  mt==0 ){.    db-
ac80: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
ac90: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  1;.    return 0;
aca0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
acb0: 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74  nprintf(n, zStmt
acc0: 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  , "CREATE TABLE 
acd0: 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65  ");.  k = sqlite
ace0: 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29  3Strlen30(zStmt)
acf0: 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74  ;.  identPut(zSt
ad00: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65  mt, &k, p->zName
ad10: 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20  );.  zStmt[k++] 
ad20: 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f  = '(';.  for(pCo
ad30: 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20  l=p->aCol, i=0; 
ad40: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  i<p->nCol; i++, 
ad50: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61  pCol++){.    sta
ad60: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
ad70: 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20   const azType[] 
ad80: 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  = {.        /* S
ad90: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20  QLITE_AFF_TEXT  
ada0: 20 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20 20    */ " TEXT",.  
adb0: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
adc0: 41 46 46 5f 4e 4f 4e 45 20 20 20 20 2a 2f 20 22  AFF_NONE    */ "
add0: 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51  ",.        /* SQ
ade0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
adf0: 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20   */ " NUM",.    
ae00: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
ae10: 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20 49  F_INTEGER */ " I
ae20: 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  NT",.        /* 
ae30: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
ae40: 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20     */ " REAL".  
ae50: 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e    };.    int len
ae60: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
ae70: 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73 71   *zType;..    sq
ae80: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
ae90: 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  -k, &zStmt[k], z
aea0: 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73  Sep);.    k += s
aeb0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26  qlite3Strlen30(&
aec0: 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a  zStmt[k]);.    z
aed0: 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20  Sep = zSep2;.   
aee0: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
aef0: 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65   &k, pCol->zName
af00: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
af10: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51  Col->affinity-SQ
af20: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 3e 3d  LITE_AFF_TEXT >=
af30: 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74   0 );.    assert
af40: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
af50: 2d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  -SQLITE_AFF_TEXT
af60: 20 3c 20 73 69 7a 65 6f 66 28 61 7a 54 79 70 65   < sizeof(azType
af70: 29 2f 73 69 7a 65 6f 66 28 61 7a 54 79 70 65 5b  )/sizeof(azType[
af80: 30 5d 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63  0]) );.    testc
af90: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
afa0: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
afb0: 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65 73 74  TEXT );.    test
afc0: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
afd0: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
afe0: 5f 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 74 65 73  _NONE );.    tes
aff0: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
b000: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
b010: 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20  F_NUMERIC );.   
b020: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
b030: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
b040: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
b050: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
b060: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
b070: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29  QLITE_AFF_REAL )
b080: 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79 70 65  ;.    .    zType
b090: 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e   = azType[pCol->
b0a0: 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c 49 54  affinity - SQLIT
b0b0: 45 5f 41 46 46 5f 54 45 58 54 5d 3b 0a 20 20 20  E_AFF_TEXT];.   
b0c0: 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74   len = sqlite3St
b0d0: 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20  rlen30(zType);. 
b0e0: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
b0f0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
b100: 45 5f 41 46 46 5f 4e 4f 4e 45 20 0a 20 20 20 20  E_AFF_NONE .    
b110: 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c 2d          || pCol-
b120: 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74  >affinity==sqlit
b130: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a  e3AffinityType(z
b140: 54 79 70 65 29 20 29 3b 0a 20 20 20 20 6d 65 6d  Type) );.    mem
b150: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
b160: 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  Type, len);.    
b170: 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73  k += len;.    as
b180: 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20  sert( k<=n );.  
b190: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  }.  sqlite3_snpr
b1a0: 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74  intf(n-k, &zStmt
b1b0: 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29  [k], "%s", zEnd)
b1c0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74  ;.  return zStmt
b1d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
b1e0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
b1f0: 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20  d to report the 
b200: 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74  final ")" that t
b210: 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43  erminates.** a C
b220: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
b230: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
b240: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
b250: 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69   that other acti
b260: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65  on routines have
b270: 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a   been building.*
b280: 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  * is added to th
b290: 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  e internal hash 
b2a0: 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67  tables, assuming
b2b0: 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a   no errors have.
b2c0: 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a  ** occurred..**.
b2d0: 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20  ** An entry for 
b2e0: 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64  the table is mad
b2f0: 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20  e in the master 
b300: 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75  table on disk, u
b310: 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73  nless.** this is
b320: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
b330: 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62  le or db->init.b
b340: 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62  usy==1.  When db
b350: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a  ->init.busy==1.*
b360: 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  * it means we ar
b370: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  e reading the sq
b380: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
b390: 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  e because we jus
b3a0: 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74  t.** connected t
b3b0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  o the database o
b3c0: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71  r because the sq
b3d0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
b3e0: 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c  e has.** recentl
b3f0: 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68  y changed, so th
b400: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73  e entry for this
b410: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
b420: 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20  xists in.** the 
b430: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
b440: 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  ble.  We do not 
b450: 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69  want to create i
b460: 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49  t again..**.** I
b470: 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72  f the pSelect ar
b480: 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
b490: 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  LL, it means tha
b4a0: 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
b4b0: 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  * was called to 
b4c0: 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67  create a table g
b4d0: 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20  enerated from a 
b4e0: 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c  .** "CREATE TABL
b4f0: 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20  E ... AS SELECT 
b500: 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20  ..." statement. 
b510: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   The column name
b520: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  s of.** the new 
b530: 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68  table will match
b540: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
b550: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  of the SELECT..*
b560: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e  /.void sqlite3En
b570: 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  dTable(.  Parse 
b580: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
b590: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
b5a0: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
b5b0: 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20  Cons,           
b5c0: 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e  /* The ',' token
b5d0: 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20   after the last 
b5e0: 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a  column defn. */.
b5f0: 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20    Token *pEnd,  
b600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
b610: 20 66 69 6e 61 6c 20 27 29 27 20 74 6f 6b 65 6e   final ')' token
b620: 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
b630: 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ABLE */.  Select
b640: 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20   *pSelect       
b650: 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d    /* Select from
b660: 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41   a "CREATE ... A
b670: 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a  S SELECT" */.){.
b680: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71    Table *p;.  sq
b690: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
b6a0: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
b6b0: 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d  b;..  if( (pEnd=
b6c0: 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30  =0 && pSelect==0
b6d0: 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ) || db->mallocF
b6e0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
b6f0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 70  urn;.  }.  p = p
b700: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
b710: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
b720: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
b730: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
b740: 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a   || !pSelect );.
b750: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
b760: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
b770: 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a  , p->pSchema);..
b780: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b790: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52  MIT_CHECK.  /* R
b7a0: 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20  esolve names in 
b7b0: 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  all CHECK constr
b7c0: 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73  aint expressions
b7d0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
b7e0: 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 53 72  pCheck ){.    Sr
b7f0: 63 4c 69 73 74 20 73 53 72 63 3b 20 20 20 20 20  cList sSrc;     
b800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b810: 20 46 61 6b 65 20 53 72 63 4c 69 73 74 20 66 6f   Fake SrcList fo
b820: 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  r pParse->pNewTa
b830: 62 6c 65 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43  ble */.    NameC
b840: 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20  ontext sNC;     
b850: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
b860: 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
b870: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
b880: 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28   */..    memset(
b890: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
b8a0: 73 4e 43 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  sNC));.    memse
b8b0: 74 28 26 73 53 72 63 2c 20 30 2c 20 73 69 7a 65  t(&sSrc, 0, size
b8c0: 6f 66 28 73 53 72 63 29 29 3b 0a 20 20 20 20 73  of(sSrc));.    s
b8d0: 53 72 63 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20  Src.nSrc = 1;.  
b8e0: 20 20 73 53 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d    sSrc.a[0].zNam
b8f0: 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  e = p->zName;.  
b900: 20 20 73 53 72 63 2e 61 5b 30 5d 2e 70 54 61 62    sSrc.a[0].pTab
b910: 20 3d 20 70 3b 0a 20 20 20 20 73 53 72 63 2e 61   = p;.    sSrc.a
b920: 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31  [0].iCursor = -1
b930: 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65  ;.    sNC.pParse
b940: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73   = pParse;.    s
b950: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 26 73  NC.pSrcList = &s
b960: 53 72 63 3b 0a 20 20 20 20 73 4e 43 2e 69 73 43  Src;.    sNC.isC
b970: 68 65 63 6b 20 3d 20 31 3b 0a 20 20 20 20 69 66  heck = 1;.    if
b980: 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  ( sqlite3Resolve
b990: 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20  ExprNames(&sNC, 
b9a0: 70 2d 3e 70 43 68 65 63 6b 29 20 29 7b 0a 20 20  p->pCheck) ){.  
b9b0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
b9c0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
b9d0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b9e0: 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a  OMIT_CHECK) */..
b9f0: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
ba00: 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69  init.busy is 1 i
ba10: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
ba20: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
ba30: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
ba40: 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22  ite_master" or "
ba50: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
ba60: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
ba70: 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64   disk..  ** So d
ba80: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
ba90: 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20  he disk again.  
baa0: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
bab0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
bac0: 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
bad0: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69  from the db->ini
bae0: 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  t.newTnum field.
baf0: 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62    (The page numb
bb00: 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  er.  ** should h
bb10: 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65  ave been put the
bb20: 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  re by the sqlite
bb30: 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29  OpenCb routine.)
bb40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
bb50: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
bb60: 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69   p->tnum = db->i
bb70: 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d  nit.newTnum;.  }
bb80: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e  ..  /* If not in
bb90: 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e  itializing, then
bba0: 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64   create a record
bbb0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
bbc0: 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53  le.  ** in the S
bbd0: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
bbe0: 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  le of the databa
bbf0: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  se..  **.  ** If
bc00: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f   this is a TEMPO
bc10: 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74  RARY table, writ
bc20: 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f  e the entry into
bc30: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20   the auxiliary. 
bc40: 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64   ** file instead
bc50: 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   of into the mai
bc60: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
bc70: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
bc80: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
bc90: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62    int n;.    Vdb
bca0: 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a  e *v;.    char *
bcb0: 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69  zType;    /* "vi
bcc0: 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a  ew" or "table" *
bcd0: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  /.    char *zTyp
bce0: 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20  e2;   /* "VIEW" 
bcf0: 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20  or "TABLE" */.  
bd00: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20    char *zStmt;  
bd10: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
bd20: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72   CREATE TABLE or
bd30: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
bd40: 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76  tement */..    v
bd50: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
bd60: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
bd70: 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
bd80: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71   return;..    sq
bd90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
bda0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b  v, OP_Close, 0);
bdb0: 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a  ..    /* .    **
bdc0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70   Initialize zTyp
bdd0: 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69  e for the new vi
bde0: 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20  ew or table..   
bdf0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
be00: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
be10: 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20     /* A regular 
be20: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a  table */.      z
be30: 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a  Type = "table";.
be40: 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22        zType2 = "
be50: 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20  TABLE";.#ifndef 
be60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
be70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
be80: 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20    /* A view */. 
be90: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69       zType = "vi
bea0: 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  ew";.      zType
beb0: 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64  2 = "VIEW";.#end
bec0: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
bed0: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52   If this is a CR
bee0: 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53  EATE TABLE xx AS
bef0: 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65   SELECT ..., exe
bf00: 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a  cute the SELECT.
bf10: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
bf20: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65   to populate the
bf30: 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20   new table. The 
bf40: 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
bf50: 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20   for the.    ** 
bf60: 6e 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20  new table is in 
bf70: 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d  register pParse-
bf80: 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a  >regRoot..    **
bf90: 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65  .    ** Once the
bfa0: 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e   SELECT has been
bfb0: 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65   coded by sqlite
bfc0: 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73  3Select(), it is
bfd0: 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69   in a.    ** sui
bfe0: 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71  table state to q
bff0: 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  uery for the col
c000: 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79  umn names and ty
c010: 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20  pes to be used. 
c020: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77     ** by the new
c030: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20   table..    **. 
c040: 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63     ** A shared-c
c050: 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ache write-lock 
c060: 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
c070: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
c080: 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a  new table,.    *
c090: 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f  * as a schema-lo
c0a0: 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ck must have alr
c0b0: 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e  eady been obtain
c0c0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e  ed to create it.
c0d0: 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20   Since.    ** a 
c0e0: 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c  schema-lock excl
c0f0: 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64  udes all other d
c100: 61 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74  atabase users, t
c110: 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f  he write-lock wo
c120: 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65  uld.    ** be re
c130: 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a  dundant..    */.
c140: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
c150: 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  ){.      SelectD
c160: 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20  est dest;.      
c170: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a  Table *pSelTab;.
c180: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
c190: 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a  arse->nTab==1);.
c1a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c1b0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
c1c0: 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50 61 72  enWrite, 1, pPar
c1d0: 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62  se->regRoot, iDb
c1e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c1f0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
c200: 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  1);.      pParse
c210: 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20  ->nTab = 2;.    
c220: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
c230: 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
c240: 52 54 5f 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20  RT_Table, 1);.  
c250: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
c260: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
c270: 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  t, &dest);.     
c280: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c290: 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
c2a0: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  1);.      if( pP
c2b0: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b  arse->nErr==0 ){
c2c0: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
c2d0: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
c2e0: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
c2f0: 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  se, pSelect);.  
c300: 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61        if( pSelTa
c310: 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  b==0 ) return;. 
c320: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
c330: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
c340: 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70       p->nCol = p
c350: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
c360: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20        p->aCol = 
c370: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
c380: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e         pSelTab->
c390: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
c3a0: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
c3b0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
c3c0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
c3d0: 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  db, pSelTab);.  
c3e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
c3f0: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
c400: 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
c410: 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74   the CREATE stat
c420: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28  ement */.    if(
c430: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
c440: 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65    zStmt = create
c450: 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 29  TableStmt(db, p)
c460: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c470: 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e     n = (int)(pEn
c480: 64 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73  d->z - pParse->s
c490: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31  NameToken.z) + 1
c4a0: 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  ;.      zStmt = 
c4b0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
c4c0: 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 43  b, .          "C
c4d0: 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20  REATE %s %.*s", 
c4e0: 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73  zType2, n, pPars
c4f0: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a  e->sNameToken.z.
c500: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
c510: 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f      /* A slot fo
c520: 72 20 74 68 65 20 72 65 63 6f 72 64 20 68 61 73  r the record has
c530: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
c540: 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a  located in the .
c550: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41      ** SQLITE_MA
c560: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20  STER table.  We 
c570: 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64  just need to upd
c580: 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69  ate that slot wi
c590: 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68  th all.    ** th
c5a0: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65  e information we
c5b0: 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 0a 20  've collected.. 
c5c0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
c5d0: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
c5e0: 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41  rse,.      "UPDA
c5f0: 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20  TE %Q.%s ".     
c600: 20 20 20 20 22 53 45 54 20 74 79 70 65 3d 27 25      "SET type='%
c610: 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c  s', name=%Q, tbl
c620: 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61  _name=%Q, rootpa
c630: 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20 22  ge=#%d, sql=%Q "
c640: 0a 20 20 20 20 20 20 20 22 57 48 45 52 45 20 72  .       "WHERE r
c650: 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20 20 20  owid=#%d",.     
c660: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
c670: 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
c680: 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 7a 54  E(iDb),.      zT
c690: 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e  ype,.      p->zN
c6a0: 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e  ame,.      p->zN
c6b0: 61 6d 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73  ame,.      pPars
c6c0: 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20  e->regRoot,.    
c6d0: 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70    zStmt,.      p
c6e0: 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a  Parse->regRowid.
c6f0: 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
c700: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74  e3DbFree(db, zSt
c710: 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mt);.    sqlite3
c720: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
c730: 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  rse, iDb);..#ifn
c740: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c750: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
c760: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
c770: 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
c780: 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65  create an sqlite
c790: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
c7a0: 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69  for.    ** keepi
c7b0: 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f  ng track of auto
c7c0: 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a  increment keys..
c7d0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
c7e0: 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
c7f0: 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b  Autoincrement ){
c800: 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d  .      Db *pDb =
c810: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
c820: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70        if( pDb->p
c830: 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d  Schema->pSeqTab=
c840: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
c850: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
c860: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
c870: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
c880: 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65   %Q.sqlite_seque
c890: 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a  nce(name,seq)",.
c8a0: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a            pDb->z
c8b0: 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a  Name.        );.
c8c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
c8d0: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70  ndif..    /* Rep
c8e0: 61 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20  arse everything 
c8f0: 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e  to update our in
c900: 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75  ternal data stru
c910: 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71  ctures */.    sq
c920: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
c930: 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  v, OP_ParseSchem
c940: 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 0a 20 20  a, iDb, 0, 0,.  
c950: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
c960: 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61  intf(db, "tbl_na
c970: 6d 65 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d  me='%q'",p->zNam
c980: 65 29 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  e), P4_DYNAMIC);
c990: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20  .  }...  /* Add 
c9a0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65  the table to the
c9b0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
c9c0: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
c9d0: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
c9e0: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
c9f0: 75 73 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  usy ){.    Table
ca00: 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65   *pOld;.    Sche
ca10: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d  ma *pSchema = p-
ca20: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4f  >pSchema;.    pO
ca30: 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ld = sqlite3Hash
ca40: 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61 2d  Insert(&pSchema-
ca50: 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61  >tblHash, p->zNa
ca60: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
ca70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca80: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
ca90: 28 70 2d 3e 7a 4e 61 6d 65 29 2c 70 29 3b 0a 20  (p->zName),p);. 
caa0: 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20     if( pOld ){. 
cab0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
cac0: 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  pOld );  /* Mall
cad0: 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
cae0: 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49  led inside HashI
caf0: 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20  nsert() */.     
cb00: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
cb10: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  d = 1;.      ret
cb20: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
cb30: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
cb40: 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54   = 0;.    db->nT
cb50: 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e  able++;.    db->
cb60: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
cb70: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a  InternChanges;..
cb80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
cb90: 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20  MIT_ALTERTABLE. 
cba0: 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65     if( !p->pSele
cbb0: 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ct ){.      cons
cbc0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
cbd0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50  (const char *)pP
cbe0: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
cbf0: 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e  .z;.      int nN
cc00: 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ame;.      asser
cc10: 74 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70  t( !pSelect && p
cc20: 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a  Cons && pEnd );.
cc30: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d        if( pCons-
cc40: 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >z==0 ){.       
cc50: 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20   pCons = pEnd;. 
cc60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61       }.      nNa
cc70: 6d 65 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73  me = (int)((cons
cc80: 74 20 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e  t char *)pCons->
cc90: 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  z - zName);.    
cca0: 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65    p->addColOffse
ccb0: 74 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65 33  t = 13 + sqlite3
ccc0: 55 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d  Utf8CharLen(zNam
ccd0: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, nName);.    }
cce0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23  .#endif.  }.}..#
ccf0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
cd00: 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68  IT_VIEW./*.** Th
cd10: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
cd20: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f  his routine in o
cd30: 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61  rder to create a
cd40: 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69   new VIEW.*/.voi
cd50: 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56  d sqlite3CreateV
cd60: 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50  iew(.  Parse *pP
cd70: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65  arse,     /* The
cd80: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
cd90: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65   */.  Token *pBe
cda0: 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  gin,     /* The 
cdb0: 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
cdc0: 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61  t begins the sta
cdd0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65  tement */.  Toke
cde0: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f  n *pName1,     /
cdf0: 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
ce00: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
ce10: 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
ce20: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
ce30: 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
ce40: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
ce50: 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
ce60: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
ce70: 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45  elect,   /* A SE
ce80: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
ce90: 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
cea0: 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a  the new view */.
ceb0: 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20    int isTemp,   
cec0: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72       /* TRUE for
ced0: 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65   a TEMPORARY vie
cee0: 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72  w */.  int noErr
cef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 70            /* Sup
cf00: 70 72 65 73 73 20 65 72 72 6f 72 20 6d 65 73 73  press error mess
cf10: 61 67 65 73 20 69 66 20 56 49 45 57 20 61 6c 72  ages if VIEW alr
cf20: 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29  eady exists */.)
cf30: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
cf40: 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63  int n;.  const c
cf50: 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20  har *z;.  Token 
cf60: 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20  sEnd;.  DbFixer 
cf70: 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70  sFix;.  Token *p
cf80: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 44 62 3b  Name;.  int iDb;
cf90: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
cfa0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
cfb0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  if( pParse->nVar
cfc0: 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
cfd0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
cfe0: 2c 20 22 70 61 72 61 6d 65 74 65 72 73 20 61 72  , "parameters ar
cff0: 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e  e not allowed in
d000: 20 76 69 65 77 73 22 29 3b 0a 20 20 20 20 73 71   views");.    sq
d010: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
d020: 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  e(db, pSelect);.
d030: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
d040: 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
d050: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ble(pParse, pNam
d060: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65  e1, pName2, isTe
d070: 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29  mp, 1, 0, noErr)
d080: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
d090: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
d0a0: 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
d0b0: 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c  >nErr ){.    sql
d0c0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
d0d0: 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (db, pSelect);. 
d0e0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
d0f0: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
d100: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
d110: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
d120: 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c  me);.  iDb = sql
d130: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
d140: 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  x(db, p->pSchema
d150: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
d160: 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70  FixInit(&sFix, p
d170: 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69 65  Parse, iDb, "vie
d180: 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20 26  w", pName).    &
d190: 26 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65  & sqlite3FixSele
d1a0: 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63  ct(&sFix, pSelec
d1b0: 74 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  t).  ){.    sqli
d1c0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
d1d0: 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
d1e0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
d1f0: 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20   /* Make a copy 
d200: 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45  of the entire SE
d210: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
d220: 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
d230: 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20  view..  ** This 
d240: 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74  will force all t
d250: 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20  he Expr.token.z 
d260: 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e  values to be dyn
d270: 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c  amically.  ** al
d280: 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74  located rather t
d290: 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  han point to the
d2a0: 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20   input string - 
d2b0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
d2c0: 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20  .  ** they will 
d2d0: 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68  persist after th
d2e0: 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65  e current sqlite
d2f0: 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65  3_exec() call re
d300: 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d  turns..  */.  p-
d310: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
d320: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
d330: 70 53 65 6c 65 63 74 2c 20 45 58 50 52 44 55 50  pSelect, EXPRDUP
d340: 5f 52 45 44 55 43 45 29 3b 0a 20 20 73 71 6c 69  _REDUCE);.  sqli
d350: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
d360: 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
d370: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
d380: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
d390: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64  rn;.  }.  if( !d
d3a0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
d3b0: 20 20 20 20 73 71 6c 69 74 65 33 56 69 65 77 47      sqlite3ViewG
d3c0: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
d3d0: 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20  arse, p);.  }.. 
d3e0: 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65   /* Locate the e
d3f0: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
d400: 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e   VIEW statement.
d410: 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e    Make sEnd poin
d420: 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e  t to.  ** the en
d430: 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d  d..  */.  sEnd =
d440: 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f   pParse->sLastTo
d450: 6b 65 6e 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  ken;.  if( ALWAY
d460: 53 28 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 29 20  S(sEnd.z[0]!=0) 
d470: 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b  && sEnd.z[0]!=';
d480: 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20  ' ){.    sEnd.z 
d490: 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20  += sEnd.n;.  }. 
d4a0: 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e   sEnd.n = 0;.  n
d4b0: 20 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20   = (int)(sEnd.z 
d4c0: 2d 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20  - pBegin->z);.  
d4d0: 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20  z = pBegin->z;. 
d4e0: 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 6e   while( ALWAYS(n
d4f0: 3e 30 29 20 26 26 20 73 71 6c 69 74 65 33 49 73  >0) && sqlite3Is
d500: 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b  space(z[n-1]) ){
d510: 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a   n--; }.  sEnd.z
d520: 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45   = &z[n-1];.  sE
d530: 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20  nd.n = 1;..  /* 
d540: 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61  Use sqlite3EndTa
d550: 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68 65  ble() to add the
d560: 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c   view to the SQL
d570: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
d580: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64   */.  sqlite3End
d590: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c  Table(pParse, 0,
d5a0: 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72 65   &sEnd, 0);.  re
d5b0: 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  turn;.}.#endif /
d5c0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
d5d0: 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  EW */..#if !defi
d5e0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
d5f0: 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
d600: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
d610: 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a  RTUALTABLE)./*.*
d620: 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
d630: 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20  cture pTable is 
d640: 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20  really a VIEW.  
d650: 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65  Fill in the name
d660: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  s of.** the colu
d670: 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20  mns of the view 
d680: 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74  in the pTable st
d690: 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e  ructure.  Return
d6a0: 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
d6b0: 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
d6c0: 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c   error is seen l
d6d0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
d6e0: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
d6f0: 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  >zErrMsg..*/.int
d700: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
d710: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65  olumnNames(Parse
d720: 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
d730: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c  *pTable){.  Tabl
d740: 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a  e *pSelTab;   /*
d750: 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72   A fake table fr
d760: 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65 74 20  om which we get 
d770: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
d780: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
d790: 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66  ;     /* Copy of
d7a0: 20 74 68 65 20 53 45 4c 45 43 54 20 74 68 61 74   the SELECT that
d7b0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
d7c0: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  view */.  int nE
d7d0: 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  rr = 0;     /* N
d7e0: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
d7f0: 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20  encountered */. 
d800: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
d810: 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c     /* Temporaril
d820: 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62  y holds the numb
d830: 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73  er of cursors as
d840: 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  signed */.  sqli
d850: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
d860: 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61  ->db;  /* Databa
d870: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f  se connection fo
d880: 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
d890: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 41 75 74 68  */.  int (*xAuth
d8a0: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
d8b0: 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
d8c0: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ar*,const char*,
d8d0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 0a 20  const char*);.. 
d8e0: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
d8f0: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
d900: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
d910: 41 42 4c 45 0a 20 20 69 66 28 20 73 71 6c 69 74  ABLE.  if( sqlit
d920: 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63  e3VtabCallConnec
d930: 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  t(pParse, pTable
d940: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
d950: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
d960: 7d 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  }.  if( IsVirtua
d970: 6c 28 70 54 61 62 6c 65 29 20 29 20 72 65 74 75  l(pTable) ) retu
d980: 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  rn 0;.#endif..#i
d990: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d9a0: 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f  T_VIEW.  /* A po
d9b0: 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e  sitive nCol mean
d9c0: 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61  s the columns na
d9d0: 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65  mes for this vie
d9e0: 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61  w are.  ** alrea
d9f0: 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20  dy known..  */. 
da00: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
da10: 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  l>0 ) return 0;.
da20: 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65  .  /* A negative
da30: 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69   nCol is a speci
da40: 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e  al marker meanin
da50: 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75  g that we are cu
da60: 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79  rrently.  ** try
da70: 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  ing to compute t
da80: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  he column names.
da90: 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68    If we enter th
daa0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a  is routine with.
dab0: 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20    ** a negative 
dac0: 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  nCol, it means t
dad0: 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73  wo or more views
dae0: 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69   form a loop, li
daf0: 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  ke this:.  **.  
db00: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
db10: 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54  EW one AS SELECT
db20: 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a   * FROM two;.  *
db30: 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
db40: 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20  W two AS SELECT 
db50: 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a  * FROM one;.  **
db60: 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  .  ** Actually, 
db70: 74 68 65 20 65 72 72 6f 72 20 61 62 6f 76 65 20  the error above 
db80: 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72  is now caught pr
db90: 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20  ior to reaching 
dba0: 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a  this point..  **
dbb0: 20 42 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69   But the followi
dbc0: 6e 67 20 74 65 73 74 20 69 73 20 73 74 69 6c 6c  ng test is still
dbd0: 20 69 6d 70 6f 72 74 61 6e 74 20 61 73 20 69 74   important as it
dbe0: 20 64 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20 20   does come up.  
dbf0: 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ** in the follow
dc00: 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ing:.  ** .  ** 
dc10: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
dc20: 20 6d 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20 20   main.ex1(a);.  
dc30: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 45  **     CREATE TE
dc40: 4d 50 20 56 49 45 57 20 65 78 31 20 41 53 20 53  MP VIEW ex1 AS S
dc50: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 65 78 31  ELECT a FROM ex1
dc60: 3b 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  ;.  **     SELEC
dc70: 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65 78  T * FROM temp.ex
dc80: 31 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  1;.  */.  if( pT
dc90: 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a  able->nCol<0 ){.
dca0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
dcb0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65  Msg(pParse, "vie
dcc0: 77 20 25 73 20 69 73 20 63 69 72 63 75 6c 61 72  w %s is circular
dcd0: 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61  ly defined", pTa
dce0: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  ble->zName);.   
dcf0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
dd00: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
dd10: 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f  >nCol>=0 );..  /
dd20: 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
dd30: 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77   far, it means w
dd40: 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  e need to comput
dd50: 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  e the table name
dd60: 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  s..  ** Note tha
dd70: 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  t the call to sq
dd80: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
dd90: 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78  Select() will ex
dda0: 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a  pand any.  ** "*
ddb0: 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  " elements in th
ddc0: 65 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66  e results set of
ddd0: 20 74 68 65 20 76 69 65 77 20 61 6e 64 20 77 69   the view and wi
dde0: 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72  ll assign cursor
ddf0: 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c  s.  ** to the el
de00: 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52  ements of the FR
de10: 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20  OM clause.  But 
de20: 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  we do not want t
de30: 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a  hese changes.  *
de40: 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e  * to be permanen
de50: 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75  t.  So the compu
de60: 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f  tation is done o
de70: 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  n a copy of the 
de80: 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74  SELECT.  ** stat
de90: 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e  ement that defin
dea0: 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a  es the view..  *
deb0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  /.  assert( pTab
dec0: 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20  le->pSelect );. 
ded0: 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53   pSel = sqlite3S
dee0: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61  electDup(db, pTa
def0: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  ble->pSelect, 0)
df00: 3b 0a 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a  ;.  if( pSel ){.
df10: 20 20 20 20 75 38 20 65 6e 61 62 6c 65 4c 6f 6f      u8 enableLoo
df20: 6b 61 73 69 64 65 20 3d 20 64 62 2d 3e 6c 6f 6f  kaside = db->loo
df30: 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3b  kaside.bEnabled;
df40: 0a 20 20 20 20 6e 20 3d 20 70 50 61 72 73 65 2d  .    n = pParse-
df50: 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c 69 74  >nTab;.    sqlit
df60: 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
df70: 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
df80: 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20  Sel->pSrc);.    
df90: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d  pTable->nCol = -
dfa0: 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  1;.    db->looka
dfb0: 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20  side.bEnabled = 
dfc0: 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
dfd0: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
dfe0: 54 49 4f 4e 0a 20 20 20 20 78 41 75 74 68 20 3d  TION.    xAuth =
dff0: 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20   db->xAuth;.    
e000: 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20  db->xAuth = 0;. 
e010: 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
e020: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
e030: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
e040: 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75  el);.    db->xAu
e050: 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73  th = xAuth;.#els
e060: 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20  e.    pSelTab = 
e070: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
e080: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
e090: 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20   pSel);.#endif. 
e0a0: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
e0b0: 2e 62 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62  .bEnabled = enab
e0c0: 6c 65 4c 6f 6f 6b 61 73 69 64 65 3b 0a 20 20 20  leLookaside;.   
e0d0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
e0e0: 6e 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 54  n;.    if( pSelT
e0f0: 61 62 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ab ){.      asse
e100: 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  rt( pTable->aCol
e110: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61  ==0 );.      pTa
e120: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c  ble->nCol = pSel
e130: 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
e140: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
e150: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
e160: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
e170: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  ol = 0;.      pS
e180: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
e190: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
e1a0: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53  leteTable(db, pS
e1b0: 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54  elTab);.      pT
e1c0: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 66  able->pSchema->f
e1d0: 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73  lags |= DB_Unres
e1e0: 65 74 56 69 65 77 73 3b 0a 20 20 20 20 7d 65 6c  etViews;.    }el
e1f0: 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 6c 65  se{.      pTable
e200: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
e210: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a    nErr++;.    }.
e220: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
e230: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
e240: 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  );.  } else {.  
e250: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 23 65    nErr++;.  }.#e
e260: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
e270: 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65  MIT_VIEW */.  re
e280: 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23  turn nErr;  .}.#
e290: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
e2a0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
e2b0: 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
e2c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
e2d0: 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69  UALTABLE) */..#i
e2e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e2f0: 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65  T_VIEW./*.** Cle
e300: 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
e310: 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56  mes from every V
e320: 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20  IEW in database 
e330: 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  idx..*/.static v
e340: 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65  oid sqliteViewRe
e350: 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a  setAll(sqlite3 *
e360: 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20  db, int idx){.  
e370: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69  HashElem *i;.  i
e380: 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  f( !DbHasPropert
e390: 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
e3a0: 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65  resetViews) ) re
e3b0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71  turn;.  for(i=sq
e3c0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
e3d0: 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68  b->aDb[idx].pSch
e3e0: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69  ema->tblHash); i
e3f0: 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  ;i=sqliteHashNex
e400: 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  t(i)){.    Table
e410: 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
e420: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
e430: 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
e440: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
e450: 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d  eDeleteColumnNam
e460: 65 73 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  es(db, pTab);.  
e470: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d      pTab->aCol =
e480: 20 30 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   0;.      pTab->
e490: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  nCol = 0;.    }.
e4a0: 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f    }.  DbClearPro
e4b0: 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
e4c0: 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b  B_UnresetViews);
e4d0: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
e4e0: 65 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  e sqliteViewRese
e4f0: 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66  tAll(A,B).#endif
e500: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
e510: 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  VIEW */../*.** T
e520: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
e530: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44  called by the VD
e540: 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  BE to adjust the
e550: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
e560: 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69  .** used by SQLi
e570: 74 65 20 77 68 65 6e 20 74 68 65 20 62 74 72 65  te when the btre
e580: 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20  e layer moves a 
e590: 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e  table root page.
e5a0: 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67   The.** root-pag
e5b0: 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  e of a table or 
e5c0: 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61 73  index in databas
e5d0: 65 20 69 44 62 20 68 61 73 20 63 68 61 6e 67 65  e iDb has change
e5e0: 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20  d from iFrom.** 
e5f0: 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69  to iTo..**.** Ti
e600: 63 6b 65 74 20 23 31 37 32 38 3a 20 20 54 68 65  cket #1728:  The
e610: 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69   symbol table mi
e620: 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69  ght still contai
e630: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  n information.**
e640: 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f   on tables and/o
e650: 72 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 61  r indices that a
e660: 72 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f  re the process o
e670: 66 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e  f being deleted.
e680: 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75  .** If you are u
e690: 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74  nlucky, one of t
e6a0: 68 6f 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64  hose deleted ind
e6b0: 69 63 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d  ices or tables m
e6c0: 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65  ight.** have the
e6d0: 20 73 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e   same rootpage n
e6e0: 75 6d 62 65 72 20 61 73 20 74 68 65 20 72 65 61  umber as the rea
e6f0: 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  l table or index
e700: 20 74 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e   that is.** bein
e710: 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20  g moved.  So we 
e720: 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72  cannot stop sear
e730: 63 68 69 6e 67 20 61 66 74 65 72 20 74 68 65 20  ching after the 
e740: 66 69 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20  first match .** 
e750: 62 65 63 61 75 73 65 20 74 68 65 20 66 69 72 73  because the firs
e760: 74 20 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65  t match might be
e770: 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
e780: 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a  deleted indices.
e790: 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64  ** or tables and
e7a0: 20 6e 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69   not the table/i
e7b0: 6e 64 65 78 20 74 68 61 74 20 69 73 20 61 63 74  ndex that is act
e7c0: 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65  ually being move
e7d0: 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f  d..** We must co
e7e0: 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75  ntinue looping u
e7f0: 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20  ntil all tables 
e800: 61 6e 64 20 69 6e 64 69 63 65 73 20 77 69 74 68  and indices with
e810: 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46  .** rootpage==iF
e820: 72 6f 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f  rom have been co
e830: 6e 76 65 72 74 65 64 20 74 6f 20 68 61 76 65 20  nverted to have 
e840: 61 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54  a rootpage of iT
e850: 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  o.** in order to
e860: 20 62 65 20 63 65 72 74 61 69 6e 20 74 68 61 74   be certain that
e870: 20 77 65 20 67 6f 74 20 74 68 65 20 72 69 67 68   we got the righ
e880: 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  t one..*/.#ifnde
e890: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
e8a0: 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71  TOVACUUM.void sq
e8b0: 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76  lite3RootPageMov
e8c0: 65 64 28 44 62 20 2a 70 44 62 2c 20 69 6e 74 20  ed(Db *pDb, int 
e8d0: 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
e8e0: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c  .  HashElem *pEl
e8f0: 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73  em;.  Hash *pHas
e900: 68 3b 0a 0a 20 20 70 48 61 73 68 20 3d 20 26 70  h;..  pHash = &p
e910: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  Db->pSchema->tbl
e920: 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65  Hash;.  for(pEle
e930: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
e940: 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b  t(pHash); pElem;
e950: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
e960: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
e970: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
e980: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
e990: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  pElem);.    if( 
e9a0: 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f  pTab->tnum==iFro
e9b0: 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d  m ){.      pTab-
e9c0: 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20  >tnum = iTo;.   
e9d0: 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d   }.  }.  pHash =
e9e0: 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e   &pDb->pSchema->
e9f0: 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70  idxHash;.  for(p
ea00: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
ea10: 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c  irst(pHash); pEl
ea20: 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
ea30: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
ea40: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
ea50: 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  x = sqliteHashDa
ea60: 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69  ta(pElem);.    i
ea70: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69  f( pIdx->tnum==i
ea80: 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49  From ){.      pI
ea90: 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a  dx->tnum = iTo;.
eaa0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
eab0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
eac0: 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 68  code to erase th
ead0: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
eae0: 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66 72  t-page iTable fr
eaf0: 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  om database iDb.
eb00: 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63  .** Also write c
eb10: 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  ode to modify th
eb20: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
eb30: 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e  table and intern
eb40: 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20  al schema.** if 
eb50: 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  a root-page of a
eb60: 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20  nother table is 
eb70: 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72  moved by the btr
eb80: 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a  ee-layer whilst.
eb90: 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c  ** erasing iTabl
eba0: 65 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70  e (this can happ
ebb0: 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d  en with an auto-
ebc0: 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29  vacuum database)
ebd0: 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
ebe0: 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67  d destroyRootPag
ebf0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
ec00: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74   int iTable, int
ec10: 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76   iDb){.  Vdbe *v
ec20: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
ec30: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
ec40: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
ec50: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
ec60: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
ec70: 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73 74 72  dOp3(v, OP_Destr
ec80: 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20  oy, iTable, r1, 
ec90: 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d  iDb);.  sqlite3M
eca0: 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
ecb0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ecc0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
ecd0: 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    /* OP_Destroy 
ece0: 73 74 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e 74  stores an in int
ecf0: 65 67 65 72 20 72 31 2e 20 49 66 20 74 68 69 73  eger r1. If this
ed00: 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73   integer.  ** is
ed10: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
ed20: 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
ed30: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
ed40: 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20  table moved to. 
ed50: 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61   ** location iTa
ed60: 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ble. The followi
ed70: 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73  ng code modifies
ed80: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
ed90: 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a  er table to.  **
eda0: 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20   reflect this.. 
edb0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 4e   **.  ** The "#N
edc0: 4e 4e 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69  NN" in the SQL i
edd0: 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73  s a special cons
ede0: 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20  tant that means 
edf0: 77 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20  whatever value. 
ee00: 20 2a 2a 20 69 73 20 69 6e 20 72 65 67 69 73 74   ** is in regist
ee10: 65 72 20 4e 4e 4e 2e 20 20 53 65 65 20 67 72 61  er NNN.  See gra
ee20: 6d 6d 61 72 20 72 75 6c 65 73 20 61 73 73 6f 63  mmar rules assoc
ee30: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 54  iated with the T
ee40: 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 2a 2a 20  K_REGISTER.  ** 
ee50: 74 6f 6b 65 6e 20 66 6f 72 20 61 64 64 69 74 69  token for additi
ee60: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
ee70: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
ee80: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
ee90: 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54  se, .     "UPDAT
eea0: 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74  E %Q.%s SET root
eeb0: 70 61 67 65 3d 25 64 20 57 48 45 52 45 20 23 25  page=%d WHERE #%
eec0: 64 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23  d AND rootpage=#
eed0: 25 64 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65  %d",.     pParse
eee0: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
eef0: 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
ef00: 4c 45 28 69 44 62 29 2c 20 69 54 61 62 6c 65 2c  LE(iDb), iTable,
ef10: 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66   r1, r1);.#endif
ef20: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
ef30: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
ef40: 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57   r1);.}../*.** W
ef50: 72 69 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rite VDBE code t
ef60: 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20 70 54  o erase table pT
ef70: 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63  ab and all assoc
ef80: 69 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e  iated indices on
ef90: 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74   disk..** Code t
efa0: 6f 20 75 70 64 61 74 65 20 74 68 65 20 73 71 6c  o update the sql
efb0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
efc0: 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73  s and internal s
efd0: 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e  chema definition
efe0: 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72  s.** in case a r
eff0: 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69  oot-page belongi
f000: 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61  ng to another ta
f010: 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20  ble is moved by 
f020: 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a  the btree layer.
f030: 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64  ** is also added
f040: 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65   (this can happe
f050: 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76  n with an auto-v
f060: 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e  acuum database).
f070: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f080: 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72  destroyTable(Par
f090: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
f0a0: 65 20 2a 70 54 61 62 29 7b 0a 23 69 66 64 65 66  e *pTab){.#ifdef
f0b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
f0c0: 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64 65 78 20  OVACUUM.  Index 
f0d0: 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 44 62  *pIdx;.  int iDb
f0e0: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
f0f0: 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
f100: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
f110: 61 29 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f  a);.  destroyRoo
f120: 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 54  tPage(pParse, pT
f130: 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ab->tnum, iDb);.
f140: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
f150: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
f160: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
f170: 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  {.    destroyRoo
f180: 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49  tPage(pParse, pI
f190: 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  dx->tnum, iDb);.
f1a0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49    }.#else.  /* I
f1b0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  f the database m
f1c0: 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75  ay be auto-vacuu
f1d0: 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20 53 51  m capable (if SQ
f1e0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
f1f0: 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  CUUM.  ** is not
f200: 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20   defined), then 
f210: 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
f220: 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72  to call OP_Destr
f230: 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74  oy on the.  ** t
f240: 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72  able and index r
f250: 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64  oot-pages in ord
f260: 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  er, starting wit
f270: 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c  h the numericall
f280: 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20  y .  ** largest 
f290: 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
f2a0: 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65  . This guarantee
f2b0: 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74  s that none of t
f2c0: 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20  he root-pages.  
f2d0: 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79  ** to be destroy
f2e0: 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20  ed is relocated 
f2f0: 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50  by an earlier OP
f300: 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69  _Destroy. i.e. i
f310: 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f  f the.  ** follo
f320: 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a  wing were coded:
f330: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65  .  **.  ** OP_De
f340: 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e  stroy 4 0.  ** .
f350: 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72  ...  ** OP_Destr
f360: 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a  oy 5 0.  **.  **
f370: 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35   and root page 5
f380: 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20   happened to be 
f390: 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
f3a0: 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20  -page number in 
f3b0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
f3c0: 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67  e, then root pag
f3d0: 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76  e 5 would be mov
f3e0: 65 64 20 74 6f 20 70 61 67 65 20 34 20 62 79 20  ed to page 4 by 
f3f0: 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65  the .  ** "OP_De
f400: 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64  stroy 4 0" opcod
f410: 65 2e 20 54 68 65 20 73 75 62 73 65 71 75 65 6e  e. The subsequen
f420: 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20  t "OP_Destroy 5 
f430: 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a  0" would hit.  *
f440: 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61  * a free-list pa
f450: 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69  ge..  */.  int i
f460: 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  Tab = pTab->tnum
f470: 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79  ;.  int iDestroy
f480: 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65  ed = 0;..  while
f490: 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ( 1 ){.    Index
f4a0: 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20   *pIdx;.    int 
f4b0: 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20  iLargest = 0;.. 
f4c0: 20 20 20 69 66 28 20 69 44 65 73 74 72 6f 79 65     if( iDestroye
f4d0: 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65  d==0 || iTab<iDe
f4e0: 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20  stroyed ){.     
f4f0: 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62   iLargest = iTab
f500: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
f510: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
f520: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
f530: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
f540: 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64    int iIdx = pId
f550: 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61  x->tnum;.      a
f560: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63  ssert( pIdx->pSc
f570: 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
f580: 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ema );.      if(
f590: 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20   (iDestroyed==0 
f5a0: 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f  || (iIdx<iDestro
f5b0: 79 65 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c  yed)) && iIdx>iL
f5c0: 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20  argest ){.      
f5d0: 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64    iLargest = iId
f5e0: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
f5f0: 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67 65 73  .    if( iLarges
f600: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
f610: 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  turn;.    }else{
f620: 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d  .      int iDb =
f630: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
f640: 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
f650: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
f660: 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 52  ;.      destroyR
f670: 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
f680: 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b 0a  iLargest, iDb);.
f690: 20 20 20 20 20 20 69 44 65 73 74 72 6f 79 65 64        iDestroyed
f6a0: 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 20   = iLargest;.   
f6b0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a   }.  }.#endif.}.
f6c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
f6d0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
f6e0: 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   do the work of 
f6f0: 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61  a DROP TABLE sta
f700: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65  tement..** pName
f710: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
f720: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
f730: 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64  dropped..*/.void
f740: 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c   sqlite3DropTabl
f750: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
f760: 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
f770: 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e 74   int isView, int
f780: 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c 65   noErr){.  Table
f790: 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a   *pTab;.  Vdbe *
f7a0: 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
f7b0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
f7c0: 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28   int iDb;..  if(
f7d0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
f7e0: 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
f7f0: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
f800: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
f810: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a  rse->nErr==0 );.
f820: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
f830: 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66  >nSrc==1 );.  if
f840: 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75  ( noErr ) db->su
f850: 70 70 72 65 73 73 45 72 72 2b 2b 3b 0a 20 20 70  ppressErr++;.  p
f860: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
f870: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
f880: 20 69 73 56 69 65 77 2c 20 0a 20 20 20 20 20 20   isView, .      
f890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8a0: 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 61 5b 30        pName->a[0
f8b0: 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
f8c0: 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
f8d0: 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64  .  if( noErr ) d
f8e0: 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2d 2d  b->suppressErr--
f8f0: 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  ;..  if( pTab==0
f900: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
f910: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
f920: 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
f930: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
f940: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
f950: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
f960: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
f970: 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Db );..  /* If p
f980: 54 61 62 20 69 73 20 61 20 76 69 72 74 75 61 6c  Tab is a virtual
f990: 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65   table, call Vie
f9a0: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
f9b0: 29 20 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a  ) to ensure.  **
f9c0: 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a   it is initializ
f9d0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ed..  */.  if( I
f9e0: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 26  sVirtual(pTab) &
f9f0: 26 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  & sqlite3ViewGet
fa00: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
fa10: 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20  se, pTab) ){.   
fa20: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
fa30: 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64  table;.  }.#ifnd
fa40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
fa50: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
fa60: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
fa70: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
fa80: 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
fa90: 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e  LE(iDb);.    con
faa0: 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
fab0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
fac0: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
fad0: 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20  r *zArg2 = 0;.  
fae0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
faf0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
fb00: 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54  QLITE_DELETE, zT
fb10: 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20  ab, 0, zDb)){.  
fb20: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
fb30: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
fb40: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29      if( isView )
fb50: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
fb60: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
fb70: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
fb80: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
fb90: 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20  _TEMP_VIEW;.    
fba0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
fbb0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
fbc0: 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  ROP_VIEW;.      
fbd0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
fbe0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
fbf0: 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  LE.    }else if(
fc00: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
fc10: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 20 3d   ){.      code =
fc20: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41   SQLITE_DROP_VTA
fc30: 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72 67 32  BLE;.      zArg2
fc40: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54 61   = sqlite3GetVTa
fc50: 62 6c 65 28 64 62 2c 20 70 54 61 62 29 2d 3e 70  ble(db, pTab)->p
fc60: 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64  Mod->zName;.#end
fc70: 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
fc80: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
fc90: 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
fca0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
fcb0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
fcc0: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
fcd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
fce0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
fcf0: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a  _TABLE;.      }.
fd00: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
fd10: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
fd20: 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61  Parse, code, pTa
fd30: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c  b->zName, zArg2,
fd40: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
fd50: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
fd60: 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ble;.    }.    i
fd70: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
fd80: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
fd90: 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d  TE_DELETE, pTab-
fda0: 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20  >zName, 0, zDb) 
fdb0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
fdc0: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
fdd0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
fde0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
fdf0: 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d  NICmp(pTab->zNam
fe00: 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
fe10: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
fe20: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
fe30: 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
fe40: 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22   not be dropped"
fe50: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
fe60: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
fe70: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23  op_table;.  }..#
fe80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fe90: 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73  IT_VIEW.  /* Ens
fea0: 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69  ure DROP TABLE i
feb0: 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20  s not used on a 
fec0: 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56  view, and DROP V
fed0: 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a  IEW is not used.
fee0: 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e    ** on a table.
fef0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69  .  */.  if( isVi
ff00: 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
ff10: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
ff20: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ff30: 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
ff40: 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20  TABLE to delete 
ff50: 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d  table %s", pTab-
ff60: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
ff70: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
ff80: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73  e;.  }.  if( !is
ff90: 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
ffa0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
ffb0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
ffc0: 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56  rse, "use DROP V
ffd0: 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69  IEW to delete vi
ffe0: 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  ew %s", pTab->zN
fff0: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
10000 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
10010 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
10020 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
10030 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62  o remove the tab
10040 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  le from the mast
10050 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e  er table.  ** on
10060 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20   disk..  */.  v 
10070 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
10080 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
10090 76 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72  v ){.    Trigger
100a0 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20   *pTrigger;.    
100b0 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
100c0 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 73 71 6c  Db[iDb];.    sql
100d0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
100e0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
100f0 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  1, iDb);..#ifnde
10100 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
10110 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
10120 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
10130 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  b) ){.      sqli
10140 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
10150 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20   OP_VBegin);.   
10160 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71   }.#endif.    sq
10170 6c 69 74 65 33 46 6b 44 72 6f 70 54 61 62 6c 65  lite3FkDropTable
10180 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20  (pParse, pName, 
10190 70 54 61 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  pTab);..    /* D
101a0 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73  rop all triggers
101b0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
101c0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
101d0 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20   dropped. Code. 
101e0 20 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74     ** is generat
101f0 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74  ed to remove ent
10200 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65  ries from sqlite
10210 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20  _master and/or. 
10220 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d     ** sqlite_tem
10230 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71 75  p_master if requ
10240 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
10250 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69   pTrigger = sqli
10260 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28 70  te3TriggerList(p
10270 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
10280 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65    while( pTrigge
10290 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  r ){.      asser
102a0 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63  t( pTrigger->pSc
102b0 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
102c0 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ema || .        
102d0 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68    pTrigger->pSch
102e0 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e  ema==db->aDb[1].
102f0 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
10300 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67   sqlite3DropTrig
10310 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70  gerPtr(pParse, p
10320 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 20 20  Trigger);.      
10330 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67  pTrigger = pTrig
10340 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ger->pNext;.    
10350 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
10360 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
10370 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 52 65 6d 6f  MENT.    /* Remo
10380 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f  ve any entries o
10390 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71  f the sqlite_seq
103a0 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f  uence table asso
103b0 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 20 20  ciated with.    
103c0 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
103d0 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73  ng dropped. This
103e0 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   is done before 
103f0 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f  the table is dro
10400 70 70 65 64 0a 20 20 20 20 2a 2a 20 61 74 20 74  pped.    ** at t
10410 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20  he btree level, 
10420 69 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69  in case the sqli
10430 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
10440 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a  e needs to.    *
10450 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75  * move as a resu
10460 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28  lt of the drop (
10470 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75  can happen in au
10480 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e  to-vacuum mode).
10490 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
104a0 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
104b0 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e   TF_Autoincremen
104c0 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
104d0 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
104e0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44  arse,.        "D
104f0 45 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e 73 71  ELETE FROM %s.sq
10500 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48  lite_sequence WH
10510 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20  ERE name=%Q",.  
10520 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
10530 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20  , pTab->zName.  
10540 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e      );.    }.#en
10550 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70  dif..    /* Drop
10560 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54   all SQLITE_MAST
10570 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64  ER table and ind
10580 65 78 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ex entries that 
10590 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20 20  refer to the.   
105a0 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70   ** table. The p
105b0 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70  rogram name loop
105c0 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61  s through the ma
105d0 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64  ster table and d
105e0 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20 65 76  eletes.    ** ev
105f0 65 72 79 20 72 6f 77 20 74 68 61 74 20 72 65 66  ery row that ref
10600 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f  ers to a table o
10610 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  f the same name 
10620 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67  as the one being
10630 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e  .    ** dropped.
10640 20 54 72 69 67 67 65 72 73 20 61 72 65 20 68 61   Triggers are ha
10650 6e 64 6c 65 64 20 73 65 70 65 72 61 74 65 6c 79  ndled seperately
10660 20 62 65 63 61 75 73 65 20 61 20 74 72 69 67 67   because a trigg
10670 65 72 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a  er can be.    **
10680 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
10690 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68  temp database th
106a0 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  at refers to a t
106b0 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a  able in another.
106c0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e      ** database.
106d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
106e0 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
106f0 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
10700 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
10710 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d  %s WHERE tbl_nam
10720 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27  e=%Q and type!='
10730 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20  trigger'",.     
10740 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53     pDb->zName, S
10750 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
10760 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
10770 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6e 79  .    /* Drop any
10780 20 73 74 61 74 69 73 74 69 63 73 20 66 72 6f 6d   statistics from
10790 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
107a0 31 20 74 61 62 6c 65 2c 20 69 66 20 69 74 20 65  1 table, if it e
107b0 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 66 28  xists */.    if(
107c0 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
107d0 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 74  e(db, "sqlite_st
107e0 61 74 31 22 2c 20 64 62 2d 3e 61 44 62 5b 69 44  at1", db->aDb[iD
107f0 62 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  b].zName) ){.   
10800 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
10810 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
10820 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
10830 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61  OM %Q.sqlite_sta
10840 74 31 20 57 48 45 52 45 20 74 62 6c 3d 25 51 22  t1 WHERE tbl=%Q"
10850 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54  , pDb->zName, pT
10860 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20  ab->zName.      
10870 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
10880 28 20 21 69 73 56 69 65 77 20 26 26 20 21 49 73  ( !isView && !Is
10890 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
108a0 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 54 61  .      destroyTa
108b0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
108c0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
108d0 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   Remove the tabl
108e0 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c  e entry from SQL
108f0 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73  ite's internal s
10900 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79  chema and modify
10910 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68 65  .    ** the sche
10920 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 20 20 2a  ma cookie..    *
10930 2f 0a 20 20 20 20 69 66 28 20 49 73 56 69 72 74  /.    if( IsVirt
10940 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
10950 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10960 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74  dOp4(v, OP_VDest
10970 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  roy, iDb, 0, 0, 
10980 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
10990 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
109a0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
109b0 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44  OP_DropTable, iD
109c0 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  b, 0, 0, pTab->z
109d0 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  Name, 0);.    sq
109e0 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
109f0 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
10a00 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69 65 77    }.  sqliteView
10a10 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62  ResetAll(db, iDb
10a20 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61  );..exit_drop_ta
10a30 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72  ble:.  sqlite3Sr
10a40 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
10a50 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pName);.}../*.**
10a60 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
10a70 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
10a80 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20  e a new foreign 
10a90 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  key on the table
10aa0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
10ab0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
10ac0 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65  .  pFromCol dete
10ad0 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c  rmines which col
10ae0 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63  umns.** in the c
10af0 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69  urrent table poi
10b00 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67  nt to the foreig
10b10 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d  n key.  If pFrom
10b20 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63  Col==0 then.** c
10b30 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74  onnect the key t
10b40 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  o the last colum
10b50 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f  n inserted.  pTo
10b60 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a   is the name of.
10b70 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66  ** the table ref
10b80 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f  erred to.  pToCo
10b90 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74  l is a list of t
10ba0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68  ables in the oth
10bb0 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20  er.** pTo table 
10bc0 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e  that the foreign
10bd0 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20   key points to. 
10be0 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20   flags contains 
10bf0 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  all.** informati
10c00 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  on about the con
10c10 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
10c20 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63   algorithms spec
10c30 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  ified.** in the 
10c40 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50  ON DELETE, ON UP
10c50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45  DATE and ON INSE
10c60 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  RT clauses..**.*
10c70 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74  * An FKey struct
10c80 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61  ure is created a
10c90 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
10ca0 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a  table currently.
10cb0 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ** under constru
10cc0 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61  ction in the pPa
10cd0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66  rse->pNewTable f
10ce0 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ield..**.** The 
10cf0 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73  foreign key is s
10d00 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45  et for IMMEDIATE
10d10 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20   processing.  A 
10d20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a  subsequent call.
10d30 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66  ** to sqlite3Def
10d40 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d  erForeignKey() m
10d50 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73  ight change this
10d60 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f   to DEFERRED..*/
10d70 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
10d80 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20  ateForeignKey(. 
10d90 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
10da0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
10db0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
10dc0 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c  prList *pFromCol
10dd0 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e  ,  /* Columns in
10de0 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74   this table that
10df0 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20   point to other 
10e00 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  table */.  Token
10e10 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20   *pTo,          
10e20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
10e30 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
10e40 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c  ExprList *pToCol
10e50 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ,    /* Columns 
10e60 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  in the other tab
10e70 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  le */.  int flag
10e80 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
10e90 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  Conflict resolut
10ea0 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20  ion algorithms. 
10eb0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
10ec0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
10ed0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
10ee0 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
10ef0 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20  Y.  FKey *pFKey 
10f00 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e 65  = 0;.  FKey *pNe
10f10 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a 70  xtTo;.  Table *p
10f20 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
10f30 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74  able;.  int nByt
10f40 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
10f50 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a  t nCol;.  char *
10f60 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  z;..  assert( pT
10f70 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  o!=0 );.  if( p=
10f80 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45  =0 || IN_DECLARE
10f90 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f  _VTAB ) goto fk_
10fa0 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  end;.  if( pFrom
10fb0 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Col==0 ){.    in
10fc0 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c  t iCol = p->nCol
10fd0 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  -1;.    if( NEVE
10fe0 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74 6f  R(iCol<0) ) goto
10ff0 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28   fk_end;.    if(
11000 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f   pToCol && pToCo
11010 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  l->nExpr!=1 ){. 
11020 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
11030 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f  rMsg(pParse, "fo
11040 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22  reign key on %s"
11050 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75  .         " shou
11060 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c  ld reference onl
11070 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  y one column of 
11080 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20  table %T",.     
11090 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c      p->aCol[iCol
110a0 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20  ].zName, pTo);. 
110b0 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64       goto fk_end
110c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c  ;.    }.    nCol
110d0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
110e0 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
110f0 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d  ol->nExpr!=pFrom
11100 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  Col->nExpr ){.  
11110 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
11120 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
11130 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c    "number of col
11140 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20  umns in foreign 
11150 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
11160 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ch the number of
11170 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75   ".        "colu
11180 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72  mns in the refer
11190 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20  enced table");. 
111a0 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
111b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f    }else{.    nCo
111c0 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  l = pFromCol->nE
111d0 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  xpr;.  }.  nByte
111e0 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79   = sizeof(*pFKey
111f0 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a  ) + (nCol-1)*siz
11200 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  eof(pFKey->aCol[
11210 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31  0]) + pTo->n + 1
11220 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  ;.  if( pToCol )
11230 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
11240 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20  <pToCol->nExpr; 
11250 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  i++){.      nByt
11260 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
11270 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  en30(pToCol->a[i
11280 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ].zName) + 1;.  
11290 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20    }.  }.  pFKey 
112a0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
112b0 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20  cZero(db, nByte 
112c0 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d  );.  if( pFKey==
112d0 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b  0 ){.    goto fk
112e0 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65  _end;.  }.  pFKe
112f0 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20  y->pFrom = p;.  
11300 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d  pFKey->pNextFrom
11310 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a   = p->pFKey;.  z
11320 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79   = (char*)&pFKey
11330 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20  ->aCol[nCol];.  
11340 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a  pFKey->zTo = z;.
11350 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d    memcpy(z, pTo-
11360 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a  >z, pTo->n);.  z
11370 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  [pTo->n] = 0;.  
11380 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
11390 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e  );.  z += pTo->n
113a0 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f  +1;.  pFKey->nCo
113b0 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20  l = nCol;.  if( 
113c0 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
113d0 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30     pFKey->aCol[0
113e0 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f  ].iFrom = p->nCo
113f0 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  l-1;.  }else{.  
11400 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
11410 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
11420 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
11430 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20  j=0; j<p->nCol; 
11440 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
11450 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
11460 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  (p->aCol[j].zNam
11470 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69  e, pFromCol->a[i
11480 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
11490 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e           pFKey->
114a0 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[i].iFrom = 
114b0 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  j;.          bre
114c0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
114d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
114e0 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  j>=p->nCol ){.  
114f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
11500 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
11510 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77           "unknow
11520 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20  n column \"%s\" 
11530 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
11540 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20  efinition", .   
11550 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d         pFromCol-
11560 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
11570 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
11580 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
11590 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f  .  }.  if( pToCo
115a0 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  l ){.    for(i=0
115b0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
115c0 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71        int n = sq
115d0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54  lite3Strlen30(pT
115e0 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
115f0 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  );.      pFKey->
11600 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a  aCol[i].zCol = z
11610 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
11620 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  , pToCol->a[i].z
11630 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20  Name, n);.      
11640 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  z[n] = 0;.      
11650 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a  z += n+1;.    }.
11660 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44    }.  pFKey->isD
11670 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70  eferred = 0;.  p
11680 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d  FKey->aAction[0]
11690 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26 20   = (u8)(flags & 
116a0 30 78 66 66 29 3b 20 20 20 20 20 20 20 20 20 20  0xff);          
116b0 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20 61    /* ON DELETE a
116c0 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65 79  ction */.  pFKey
116d0 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20 28  ->aAction[1] = (
116e0 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 38 20  u8)((flags >> 8 
116f0 29 20 26 20 30 78 66 66 29 3b 20 20 20 20 2f 2a  ) & 0xff);    /*
11700 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69 6f   ON UPDATE actio
11710 6e 20 2a 2f 0a 0a 20 20 70 4e 65 78 74 54 6f 20  n */..  pNextTo 
11720 3d 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65  = (FKey *)sqlite
11730 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e  3HashInsert(&p->
11740 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73  pSchema->fkeyHas
11750 68 2c 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  h, .      pFKey-
11760 3e 7a 54 6f 2c 20 73 71 6c 69 74 65 33 53 74 72  >zTo, sqlite3Str
11770 6c 65 6e 33 30 28 70 46 4b 65 79 2d 3e 7a 54 6f  len30(pFKey->zTo
11780 29 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b 65 79  ), (void *)pFKey
11790 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 78  .  );.  if( pNex
117a0 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20  tTo==pFKey ){.  
117b0 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
117c0 65 64 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  ed = 1;.    goto
117d0 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69   fk_end;.  }.  i
117e0 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20  f( pNextTo ){.  
117f0 20 20 61 73 73 65 72 74 28 20 70 4e 65 78 74 54    assert( pNextT
11800 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b  o->pPrevTo==0 );
11810 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  .    pFKey->pNex
11820 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20  tTo = pNextTo;. 
11830 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65     pNextTo->pPre
11840 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d  vTo = pFKey;.  }
11850 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
11860 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74  foreign key to t
11870 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20  he table as the 
11880 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a  last step..  */.
11890 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b    p->pFKey = pFK
118a0 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b  ey;.  pFKey = 0;
118b0 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69  ..fk_end:.  sqli
118c0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 46  te3DbFree(db, pF
118d0 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  Key);.#endif /* 
118e0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
118f0 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
11900 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  ) */.  sqlite3Ex
11910 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
11920 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71   pFromCol);.  sq
11930 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
11940 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b  ete(db, pToCol);
11950 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
11960 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
11970 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c   when an INITIAL
11980 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20  LY IMMEDIATE or 
11990 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
119a0 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  ED.** clause is 
119b0 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  seen as part of 
119c0 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  a foreign key de
119d0 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69  finition.  The i
119e0 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72  sDeferred.** par
119f0 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20  ameter is 1 for 
11a00 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
11a10 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49  ED and 0 for INI
11a20 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
11a30 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f  ..** The behavio
11a40 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  r of the most re
11a50 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66  cently created f
11a60 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64  oreign key is ad
11a70 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64  justed.** accord
11a80 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ingly..*/.void s
11a90 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
11aa0 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61  gnKey(Parse *pPa
11ab0 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72  rse, int isDefer
11ac0 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  red){.#ifndef SQ
11ad0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
11ae0 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70  N_KEY.  Table *p
11af0 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b  Tab;.  FKey *pFK
11b00 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20  ey;.  if( (pTab 
11b10 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
11b20 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65  ble)==0 || (pFKe
11b30 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29  y = pTab->pFKey)
11b40 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
11b50 61 73 73 65 72 74 28 20 69 73 44 65 66 65 72 72  assert( isDeferr
11b60 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65 72  ed==0 || isDefer
11b70 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a  red==1 ); /* EV:
11b80 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37 20 2a   R-30323-21917 *
11b90 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  /.  pFKey->isDef
11ba0 65 72 72 65 64 20 3d 20 28 75 38 29 69 73 44 65  erred = (u8)isDe
11bb0 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d  ferred;.#endif.}
11bc0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
11bd0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
11be0 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c  erase and refill
11bf0 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54   index *pIdx.  T
11c00 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  his is.** used t
11c10 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  o initialize a n
11c20 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ewly created ind
11c30 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75  ex or to recompu
11c40 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  te the.** conten
11c50 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e  t of an index in
11c60 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52   response to a R
11c70 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
11c80 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74  **.** if memRoot
11c90 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61  Page is not nega
11ca0 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  tive, it means t
11cb0 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73  hat the index is
11cc0 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65   newly.** create
11cd0 64 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72  d.  The register
11ce0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65   specified by me
11cf0 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69  mRootPage contai
11d00 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  ns the.** root p
11d10 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
11d20 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d  e index.  If mem
11d30 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61  RootPage is nega
11d40 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tive, then.** th
11d50 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
11d60 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20  exists and must 
11d70 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
11d80 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64  e being refilled
11d90 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74   and.** the root
11da0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
11db0 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b  the index is tak
11dc0 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e  en from pIndex->
11dd0 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tnum..*/.static 
11de0 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69  void sqlite3Refi
11df0 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  llIndex(Parse *p
11e00 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
11e10 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f  ndex, int memRoo
11e20 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20  tPage){.  Table 
11e30 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
11e40 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20  pTable;  /* The 
11e50 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e  table that is in
11e60 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  dexed */.  int i
11e70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
11e80 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab++;     /* Btr
11e90 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
11ea0 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  or pTab */.  int
11eb0 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e   iIdx = pParse->
11ec0 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42  nTab++;     /* B
11ed0 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
11ee0 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20   for pIndex */. 
11ef0 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
11f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f10 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f  /* Address of to
11f20 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  p of loop */.  i
11f30 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20  nt tnum;        
11f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11f50 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e   Root page of in
11f60 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  dex */.  Vdbe *v
11f70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11f80 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
11f90 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
11fa0 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
11fb0 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  ne */.  KeyInfo 
11fc0 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20  *pKey;          
11fd0 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66         /* KeyInf
11fe0 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20  o for index */. 
11ff0 20 69 6e 74 20 72 65 67 49 64 78 4b 65 79 3b 20   int regIdxKey; 
12000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12010 2f 2a 20 52 65 67 69 73 74 65 72 73 20 63 6f 6e  /* Registers con
12020 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65  taining the inde
12030 78 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 72  x key */.  int r
12040 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20  egRecord;       
12050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
12060 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73  ister holding as
12070 73 65 6d 62 6c 69 65 64 20 69 6e 64 65 78 20 72  semblied index r
12080 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74  ecord */.  sqlit
12090 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
120a0 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  >db;      /* The
120b0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
120c0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44  tion */.  int iD
120d0 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
120e0 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  aToIndex(db, pIn
120f0 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a  dex->pSchema);..
12100 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12110 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
12120 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  N.  if( sqlite3A
12130 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
12140 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c   SQLITE_REINDEX,
12150 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
12160 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  0,.      db->aDb
12170 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b  [iDb].zName ) ){
12180 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
12190 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
121a0 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f  quire a write-lo
121b0 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  ck on the table 
121c0 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20  to perform this 
121d0 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  operation */.  s
121e0 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
121f0 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
12200 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62  b->tnum, 1, pTab
12210 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d  ->zName);..  v =
12220 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
12230 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
12240 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
12250 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e  if( memRootPage>
12260 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d  =0 ){.    tnum =
12270 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20   memRootPage;.  
12280 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20  }else{.    tnum 
12290 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a  = pIndex->tnum;.
122a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
122b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61  ddOp2(v, OP_Clea
122c0 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  r, tnum, iDb);. 
122d0 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69   }.  pKey = sqli
122e0 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
122f0 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b  pParse, pIndex);
12300 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
12310 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  dOp4(v, OP_OpenW
12320 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d  rite, iIdx, tnum
12330 2c 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20  , iDb, .        
12340 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
12350 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59  r *)pKey, P4_KEY
12360 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
12370 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65   if( memRootPage
12380 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
12390 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
123a0 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 1);.  }.  sqli
123b0 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
123c0 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
123d0 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
123e0 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71  d);.  addr1 = sq
123f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12400 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54  v, OP_Rewind, iT
12410 61 62 2c 20 30 29 3b 0a 20 20 72 65 67 52 65 63  ab, 0);.  regRec
12420 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
12430 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
12440 0a 20 20 72 65 67 49 64 78 4b 65 79 20 3d 20 73  .  regIdxKey = s
12450 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
12460 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70  dexKey(pParse, p
12470 49 6e 64 65 78 2c 20 69 54 61 62 2c 20 72 65 67  Index, iTab, reg
12480 52 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20 69 66  Record, 1);.  if
12490 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  ( pIndex->onErro
124a0 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20  r!=OE_None ){.  
124b0 20 20 63 6f 6e 73 74 20 69 6e 74 20 72 65 67 52    const int regR
124c0 6f 77 69 64 20 3d 20 72 65 67 49 64 78 4b 65 79  owid = regIdxKey
124d0 20 2b 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75   + pIndex->nColu
124e0 6d 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  mn;.    const in
124f0 74 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t j2 = sqlite3Vd
12500 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
12510 20 2b 20 32 3b 0a 20 20 20 20 76 6f 69 64 20 2a   + 2;.    void *
12520 20 63 6f 6e 73 74 20 70 52 65 67 4b 65 79 20 3d   const pRegKey =
12530 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
12540 54 52 28 72 65 67 49 64 78 4b 65 79 29 3b 0a 0a  TR(regIdxKey);..
12550 20 20 20 20 2f 2a 20 54 68 65 20 72 65 67 69 73      /* The regis
12560 74 65 72 73 20 61 63 63 65 73 73 65 64 20 62 79  ters accessed by
12570 20 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65   the OP_IsUnique
12580 20 6f 70 63 6f 64 65 20 77 65 72 65 20 61 6c 6c   opcode were all
12590 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 75 73  ocated.    ** us
125a0 69 6e 67 20 73 71 6c 69 74 65 33 47 65 74 54 65  ing sqlite3GetTe
125b0 6d 70 52 61 6e 67 65 28 29 20 69 6e 73 69 64 65  mpRange() inside
125c0 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 47   of the sqlite3G
125d0 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
125e0 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62  ).    ** call ab
125f0 6f 76 65 2e 20 4a 75 73 74 20 62 65 66 6f 72 65  ove. Just before
12600 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 77   that function w
12610 61 73 20 66 72 65 65 64 20 74 68 65 79 20 77 65  as freed they we
12620 72 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  re released.    
12630 2a 2a 20 28 6d 61 64 65 20 61 76 61 69 6c 61 62  ** (made availab
12640 6c 65 20 74 6f 20 74 68 65 20 63 6f 6d 70 69 6c  le to the compil
12650 65 72 20 66 6f 72 20 72 65 75 73 65 29 20 75 73  er for reuse) us
12660 69 6e 67 20 0a 20 20 20 20 2a 2a 20 73 71 6c 69  ing .    ** sqli
12670 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
12680 6e 67 65 28 29 2e 20 53 6f 20 69 6e 20 73 6f 6d  nge(). So in som
12690 65 20 77 61 79 73 20 68 61 76 69 6e 67 20 74 68  e ways having th
126a0 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 0a 20 20  e OP_IsUnique.  
126b0 20 20 2a 2a 20 6f 70 63 6f 64 65 20 75 73 65 20    ** opcode use 
126c0 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
126d0 64 20 77 69 74 68 69 6e 20 73 65 65 6d 73 20 64  d within seems d
126e0 61 6e 67 65 72 6f 75 73 2e 20 48 6f 77 65 76 65  angerous. Howeve
126f0 72 2c 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20  r, since.    ** 
12700 77 65 20 63 61 6e 20 62 65 20 73 75 72 65 20 74  we can be sure t
12710 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 74 65 6d  hat no other tem
12720 70 20 72 65 67 69 73 74 65 72 73 20 68 61 76 65  p registers have
12730 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a   been allocated.
12740 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 73 71 6c      ** since sql
12750 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
12760 61 6e 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65  ange() was calle
12770 64 2c 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  d, it is safe to
12780 20 64 6f 20 73 6f 2e 0a 20 20 20 20 2a 2f 0a 20   do so..    */. 
12790 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
127a0 64 4f 70 34 28 76 2c 20 4f 50 5f 49 73 55 6e 69  dOp4(v, OP_IsUni
127b0 71 75 65 2c 20 69 49 64 78 2c 20 6a 32 2c 20 72  que, iIdx, j2, r
127c0 65 67 52 6f 77 69 64 2c 20 70 52 65 67 4b 65 79  egRowid, pRegKey
127d0 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20  , P4_INT32);.   
127e0 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73   sqlite3HaltCons
127f0 74 72 61 69 6e 74 28 0a 20 20 20 20 20 20 20 20  traint(.        
12800 70 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74  pParse, OE_Abort
12810 2c 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  , "indexed colum
12820 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75  ns are not uniqu
12830 65 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  e", P4_STATIC);.
12840 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
12850 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
12860 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72  xInsert, iIdx, r
12870 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
12880 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
12890 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
128a0 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c  EKRESULT);.  sql
128b0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
128c0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
128d0 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
128e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
128f0 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  _Next, iTab, add
12900 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  r1+1);.  sqlite3
12910 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
12920 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  addr1);.  sqlite
12930 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
12940 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a  P_Close, iTab);.
12950 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12960 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
12970 20 69 49 64 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   iIdx);.}../*.**
12980 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e   Create a new in
12990 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74  dex for an SQL t
129a0 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e  able.  pName1.pN
129b0 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65  ame2 is the name
129c0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a   of the index .*
129d0 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69  * and pTblList i
129e0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
129f0 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
12a00 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
12a10 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65  Both will .** be
12a20 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d   NULL for a prim
12a30 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e  ary key or an in
12a40 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61  dex that is crea
12a50 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61  ted to satisfy a
12a60 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  .** UNIQUE const
12a70 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c  raint.  If pTabl
12a80 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65  e and pIndex are
12a90 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73   NULL, use pPars
12aa0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20  e->pNewTable.** 
12ab0 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  as the table to 
12ac0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61  be indexed.  pPa
12ad0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
12ae0 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69  s a table that i
12af0 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62  s.** currently b
12b00 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
12b10 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42   by a CREATE TAB
12b20 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
12b30 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c  .** pList is a l
12b40 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
12b50 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
12b60 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  List will be NUL
12b70 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  L if this.** is 
12b80 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
12b90 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69   unique-constrai
12ba0 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
12bb0 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64  ecent column add
12bc0 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62  ed.** to the tab
12bd0 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
12be0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
12bf0 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
12c00 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64  index is created
12c10 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 72   successfully, r
12c20 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
12c30 74 6f 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78  to the new Index
12c40 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 54  .** structure. T
12c50 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 73  his is used by s
12c60 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79  qlite3AddPrimary
12c70 4b 65 79 28 29 20 74 6f 20 6d 61 72 6b 20 74 68  Key() to mark th
12c80 65 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 74 68  e index.** as th
12c90 65 20 74 61 62 6c 65 73 20 70 72 69 6d 61 72 79  e tables primary
12ca0 20 6b 65 79 20 28 49 6e 64 65 78 2e 61 75 74 6f   key (Index.auto
12cb0 49 6e 64 65 78 3d 3d 32 29 2e 0a 2a 2f 0a 49 6e  Index==2)..*/.In
12cc0 64 65 78 20 2a 73 71 6c 69 74 65 33 43 72 65 61  dex *sqlite3Crea
12cd0 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  teIndex(.  Parse
12ce0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
12cf0 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   All information
12d00 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73   about this pars
12d10 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  e */.  Token *pN
12d20 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72  ame1,     /* Fir
12d30 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  st part of index
12d40 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
12d50 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
12d60 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65  Name2,     /* Se
12d70 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64  cond part of ind
12d80 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20  ex name. May be 
12d90 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73  NULL */.  SrcLis
12da0 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20  t *pTblName, /* 
12db0 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20  Table to index. 
12dc0 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  Use pParse->pNew
12dd0 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20  Table if 0 */.  
12de0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
12df0 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20     /* A list of 
12e00 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
12e10 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
12e20 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a  nError,       /*
12e30 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67   OE_Abort, OE_Ig
12e40 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65  nore, OE_Replace
12e50 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a  , or OE_None */.
12e60 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c    Token *pStart,
12e70 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41       /* The CREA
12e80 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
12e90 67 69 6e 73 20 74 68 69 73 20 73 74 61 74 65 6d  gins this statem
12ea0 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
12eb0 70 45 6e 64 2c 20 20 20 20 20 20 20 2f 2a 20 54  pEnd,       /* T
12ec0 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73  he ")" that clos
12ed0 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49 4e  es the CREATE IN
12ee0 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  DEX statement */
12ef0 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
12f00 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72  ,     /* Sort or
12f10 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b  der of primary k
12f20 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e  ey when pList==N
12f30 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e  ULL */.  int ifN
12f40 6f 74 45 78 69 73 74 20 20 20 20 20 2f 2a 20 4f  otExist     /* O
12f50 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64  mit error if ind
12f60 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
12f70 73 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  s */.){.  Index 
12f80 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 2f  *pRet = 0;     /
12f90 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 72 65 74  * Pointer to ret
12fa0 75 72 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  urn */.  Table *
12fb0 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a  pTab = 0;     /*
12fc0 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   Table to be ind
12fd0 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  exed */.  Index 
12fe0 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f  *pIndex = 0;   /
12ff0 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62  * The index to b
13000 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63  e created */.  c
13010 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20  har *zName = 0; 
13020 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
13030 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  he index */.  in
13040 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
13050 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13060 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e  characters in zN
13070 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ame */.  int i, 
13080 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49  j;.  Token nullI
13090 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b  d;        /* Fak
130a0 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65  e token for an e
130b0 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a  mpty ID list */.
130c0 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20    DbFixer sFix; 
130d0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73         /* For as
130e0 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65  signing database
130f0 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65   names to pTable
13100 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
13110 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20  derMask;   /* 1 
13120 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e  to honor DESC in
13130 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67   index.  0 to ig
13140 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  nore. */.  sqlit
13150 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
13160 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20  >db;.  Db *pDb; 
13170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13180 68 65 20 73 70 65 63 69 66 69 63 20 74 61 62 6c  he specific tabl
13190 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
131a0 20 69 6e 64 65 78 65 64 20 64 61 74 61 62 61 73   indexed databas
131b0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  e */.  int iDb; 
131c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
131d0 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61  ndex of the data
131e0 62 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69  base that is bei
131f0 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  ng written */.  
13200 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30  Token *pName = 0
13210 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66  ;    /* Unqualif
13220 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
13230 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20  index to create 
13240 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  */.  struct Expr
13250 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74  List_item *pList
13260 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f  Item; /* For loo
13270 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20  ping over pList 
13280 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20  */.  int nCol;. 
13290 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b   int nExtra = 0;
132a0 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 3b  .  char *zExtra;
132b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 74 61  ..  assert( pSta
132c0 72 74 3d 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30  rt==0 || pEnd!=0
132d0 20 29 3b 20 2f 2a 20 70 45 6e 64 20 6d 75 73 74   ); /* pEnd must
132e0 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20   be non-NULL if 
132f0 70 53 74 61 72 74 20 69 73 20 2a 2f 0a 20 20 61  pStart is */.  a
13300 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
13310 45 72 72 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  Err==0 );      /
13320 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77  * Never called w
13330 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73  ith prior errors
13340 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
13350 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49 4e  llocFailed || IN
13360 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b  _DECLARE_VTAB ){
13370 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
13380 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
13390 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
133a0 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
133b0 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
133c0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
133d0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
133e0 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
133f0 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
13400 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
13410 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66   Return early if
13420 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
13430 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21  .  if( pTblName!
13440 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73  =0 ){..    /* Us
13450 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69  e the two-part i
13460 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74  ndex name to det
13470 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62  ermine the datab
13480 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73  ase .    ** to s
13490 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61  earch for the ta
134a0 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74  ble. 'Fix' the t
134b0 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69  able name to thi
134c0 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f  s db.    ** befo
134d0 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68  re looking up th
134e0 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
134f0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
13500 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a  e1 && pName2 );.
13510 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
13520 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
13530 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
13540 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
13550 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f    if( iDb<0 ) go
13560 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
13570 6e 64 65 78 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ndex;..#ifndef S
13580 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44  QLITE_OMIT_TEMPD
13590 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  B.    /* If the 
135a0 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75  index name was u
135b0 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63  nqualified, chec
135c0 6b 20 69 66 20 74 68 65 20 74 68 65 20 74 61 62  k if the the tab
135d0 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74  le.    ** is a t
135e0 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f  emp table. If so
135f0 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
13600 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20  se to 1. Do not 
13610 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  do this.    ** i
13620 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20 61  f initialising a
13630 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
13640 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
13650 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
13660 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
13670 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f  sqlite3SrcListLo
13680 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 62  okup(pParse, pTb
13690 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  lName);.      if
136a0 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26  ( pName2->n==0 &
136b0 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e  & pTab && pTab->
136c0 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62  pSchema==db->aDb
136d0 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20  [1].pSchema ){. 
136e0 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a         iDb = 1;.
136f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
13700 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 73 71  ndif..    if( sq
13710 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
13720 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c  ix, pParse, iDb,
13730 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29   "index", pName)
13740 20 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69   &&.        sqli
13750 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73  te3FixSrcList(&s
13760 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20  Fix, pTblName). 
13770 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42     ){.      /* B
13780 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65  ecause the parse
13790 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62  r constructs pTb
137a0 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e  lName from a sin
137b0 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a  gle identifier,.
137c0 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
137d0 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e  FixSrcList can n
137e0 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20  ever fail. */.  
137f0 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
13800 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20     }.    pTab = 
13810 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
13820 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54  le(pParse, 0, pT
13830 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61  blName->a[0].zNa
13840 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62  me, .        pTb
13850 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  lName->a[0].zDat
13860 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20  abase);.    if( 
13870 21 70 54 61 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c  !pTab || db->mal
13880 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
13890 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
138a0 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
138b0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
138c0 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
138d0 65 6d 61 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ema );.  }else{.
138e0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
138f0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62  e==0 );.    pTab
13900 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
13910 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70  able;.    if( !p
13920 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Tab ) goto exit_
13930 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
13940 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
13950 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
13960 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
13970 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62  .  }.  pDb = &db
13980 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 61  ->aDb[iDb];..  a
13990 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
139a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
139b0 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20  se->nErr==0 );. 
139c0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
139d0 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  ICmp(pTab->zName
139e0 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d  , "sqlite_", 7)=
139f0 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 6d 65  =0 .       && me
13a00 6d 63 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d  mcmp(&pTab->zNam
13a10 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22  e[7],"altertab_"
13a20 2c 39 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  ,9)!=0 ){.    sq
13a30 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13a40 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
13a50 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
13a60 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
13a70 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
13a80 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13a90 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
13aa0 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66  E_OMIT_VIEW.  if
13ab0 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
13ac0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
13ad0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
13ae0 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65  views may not be
13af0 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20   indexed");.    
13b00 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
13b10 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64  _index;.  }.#end
13b20 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
13b30 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
13b40 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74  BLE.  if( IsVirt
13b50 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
13b60 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
13b70 28 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61  (pParse, "virtua
13b80 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  l tables may not
13b90 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
13ba0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
13bb0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
13bc0 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  endif..  /*.  **
13bd0 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f   Find the name o
13be0 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61  f the index.  Ma
13bf0 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
13c00 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f   not already ano
13c10 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ther.  ** index 
13c20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  or table with th
13c30 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20  e same name.  . 
13c40 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69   **.  ** Excepti
13c50 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72  on:  If we are r
13c60 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73  eading the names
13c70 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e   of permanent in
13c80 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20  dices from the. 
13c90 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   ** sqlite_maste
13ca0 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65  r table (because
13cb0 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
13cc0 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20  ess changed the 
13cd0 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a  schema) and.  **
13ce0 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65   one of the inde
13cf0 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73  x names collides
13d00 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f   with the name o
13d10 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  f a temporary ta
13d20 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65  ble or.  ** inde
13d30 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  x, then we will 
13d40 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63  continue to proc
13d50 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a  ess this index..
13d60 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61    **.  ** If pNa
13d70 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
13d80 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20  hat we are.  ** 
13d90 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70  dealing with a p
13da0 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e  rimary key or UN
13db0 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
13dc0 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76    We have to inv
13dd0 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e  ent our.  ** own
13de0 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   name..  */.  if
13df0 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
13e00 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
13e10 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
13e20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
13e30 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
13e40 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13e50 78 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  x;.    if( SQLIT
13e60 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65  E_OK!=sqlite3Che
13e70 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61  ckObjectName(pPa
13e80 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  rse, zName) ){. 
13e90 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
13ea0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
13eb0 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e   }.    if( !db->
13ec0 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
13ed0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
13ee0 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
13ef0 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20  e, 0)!=0 ){.    
13f00 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13f10 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65  Msg(pParse, "the
13f20 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
13f30 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c  table named %s",
13f40 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
13f50 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
13f60 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
13f70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
13f80 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
13f90 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e  db, zName, pDb->
13fa0 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
13fb0 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69     if( !ifNotExi
13fc0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  st ){.        sq
13fd0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13fe0 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20  arse, "index %s 
13ff0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
14000 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
14010 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
14020 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
14030 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
14040 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64    int n;.    Ind
14050 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66  ex *pLoop;.    f
14060 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70  or(pLoop=pTab->p
14070 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f  Index, n=1; pLoo
14080 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e  p; pLoop=pLoop->
14090 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20  pNext, n++){}.  
140a0 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
140b0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71  3MPrintf(db, "sq
140c0 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25  lite_autoindex_%
140d0 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  s_%d", pTab->zNa
140e0 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20  me, n);.    if( 
140f0 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
14100 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
14110 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
14120 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
14130 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  for authorizatio
14140 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69  n to create an i
14150 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  ndex..  */.#ifnd
14160 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
14170 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
14180 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
14190 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d  *zDb = pDb->zNam
141a0 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
141b0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
141c0 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
141d0 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
141e0 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b  iDb), 0, zDb) ){
141f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
14200 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
14210 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c     }.    i = SQL
14220 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58  ITE_CREATE_INDEX
14230 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  ;.    if( !OMIT_
14240 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
14250 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52   ) i = SQLITE_CR
14260 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  EATE_TEMP_INDEX;
14270 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14280 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
14290 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62  , i, zName, pTab
142a0 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b  ->zName, zDb) ){
142b0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
142c0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
142d0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
142e0 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d  .  /* If pList==
142f0 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  0, it means this
14300 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
14310 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72  led to make a pr
14320 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f  imary.  ** key o
14330 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63  ut of the last c
14340 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74  olumn added to t
14350 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
14360 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a  onstruction..  *
14370 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61  * So create a fa
14380 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c  ke list to simul
14390 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20  ate this..  */. 
143a0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
143b0 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20  .    nullId.z = 
143c0 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
143d0 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a  >nCol-1].zName;.
143e0 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73      nullId.n = s
143f0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 28  qlite3Strlen30((
14400 63 68 61 72 2a 29 6e 75 6c 6c 49 64 2e 7a 29 3b  char*)nullId.z);
14410 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
14420 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
14430 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29  nd(pParse, 0, 0)
14440 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
14450 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
14460 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
14470 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
14480 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  SetName(pParse, 
14490 70 4c 69 73 74 2c 20 26 6e 75 6c 6c 49 64 2c 20  pList, &nullId, 
144a0 30 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  0);.    pList->a
144b0 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
144c0 28 75 38 29 73 6f 72 74 4f 72 64 65 72 3b 0a 20  (u8)sortOrder;. 
144d0 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20   }..  /* Figure 
144e0 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74  out how many byt
144f0 65 73 20 6f 66 20 73 70 61 63 65 20 61 72 65 20  es of space are 
14500 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72  required to stor
14510 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a  e explicitly.  *
14520 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c  * specified coll
14530 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
14540 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ames..  */.  for
14550 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
14560 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
14570 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c  Expr *pExpr = pL
14580 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
14590 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 20 29  .    if( pExpr )
145a0 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
145b0 2a 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e  *pColl = pExpr->
145c0 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 2f 2a 20  pColl;.      /* 
145d0 45 69 74 68 65 72 20 70 43 6f 6c 6c 21 3d 30 20  Either pColl!=0 
145e0 6f 72 20 74 68 65 72 65 20 77 61 73 20 61 6e 20  or there was an 
145f0 4f 4f 4d 20 66 61 69 6c 75 72 65 2e 20 20 42 75  OOM failure.  Bu
14600 74 20 69 66 20 61 6e 20 4f 4f 4d 0a 20 20 20 20  t if an OOM.    
14610 20 20 2a 2a 20 66 61 69 6c 75 72 65 20 77 65 20    ** failure we 
14620 68 61 76 65 20 71 75 69 74 20 62 65 66 6f 72 65  have quit before
14630 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 70   reaching this p
14640 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69  oint. */.      i
14650 66 28 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29  f( ALWAYS(pColl)
14660 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 78 74   ){.        nExt
14670 72 61 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74  ra += (1 + sqlit
14680 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 6c  e3Strlen30(pColl
14690 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
146a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
146b0 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74  /* .  ** Allocat
146c0 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75  e the index stru
146d0 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e  cture. .  */.  n
146e0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
146f0 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
14700 20 6e 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e   nCol = pList->n
14710 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 20 3d  Expr;.  pIndex =
14720 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
14730 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20 20 20 20  Zero(db, .      
14740 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20  sizeof(Index) + 
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14760 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
14770 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
14780 28 69 6e 74 29 2a 6e 43 6f 6c 20 2b 20 20 20 20  (int)*nCol +    
14790 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
147a0 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20  aiColumn   */.  
147b0 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a      sizeof(int)*
147c0 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20 20  (nCol+1) +      
147d0 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 45   /* Index.aiRowE
147e0 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69  st   */.      si
147f0 7a 65 6f 66 28 63 68 61 72 20 2a 29 2a 6e 43 6f  zeof(char *)*nCo
14800 6c 20 2b 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  l +        /* In
14810 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a  dex.azColl     *
14820 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75  /.      sizeof(u
14830 38 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20  8)*nCol +       
14840 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53       /* Index.aS
14850 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 20 20  ortOrder */.    
14860 20 20 6e 4e 61 6d 65 20 2b 20 31 20 2b 20 20 20    nName + 1 +   
14870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14880 2a 20 49 6e 64 65 78 2e 7a 4e 61 6d 65 20 20 20  * Index.zName   
14890 20 20 20 2a 2f 0a 20 20 20 20 20 20 6e 45 78 74     */.      nExt
148a0 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ra              
148b0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
148c0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
148d0 61 6d 65 73 20 2a 2f 0a 20 20 29 3b 0a 20 20 69  ames */.  );.  i
148e0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
148f0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
14900 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
14910 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 2d  x;.  }.  pIndex-
14920 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a  >azColl = (char*
14930 2a 29 28 26 70 49 6e 64 65 78 5b 31 5d 29 3b 0a  *)(&pIndex[1]);.
14940 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
14950 6d 6e 20 3d 20 28 69 6e 74 20 2a 29 28 26 70 49  mn = (int *)(&pI
14960 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f  ndex->azColl[nCo
14970 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  l]);.  pIndex->a
14980 69 52 6f 77 45 73 74 20 3d 20 28 75 6e 73 69 67  iRowEst = (unsig
14990 6e 65 64 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e  ned *)(&pIndex->
149a0 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 5d 29 3b  aiColumn[nCol]);
149b0 0a 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74  .  pIndex->aSort
149c0 4f 72 64 65 72 20 3d 20 28 75 38 20 2a 29 28 26  Order = (u8 *)(&
149d0 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74  pIndex->aiRowEst
149e0 5b 6e 43 6f 6c 2b 31 5d 29 3b 0a 20 20 70 49 6e  [nCol+1]);.  pIn
149f0 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68  dex->zName = (ch
14a00 61 72 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61  ar *)(&pIndex->a
14a10 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 29  SortOrder[nCol])
14a20 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 28 63 68  ;.  zExtra = (ch
14a30 61 72 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 7a  ar *)(&pIndex->z
14a40 4e 61 6d 65 5b 6e 4e 61 6d 65 2b 31 5d 29 3b 0a  Name[nName+1]);.
14a50 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d    memcpy(pIndex-
14a60 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e  >zName, zName, n
14a70 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65  Name+1);.  pInde
14a80 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
14a90 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ;.  pIndex->nCol
14aa0 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  umn = pList->nEx
14ab0 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e  pr;.  pIndex->on
14ac0 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72  Error = (u8)onEr
14ad0 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  ror;.  pIndex->a
14ae0 75 74 6f 49 6e 64 65 78 20 3d 20 28 75 38 29 28  utoIndex = (u8)(
14af0 70 4e 61 6d 65 3d 3d 30 29 3b 0a 20 20 70 49 6e  pName==0);.  pIn
14b00 64 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64  dex->pSchema = d
14b10 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
14b20 65 6d 61 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ema;..  /* Check
14b30 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 73 68   to see if we sh
14b40 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20  ould honor DESC 
14b50 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65  requests on inde
14b60 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20  x columns.  */. 
14b70 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
14b80 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  a->file_format>=
14b90 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64  4 ){.    sortOrd
14ba0 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f  erMask = -1;   /
14bb0 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a  * Honor DESC */.
14bc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72    }else{.    sor
14bd0 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20  tOrderMask = 0; 
14be0 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53     /* Ignore DES
14bf0 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  C */.  }..  /* S
14c00 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  can the names of
14c10 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
14c20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
14c30 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a  indexed and.  **
14c40 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e   load the column
14c50 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68   indices into th
14c60 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  e Index structur
14c70 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72  e.  Report an er
14c80 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20  ror.  ** if any 
14c90 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f  column is not fo
14ca0 75 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  und..  **.  ** T
14cb0 4f 44 4f 3a 20 20 41 64 64 20 61 20 74 65 73 74  ODO:  Add a test
14cc0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
14cd0 61 74 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75  at the same colu
14ce0 6d 6e 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64 0a  mn is not named.
14cf0 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f    ** more than o
14d00 6e 63 65 20 77 69 74 68 69 6e 20 74 68 65 20 73  nce within the s
14d10 61 6d 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79  ame index.  Only
14d20 20 74 68 65 20 66 69 72 73 74 20 69 6e 73 74 61   the first insta
14d30 6e 63 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  nce of.  ** the 
14d40 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72  column will ever
14d50 20 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20   be used by the 
14d60 6f 70 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65  optimizer.  Note
14d70 20 74 68 61 74 20 75 73 69 6e 67 20 74 68 65 0a   that using the.
14d80 20 20 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d 6e    ** same column
14d90 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20   more than once 
14da0 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72 72  cannot be an err
14db0 6f 72 20 62 65 63 61 75 73 65 20 74 68 61 74 20  or because that 
14dc0 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 62 72 65 61  would .  ** brea
14dd0 6b 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  k backwards comp
14de0 61 74 69 62 69 6c 69 74 79 20 2d 20 69 74 20 6e  atibility - it n
14df0 65 65 64 73 20 74 6f 20 62 65 20 61 20 77 61 72  eeds to be a war
14e00 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ning..  */.  for
14e10 28 69 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d  (i=0, pListItem=
14e20 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73  pList->a; i<pLis
14e30 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
14e40 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  ListItem++){.   
14e50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
14e60 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74 49 74 65  lName = pListIte
14e70 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 43 6f  m->zName;.    Co
14e80 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20  lumn *pTabCol;. 
14e90 20 20 20 69 6e 74 20 72 65 71 75 65 73 74 65 64     int requested
14ea0 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 63  SortOrder;.    c
14eb0 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20  har *zColl;     
14ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14ed0 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
14ee0 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20  nce name */..   
14ef0 20 66 6f 72 28 6a 3d 30 2c 20 70 54 61 62 43 6f   for(j=0, pTabCo
14f00 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c  l=pTab->aCol; j<
14f10 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c  pTab->nCol; j++,
14f20 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20   pTabCol++){.   
14f30 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
14f40 72 49 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20  rICmp(zColName, 
14f50 70 54 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d  pTabCol->zName)=
14f60 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
14f70 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61  }.    if( j>=pTa
14f80 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
14f90 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
14fa0 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
14fb0 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e  %s has no column
14fc0 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20   named %s",.    
14fd0 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
14fe0 20 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20   zColName);.    
14ff0 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
15000 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20  chema = 1;.     
15010 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
15020 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
15030 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
15040 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20  umn[i] = j;.    
15050 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f 6e  /* Justification
15060 20 6f 66 20 74 68 65 20 41 4c 57 41 59 53 28 70   of the ALWAYS(p
15070 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d  ListItem->pExpr-
15080 3e 70 43 6f 6c 6c 29 3a 20 20 42 65 63 61 75 73  >pColl):  Becaus
15090 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  e of.    ** the 
150a0 77 61 79 20 74 68 65 20 22 69 64 78 6c 69 73 74  way the "idxlist
150b0 22 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 69  " non-terminal i
150c0 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  s constructed by
150d0 20 74 68 65 20 70 61 72 73 65 72 2c 0a 20 20 20   the parser,.   
150e0 20 2a 2a 20 69 66 20 70 4c 69 73 74 49 74 65 6d   ** if pListItem
150f0 2d 3e 70 45 78 70 72 20 69 73 20 6e 6f 74 20 6e  ->pExpr is not n
15100 75 6c 6c 20 74 68 65 6e 20 65 69 74 68 65 72 20  ull then either 
15110 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
15120 2d 3e 70 43 6f 6c 6c 0a 20 20 20 20 2a 2a 20 6d  ->pColl.    ** m
15130 75 73 74 20 65 78 69 73 74 20 6f 72 20 65 6c 73  ust exist or els
15140 65 20 74 68 65 72 65 20 6d 75 73 74 20 68 61 76  e there must hav
15150 65 20 62 65 65 6e 20 61 6e 20 4f 4f 4d 20 65 72  e been an OOM er
15160 72 6f 72 2e 20 20 42 75 74 20 69 66 20 74 68 65  ror.  But if the
15170 72 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 61 6e  re.    ** was an
15180 20 4f 4f 4d 20 65 72 72 6f 72 2c 20 77 65 20 77   OOM error, we w
15190 6f 75 6c 64 20 6e 65 76 65 72 20 72 65 61 63 68  ould never reach
151a0 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a   this point. */.
151b0 20 20 20 20 69 66 28 20 70 4c 69 73 74 49 74 65      if( pListIte
151c0 6d 2d 3e 70 45 78 70 72 20 26 26 20 41 4c 57 41  m->pExpr && ALWA
151d0 59 53 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45  YS(pListItem->pE
151e0 78 70 72 2d 3e 70 43 6f 6c 6c 29 20 29 7b 0a 20  xpr->pColl) ){. 
151f0 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a       int nColl;.
15200 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c        zColl = pL
15210 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
15220 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
15230 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69      nColl = sqli
15240 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c  te3Strlen30(zCol
15250 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 61 73  l) + 1;.      as
15260 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43  sert( nExtra>=nC
15270 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  oll );.      mem
15280 63 70 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c  cpy(zExtra, zCol
15290 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  l, nColl);.     
152a0 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b   zColl = zExtra;
152b0 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d  .      zExtra +=
152c0 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45   nColl;.      nE
152d0 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20  xtra -= nColl;. 
152e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
152f0 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43  zColl = pTab->aC
15300 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[j].zColl;.   
15310 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 7b     if( !zColl ){
15320 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  .        zColl =
15330 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 2d 3e   db->pDfltColl->
15340 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20  zName;.      }. 
15350 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62     }.    if( !db
15360 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21  ->init.busy && !
15370 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
15380 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f  lSeq(pParse, zCo
15390 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ll) ){.      got
153a0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
153b0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
153c0 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  Index->azColl[i]
153d0 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65   = zColl;.    re
153e0 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
153f0 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f   = pListItem->so
15400 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72  rtOrder & sortOr
15410 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e  derMask;.    pIn
15420 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
15430 69 5d 20 3d 20 28 75 38 29 72 65 71 75 65 73 74  i] = (u8)request
15440 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  edSortOrder;.  }
15450 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c  .  sqlite3Defaul
15460 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b  tRowEst(pIndex);
15470 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50  ..  if( pTab==pP
15480 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
15490 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72  ){.    /* This r
154a0 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20  outine has been 
154b0 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
154c0 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
154d0 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20  dex as a.    ** 
154e0 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d  result of a PRIM
154f0 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
15500 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f  E clause on a co
15510 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c  lumn definition,
15520 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49   or.    ** a PRI
15530 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
15540 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77  UE clause follow
15550 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64  ing the column d
15560 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20  efinitions..    
15570 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a  ** i.e. one of:.
15580 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52      **.    ** CR
15590 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 20 50  EATE TABLE t(x P
155a0 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a  RIMARY KEY, y);.
155b0 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41      ** CREATE TA
155c0 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51  BLE t(x, y, UNIQ
155d0 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a  UE(x, y));.    *
155e0 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20  *.    ** Either 
155f0 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65  way, check to se
15600 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 61  e if the table a
15610 6c 72 65 61 64 79 20 68 61 73 20 73 75 63 68 20  lready has such 
15620 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20  an index. If.   
15630 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f   ** so, don't bo
15640 74 68 65 72 20 63 72 65 61 74 69 6e 67 20 74 68  ther creating th
15650 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c  is one. This onl
15660 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20  y applies to.   
15670 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
15680 79 20 63 72 65 61 74 65 64 20 69 6e 64 69 63 65  y created indice
15690 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20  s. Users can do 
156a0 61 73 20 74 68 65 79 20 77 69 73 68 20 77 69 74  as they wish wit
156b0 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69  h.    ** explici
156c0 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a  t indices..    *
156d0 2a 0a 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49  *.    ** Two UNI
156e0 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b  QUE or PRIMARY K
156f0 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  EY constraints a
15700 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71  re considered eq
15710 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20  uivalent.    ** 
15720 28 61 6e 64 20 74 68 75 73 20 73 75 70 70 72 65  (and thus suppre
15730 73 73 69 6e 67 20 74 68 65 20 73 65 63 6f 6e 64  ssing the second
15740 20 6f 6e 65 29 20 65 76 65 6e 20 69 66 20 74 68   one) even if th
15750 65 79 20 68 61 76 65 20 64 69 66 66 65 72 65 6e  ey have differen
15760 74 0a 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72  t.    ** sort or
15770 64 65 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ders..    **.   
15780 20 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   ** If there are
15790 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61   different colla
157a0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 6f  ting sequences o
157b0 72 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  r if the columns
157c0 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   of.    ** the c
157d0 6f 6e 73 74 72 61 69 6e 74 20 6f 63 63 75 72 20  onstraint occur 
157e0 69 6e 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64  in different ord
157f0 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ers, then the co
15800 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a 20 20  nstraints are.  
15810 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20    ** considered 
15820 64 69 73 74 69 6e 63 74 20 61 6e 64 20 62 6f 74  distinct and bot
15830 68 20 72 65 73 75 6c 74 20 69 6e 20 73 65 70 61  h result in sepa
15840 72 61 74 65 20 69 6e 64 69 63 65 73 2e 0a 20 20  rate indices..  
15850 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a    */.    Index *
15860 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
15870 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
15880 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
15890 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
158a0 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73  int k;.      ass
158b0 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72  ert( pIdx->onErr
158c0 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20  or!=OE_None );. 
158d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
158e0 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a  x->autoIndex );.
158f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
15900 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  ndex->onError!=O
15910 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20  E_None );..     
15920 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   if( pIdx->nColu
15930 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  mn!=pIndex->nCol
15940 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  umn ) continue;.
15950 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
15960 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
15970 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  k++){.        co
15980 6e 73 74 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20  nst char *z1;.  
15990 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
159a0 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 69 66   *z2;.        if
159b0 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
159c0 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43  [k]!=pIndex->aiC
159d0 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b  olumn[k] ) break
159e0 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70  ;.        z1 = p
159f0 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a  Idx->azColl[k];.
15a00 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70 49 6e          z2 = pIn
15a10 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a  dex->azColl[k];.
15a20 20 20 20 20 20 20 20 20 69 66 28 20 7a 31 21 3d          if( z1!=
15a30 7a 32 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  z2 && sqlite3Str
15a40 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20 62  ICmp(z1, z2) ) b
15a50 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
15a60 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d      if( k==pIdx-
15a70 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
15a80 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e      if( pIdx->on
15a90 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f  Error!=pIndex->o
15aa0 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  nError ){.      
15ab0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73      /* This cons
15ac0 74 72 61 69 6e 74 20 63 72 65 61 74 65 73 20 74  traint creates t
15ad0 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73  he same index as
15ae0 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20   a previous.    
15af0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61        ** constra
15b00 69 6e 74 20 73 70 65 63 69 66 69 65 64 20 73 6f  int specified so
15b10 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 43  mewhere in the C
15b20 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
15b30 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20  ement..         
15b40 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20   ** However the 
15b50 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
15b60 73 65 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  ses are differen
15b70 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73 20  t. If both this 
15b80 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
15b90 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65  nstraint and the
15ba0 20 70 72 65 76 69 6f 75 73 20 65 71 75 69 76 61   previous equiva
15bb0 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  lent constraint 
15bc0 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20  have explicit.  
15bd0 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f          ** ON CO
15be0 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74  NFLICT clauses t
15bf0 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  his is an error.
15c00 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20   Otherwise, use 
15c10 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
15c20 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63   explicitly spec
15c30 69 66 69 65 64 20 62 65 68 61 76 69 6f 75 72 20  ified behaviour 
15c40 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20  for the index.. 
15c50 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
15c60 20 20 20 20 20 20 69 66 28 20 21 28 70 49 64 78        if( !(pIdx
15c70 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
15c80 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d  fault || pIndex-
15c90 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
15ca0 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20  ault) ){.       
15cb0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
15cc0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
15cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
15ce0 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f  onflicting ON CO
15cf0 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73  NFLICT clauses s
15d00 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20  pecified", 0);. 
15d10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15d20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
15d30 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
15d40 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  lt ){.          
15d50 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20    pIdx->onError 
15d60 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  = pIndex->onErro
15d70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  r;.          }. 
15d80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15d90 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
15da0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
15db0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
15dc0 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e   Link the new In
15dd0 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f  dex structure to
15de0 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74   its table and t
15df0 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a  o the other.  **
15e00 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
15e10 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 20  ase structures. 
15e20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
15e30 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
15e40 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70   Index *p;.    p
15e50 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
15e60 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53  sert(&pIndex->pS
15e70 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
15e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15e90 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65             pInde
15ea0 78 2d 3e 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65  x->zName, sqlite
15eb0 33 53 74 72 6c 65 6e 33 30 28 70 49 6e 64 65 78  3Strlen30(pIndex
15ec0 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20  ->zName),.      
15ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ee0 20 20 20 20 70 49 6e 64 65 78 29 3b 0a 20 20 20      pIndex);.   
15ef0 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
15f00 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65  assert( p==pInde
15f10 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  x );  /* Malloc 
15f20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
15f30 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61   */.      db->ma
15f40 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
15f50 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
15f60 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
15f70 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67    }.    db->flag
15f80 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
15f90 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69  rnChanges;.    i
15fa0 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
15fb0 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
15fc0 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
15fd0 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20  newTnum;.    }. 
15fe0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
15ff0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
16000 20 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74   0 then create t
16010 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b  he index on disk
16020 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76  .  This.  ** inv
16030 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68  olves writing th
16040 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  e index into the
16050 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
16060 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  d filling in the
16070 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68  .  ** index with
16080 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
16090 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a  le contents..  *
160a0 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69  *.  ** The db->i
160b0 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 77 68  nit.busy is 0 wh
160c0 65 6e 20 74 68 65 20 75 73 65 72 20 66 69 72 73  en the user firs
160d0 74 20 65 6e 74 65 72 73 20 61 20 43 52 45 41 54  t enters a CREAT
160e0 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f  E INDEX .  ** co
160f0 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74  mmand.  db->init
16100 2e 62 75 73 79 20 69 73 20 31 20 77 68 65 6e 20  .busy is 1 when 
16110 61 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  a database is op
16120 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43  ened and .  ** C
16130 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
16140 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64 20  ements are read 
16150 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65  out of the maste
16160 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a  r table.  In.  *
16170 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73  * the latter cas
16180 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65  e the index alre
16190 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69  ady exists on di
161a0 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68 79  sk, which is why
161b0 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77  .  ** we don't w
161c0 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20  ant to recreate 
161d0 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  it..  **.  ** If
161e0 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20   pTblName==0 it 
161f0 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78  means this index
16200 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73   is generated as
16210 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20   a primary key. 
16220 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f   ** or UNIQUE co
16230 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52  nstraint of a CR
16240 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
16250 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65  ment.  Since the
16260 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20   table.  ** has 
16270 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65  just been create
16280 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e  d, it contains n
16290 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69  o data and the i
162a0 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74  ndex initializat
162b0 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61  ion.  ** step ca
162c0 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20  n be skipped..  
162d0 2a 2f 0a 20 20 65 6c 73 65 7b 20 2f 2a 20 69 66  */.  else{ /* if
162e0 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
162f0 3d 30 20 29 20 2a 2f 0a 20 20 20 20 56 64 62 65  =0 ) */.    Vdbe
16300 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   *v;.    char *z
16310 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d  Stmt;.    int iM
16320 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
16330 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71  Mem;..    v = sq
16340 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
16350 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
16360 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
16370 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 0a 20  reate_index;... 
16380 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
16390 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68   rootpage for th
163a0 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20  e index.    */. 
163b0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
163c0 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
163d0 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20  arse, 1, iDb);. 
163e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
163f0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74  dOp2(v, OP_Creat
16400 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 69 4d 65  eIndex, iDb, iMe
16410 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68  m);..    /* Gath
16420 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  er the complete 
16430 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  text of the CREA
16440 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
16450 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74  nt into.    ** t
16460 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c  he zStmt variabl
16470 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
16480 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20   pStart ){.     
16490 20 61 73 73 65 72 74 28 20 70 45 6e 64 21 3d 30   assert( pEnd!=0
164a0 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e   );.      /* A n
164b0 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68 20  amed index with 
164c0 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45 41  an explicit CREA
164d0 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
164e0 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d  nt */.      zStm
164f0 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
16500 74 66 28 64 62 2c 20 22 43 52 45 41 54 45 25 73  tf(db, "CREATE%s
16510 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20   INDEX %.*s",.  
16520 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f        onError==O
16530 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20  E_None ? "" : " 
16540 55 4e 49 51 55 45 22 2c 0a 20 20 20 20 20 20 20  UNIQUE",.       
16550 20 70 45 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65   pEnd->z - pName
16560 2d 3e 7a 20 2b 20 31 2c 0a 20 20 20 20 20 20 20  ->z + 1,.       
16570 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20   pName->z);.    
16580 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
16590 41 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  An automatic ind
165a0 65 78 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ex created by a 
165b0 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
165c0 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
165d0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74   */.      /* zSt
165e0 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
165f0 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20  ntf(""); */.    
16600 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20    zStmt = 0;.   
16610 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61   }..    /* Add a
16620 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74  n entry in sqlit
16630 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69  e_master for thi
16640 73 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20  s index.    */. 
16650 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
16660 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
16670 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49         "INSERT I
16680 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53  NTO %Q.%s VALUES
16690 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23  ('index',%Q,%Q,#
166a0 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20  %d,%Q);",.      
166b0 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
166c0 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
166d0 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20  LE(iDb),.       
166e0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a   pIndex->zName,.
166f0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
16700 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 69 4d 65  ame,.        iMe
16710 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74  m,.        zStmt
16720 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
16730 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
16740 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  tmt);..    /* Fi
16750 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69 74  ll the index wit
16760 68 20 64 61 74 61 20 61 6e 64 20 72 65 70 61 72  h data and repar
16770 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43  se the schema. C
16780 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65  ode an OP_Expire
16790 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c  .    ** to inval
167a0 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f  idate all pre-co
167b0 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
167c0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
167d0 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20  ( pTblName ){.  
167e0 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
167f0 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
16800 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20  Index, iMem);.  
16810 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
16820 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
16830 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
16840 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
16850 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c   OP_ParseSchema,
16860 20 69 44 62 2c 20 30 2c 20 30 2c 0a 20 20 20 20   iDb, 0, 0,.    
16870 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
16880 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25  ntf(db, "name='%
16890 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  q'", pIndex->zNa
168a0 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  me), P4_DYNAMIC)
168b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
168c0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
168d0 45 78 70 69 72 65 2c 20 30 29 3b 0a 20 20 20 20  Expire, 0);.    
168e0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  }.  }..  /* When
168f0 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78   adding an index
16900 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
16910 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61  indices for a ta
16920 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  ble, make.  ** s
16930 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ure all indices 
16940 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61  labeled OE_Repla
16950 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c  ce come after al
16960 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a  l those labeled.
16970 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20    ** OE_Ignore. 
16980 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
16990 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  ry for the corre
169a0 63 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68  ct constraint ch
169b0 65 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73  eck.  ** process
169c0 69 6e 67 20 28 69 6e 20 73 71 6c 69 74 65 33 47  ing (in sqlite3G
169d0 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e  enerateConstrain
169e0 74 43 68 65 63 6b 73 28 29 29 20 61 73 20 70 61  tChecks()) as pa
169f0 72 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54  rt of.  ** UPDAT
16a00 45 20 61 6e 64 20 49 4e 53 45 52 54 20 73 74 61  E and INSERT sta
16a10 74 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a  tements.  .  */.
16a20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
16a30 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d  usy || pTblName=
16a40 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e  =0 ){.    if( on
16a50 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
16a60 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65  e || pTab->pInde
16a70 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  x==0.         ||
16a80 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f   pTab->pIndex->o
16a90 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
16aa0 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  ce){.      pInde
16ab0 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d  x->pNext = pTab-
16ac0 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70  >pIndex;.      p
16ad0 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  Tab->pIndex = pI
16ae0 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ndex;.    }else{
16af0 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f  .      Index *pO
16b00 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e  ther = pTab->pIn
16b10 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  dex;.      while
16b20 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20  ( pOther->pNext 
16b30 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  && pOther->pNext
16b40 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ->onError!=OE_Re
16b50 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  place ){.       
16b60 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72   pOther = pOther
16b70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
16b80 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
16b90 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70  Next = pOther->p
16ba0 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68  Next;.      pOth
16bb0 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64  er->pNext = pInd
16bc0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52  ex;.    }.    pR
16bd0 65 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  et = pIndex;.   
16be0 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d   pIndex = 0;.  }
16bf0 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20  ..  /* Clean up 
16c00 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a  before exiting *
16c10 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  /.exit_create_in
16c20 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65  dex:.  if( pInde
16c30 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
16c40 44 62 46 72 65 65 28 64 62 2c 20 70 49 6e 64 65  DbFree(db, pInde
16c50 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20  x->zColAff);.   
16c60 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
16c70 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
16c80 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
16c90 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
16ca0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63  t);.  sqlite3Src
16cb0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
16cc0 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  TblName);.  sqli
16cd0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
16ce0 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ame);.  return p
16cf0 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  Ret;.}../*.** Fi
16d00 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52  ll the Index.aiR
16d10 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69  owEst[] array wi
16d20 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72  th default infor
16d30 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61  mation - informa
16d40 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73  tion.** to be us
16d50 65 64 20 77 68 65 6e 20 77 65 20 68 61 76 65 20  ed when we have 
16d60 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c  not run the ANAL
16d70 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  YZE command..**.
16d80 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69  ** aiRowEst[0] i
16d90 73 20 73 75 70 70 6f 73 65 20 74 6f 20 63 6f 6e  s suppose to con
16da0 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  tain the number 
16db0 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  of elements in t
16dc0 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e  he index..** Sin
16dd0 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f  ce we do not kno
16de0 77 2c 20 67 75 65 73 73 20 31 20 6d 69 6c 6c 69  w, guess 1 milli
16df0 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b 31 5d  on.  aiRowEst[1]
16e00 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
16e10 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  of the.** number
16e20 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
16e30 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68  table that match
16e40 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20   any particular 
16e50 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20  value of the.** 
16e60 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  first column of 
16e70 74 68 65 20 69 6e 64 65 78 2e 20 20 61 69 52 6f  the index.  aiRo
16e80 77 45 73 74 5b 32 5d 20 69 73 20 61 6e 20 65 73  wEst[2] is an es
16e90 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
16ea0 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20  mber.** of rows 
16eb0 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70  that match any p
16ec0 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e  articular combin
16ed0 69 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69  iation of the fi
16ee0 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  rst 2 columns.**
16ef0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
16f00 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49  And so forth.  I
16f10 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65  t must always be
16f20 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a   the case that.*
16f30 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69  .**           ai
16f40 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77  RowEst[N]<=aiRow
16f50 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20  Est[N-1].**     
16f60 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e        aiRowEst[N
16f70 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74  ]>=1.**.** Apart
16f80 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68   from that, we h
16f90 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f  ave little to go
16fa0 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75   on besides intu
16fb0 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68  ition as to.** h
16fc0 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68  ow aiRowEst[] sh
16fd0 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69  ould be initiali
16fe0 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  zed.  The number
16ff0 73 20 67 65 6e 65 72 61 74 65 64 20 68 65 72 65  s generated here
17000 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e  .** are based on
17010 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20   typical values 
17020 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20  found in actual 
17030 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64  indices..*/.void
17040 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52   sqlite3DefaultR
17050 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64  owEst(Index *pId
17060 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 2a  x){.  unsigned *
17070 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 45  a = pIdx->aiRowE
17080 73 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75  st;.  int i;.  u
17090 6e 73 69 67 6e 65 64 20 6e 3b 0a 20 20 61 73 73  nsigned n;.  ass
170a0 65 72 74 28 20 61 21 3d 30 20 29 3b 0a 20 20 61  ert( a!=0 );.  a
170b0 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  [0] = pIdx->pTab
170c0 6c 65 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 69  le->nRowEst;.  i
170d0 66 28 20 61 5b 30 5d 3c 31 30 20 29 20 61 5b 30  f( a[0]<10 ) a[0
170e0 5d 20 3d 20 31 30 3b 0a 20 20 6e 20 3d 20 31 30  ] = 10;.  n = 10
170f0 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d  ;.  for(i=1; i<=
17100 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
17110 2b 2b 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20  ++){.    a[i] = 
17120 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3e 35 20 29  n;.    if( n>5 )
17130 20 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28 20   n--;.  }.  if( 
17140 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  pIdx->onError!=O
17150 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 61 5b  E_None ){.    a[
17160 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d  pIdx->nColumn] =
17170 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
17180 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
17190 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74  ll drop an exist
171a0 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e  ing named index.
171b0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
171c0 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  * implements the
171d0 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74   DROP INDEX stat
171e0 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
171f0 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28  qlite3DropIndex(
17200 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
17210 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69  rcList *pName, i
17220 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20  nt ifExists){.  
17230 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
17240 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
17250 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
17260 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
17270 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
17280 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20  se->nErr==0 );  
17290 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64   /* Never called
172a0 20 77 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f   with prior erro
172b0 72 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  rs */.  if( db->
172c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
172d0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
172e0 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
172f0 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e  assert( pName->n
17300 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  Src==1 );.  if( 
17310 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
17320 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
17330 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  rse) ){.    goto
17340 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
17350 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d  ;.  }.  pIndex =
17360 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
17370 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  x(db, pName->a[0
17380 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
17390 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
173a0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30  .  if( pIndex==0
173b0 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45   ){.    if( !ifE
173c0 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73  xists ){.      s
173d0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
173e0 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
173f0 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d  index: %S", pNam
17400 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, 0);.    }.   
17410 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
17420 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f  hema = 1;.    go
17430 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
17440 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  ex;.  }.  if( pI
17450 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20  ndex->autoIndex 
17460 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
17470 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
17480 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
17490 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20   with UNIQUE ". 
174a0 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59       "or PRIMARY
174b0 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
174c0 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  cannot be droppe
174d0 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f  d", 0);.    goto
174e0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
174f0 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
17500 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
17510 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70  ex(db, pIndex->p
17520 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66  Schema);.#ifndef
17530 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
17540 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
17550 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51     int code = SQ
17560 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b  LITE_DROP_INDEX;
17570 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
17580 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
17590 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
175a0 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
175b0 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
175c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
175d0 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
175e0 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73  (iDb);.    if( s
175f0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
17600 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
17610 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
17620 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
17630 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
17640 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
17650 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
17660 26 20 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53  & iDb ) code = S
17670 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
17680 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
17690 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
176a0 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49  pParse, code, pI
176b0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61  ndex->zName, pTa
176c0 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
176d0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
176e0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
176f0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
17700 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
17710 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
17720 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20   index and from 
17730 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
17740 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
17750 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
17760 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
17770 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
17780 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
17790 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20  se, 1, iDb);.   
177a0 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
177b0 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
177c0 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
177d0 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65  %Q.%s WHERE name
177e0 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 64 62 2d  =%Q",.       db-
177f0 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
17800 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
17810 62 29 2c 0a 20 20 20 20 20 20 20 70 49 6e 64 65  b),.       pInde
17820 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a  x->zName.    );.
17830 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
17840 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71  indTable(db, "sq
17850 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 64 62 2d  lite_stat1", db-
17860 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29  >aDb[iDb].zName)
17870 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
17880 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
17890 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45  rse,.        "DE
178a0 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c  LETE FROM %Q.sql
178b0 69 74 65 5f 73 74 61 74 31 20 57 48 45 52 45 20  ite_stat1 WHERE 
178c0 69 64 78 3d 25 51 22 2c 0a 20 20 20 20 20 20 20  idx=%Q",.       
178d0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
178e0 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  ame, pIndex->zNa
178f0 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
17900 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  }.    sqlite3Cha
17910 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
17920 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74  , iDb);.    dest
17930 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
17940 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  se, pIndex->tnum
17950 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
17960 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
17970 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69   OP_DropIndex, i
17980 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78  Db, 0, 0, pIndex
17990 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d  ->zName, 0);.  }
179a0 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  ..exit_drop_inde
179b0 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  x:.  sqlite3SrcL
179c0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e  istDelete(db, pN
179d0 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  ame);.}../*.** p
179e0 41 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74  Array is a point
179f0 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f  er to an array o
17a00 66 20 6f 62 6a 65 63 74 73 2e 20 20 45 61 63 68  f objects.  Each
17a10 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a   object in the.*
17a20 2a 20 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74  * array is szEnt
17a30 72 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ry bytes in size
17a40 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
17a50 61 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65 77 0a  allocates a new.
17a60 2a 2a 20 6f 62 6a 65 63 74 20 6f 6e 20 74 68 65  ** object on the
17a70 20 65 6e 64 20 6f 66 20 74 68 65 20 61 72 72 61   end of the arra
17a80 79 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 45 6e 74 72  y..**.** *pnEntr
17a90 79 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  y is the number 
17aa0 6f 66 20 65 6e 74 72 69 65 73 20 61 6c 72 65 61  of entries alrea
17ab0 64 79 20 69 6e 20 75 73 65 2e 20 20 2a 70 6e 41  dy in use.  *pnA
17ac0 6c 6c 6f 63 20 69 73 0a 2a 2a 20 74 68 65 20 70  lloc is.** the p
17ad0 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  reviously alloca
17ae0 74 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ted size of the 
17af0 61 72 72 61 79 2e 20 20 69 6e 69 74 53 69 7a 65  array.  initSize
17b00 20 69 73 20 74 68 65 0a 2a 2a 20 73 75 67 67 65   is the.** sugge
17b10 73 74 65 64 20 69 6e 69 74 69 61 6c 20 61 72 72  sted initial arr
17b20 61 79 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 69  ay size allocati
17b30 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  on..**.** The in
17b40 64 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20 65  dex of the new e
17b50 6e 74 72 79 20 69 73 20 72 65 74 75 72 6e 65 64  ntry is returned
17b60 20 69 6e 20 2a 70 49 64 78 2e 0a 2a 2a 0a 2a 2a   in *pIdx..**.**
17b70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
17b80 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
17b90 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  to the array of 
17ba0 6f 62 6a 65 63 74 73 2e 20 20 54 68 69 73 0a 2a  objects.  This.*
17bb0 2a 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 73  * might be the s
17bc0 61 6d 65 20 61 73 20 74 68 65 20 70 41 72 72 61  ame as the pArra
17bd0 79 20 70 61 72 61 6d 65 74 65 72 20 6f 72 20 69  y parameter or i
17be0 74 20 6d 69 67 68 74 20 62 65 20 61 20 64 69 66  t might be a dif
17bf0 66 65 72 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74 65  ferent.** pointe
17c00 72 20 69 66 20 74 68 65 20 61 72 72 61 79 20 77  r if the array w
17c10 61 73 20 72 65 73 69 7a 65 64 2e 0a 2a 2f 0a 76  as resized..*/.v
17c20 6f 69 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61  oid *sqlite3Arra
17c30 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c  yAllocate(.  sql
17c40 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f  ite3 *db,      /
17c50 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  * Connection to 
17c60 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63  notify of malloc
17c70 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76   failures */.  v
17c80 6f 69 64 20 2a 70 41 72 72 61 79 2c 20 20 20 20  oid *pArray,    
17c90 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 62 6a   /* Array of obj
17ca0 65 63 74 73 2e 20 20 4d 69 67 68 74 20 62 65 20  ects.  Might be 
17cb0 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  reallocated */. 
17cc0 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20 20   int szEntry,   
17cd0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61     /* Size of ea
17ce0 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  ch object in the
17cf0 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
17d00 69 6e 69 74 53 69 7a 65 2c 20 20 20 20 20 2f 2a  initSize,     /*
17d10 20 53 75 67 67 65 73 74 65 64 20 69 6e 69 74 69   Suggested initi
17d20 61 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69  al allocation, i
17d30 6e 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  n elements */.  
17d40 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20  int *pnEntry,   
17d50 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
17d60 62 6a 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79  bjects currently
17d70 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74   in use */.  int
17d80 20 2a 70 6e 41 6c 6c 6f 63 2c 20 20 20 20 20 2f   *pnAlloc,     /
17d90 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  * Current size o
17da0 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  f the allocation
17db0 2c 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  , in elements */
17dc0 0a 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20 20  .  int *pIdx    
17dd0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
17de0 65 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65 77  e index of a new
17df0 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b   slot here */.){
17e00 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  .  char *z;.  if
17e10 28 20 2a 70 6e 45 6e 74 72 79 20 3e 3d 20 2a 70  ( *pnEntry >= *p
17e20 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 76 6f  nAlloc ){.    vo
17e30 69 64 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e  id *pNew;.    in
17e40 74 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 6e  t newSize;.    n
17e50 65 77 53 69 7a 65 20 3d 20 28 2a 70 6e 41 6c 6c  ewSize = (*pnAll
17e60 6f 63 29 2a 32 20 2b 20 69 6e 69 74 53 69 7a 65  oc)*2 + initSize
17e70 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
17e80 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
17e90 2c 20 70 41 72 72 61 79 2c 20 6e 65 77 53 69 7a  , pArray, newSiz
17ea0 65 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20  e*szEntry);.    
17eb0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
17ec0 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b       *pIdx = -1;
17ed0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41  .      return pA
17ee0 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rray;.    }.    
17ef0 2a 70 6e 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74  *pnAlloc = sqlit
17f00 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64  e3DbMallocSize(d
17f10 62 2c 20 70 4e 65 77 29 2f 73 7a 45 6e 74 72 79  b, pNew)/szEntry
17f20 3b 0a 20 20 20 20 70 41 72 72 61 79 20 3d 20 70  ;.    pArray = p
17f30 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28  New;.  }.  z = (
17f40 63 68 61 72 2a 29 70 41 72 72 61 79 3b 0a 20 20  char*)pArray;.  
17f50 6d 65 6d 73 65 74 28 26 7a 5b 2a 70 6e 45 6e 74  memset(&z[*pnEnt
17f60 72 79 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30  ry * szEntry], 0
17f70 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70  , szEntry);.  *p
17f80 49 64 78 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a  Idx = *pnEntry;.
17f90 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20    ++*pnEntry;.  
17fa0 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d  return pArray;.}
17fb0 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
17fc0 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
17fd0 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74  the given IdList
17fe0 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
17ff0 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  IdList if.** nee
18000 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  d be..**.** A ne
18010 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74 75  w IdList is retu
18020 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
18030 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
18040 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69  .*/.IdList *sqli
18050 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28  te3IdListAppend(
18060 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c  sqlite3 *db, IdL
18070 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
18080 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e  n *pToken){.  in
18090 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
180a0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
180b0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
180c0 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
180d0 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20  f(IdList) );.   
180e0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
180f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c  return 0;.    pL
18100 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b  ist->nAlloc = 0;
18110 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20  .  }.  pList->a 
18120 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
18130 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 64 62  locate(.      db
18140 2c 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61  ,.      pList->a
18150 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  ,.      sizeof(p
18160 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20  List->a[0]),.   
18170 20 20 20 35 2c 0a 20 20 20 20 20 20 26 70 4c 69     5,.      &pLi
18180 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26  st->nId,.      &
18190 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2c 0a 20  pList->nAlloc,. 
181a0 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 69       &i.  );.  i
181b0 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73 71  f( i<0 ){.    sq
181c0 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
181d0 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
181e0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
181f0 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e    pList->a[i].zN
18200 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
18210 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
18220 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e  Token);.  return
18230 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
18240 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73   Delete an IdLis
18250 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
18260 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 73  e3IdListDelete(s
18270 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69  qlite3 *db, IdLi
18280 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
18290 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
182a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
182b0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
182c0 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
182d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
182e0 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  b, pList->a[i].z
182f0 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Name);.  }.  sql
18300 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
18310 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69  List->a);.  sqli
18320 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c  te3DbFree(db, pL
18330 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ist);.}../*.** R
18340 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
18350 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20  in pList of the 
18360 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64  identifier named
18370 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31   zId.  Return -1
18380 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  .** if not found
18390 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
183a0 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69  IdListIndex(IdLi
183b0 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74  st *pList, const
183c0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
183d0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
183e0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
183f0 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  -1;.  for(i=0; i
18400 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
18410 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
18420 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  e3StrICmp(pList-
18430 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61  >a[i].zName, zNa
18440 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  me)==0 ) return 
18450 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
18460 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70  -1;.}../*.** Exp
18470 61 6e 64 20 74 68 65 20 73 70 61 63 65 20 61 6c  and the space al
18480 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
18490 67 69 76 65 6e 20 53 72 63 4c 69 73 74 20 6f 62  given SrcList ob
184a0 6a 65 63 74 20 62 79 0a 2a 2a 20 63 72 65 61 74  ject by.** creat
184b0 69 6e 67 20 6e 45 78 74 72 61 20 6e 65 77 20 73  ing nExtra new s
184c0 6c 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67 20 61  lots beginning a
184d0 74 20 69 53 74 61 72 74 2e 20 20 69 53 74 61 72  t iStart.  iStar
184e0 74 20 69 73 20 7a 65 72 6f 20 62 61 73 65 64 2e  t is zero based.
184f0 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20 61 72  .** New slots ar
18500 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20  e zeroed..**.** 
18510 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73 75 70  For example, sup
18520 70 6f 73 65 20 61 20 53 72 63 4c 69 73 74 20 69  pose a SrcList i
18530 6e 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e  nitially contain
18540 73 20 74 77 6f 20 65 6e 74 72 69 65 73 3a 20 41  s two entries: A
18550 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64  ,B..** To append
18560 20 33 20 6e 65 77 20 65 6e 74 72 69 65 73 20 6f   3 new entries o
18570 6e 74 6f 20 74 68 65 20 65 6e 64 2c 20 64 6f 20  nto the end, do 
18580 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73  this:.**.**    s
18590 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
185a0 61 72 67 65 28 64 62 2c 20 70 53 72 63 6c 69 73  arge(db, pSrclis
185b0 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20  t, 3, 2);.**.** 
185c0 41 66 74 65 72 20 74 68 65 20 63 61 6c 6c 20 61  After the call a
185d0 62 6f 76 65 20 69 74 20 77 6f 75 6c 64 20 63 6f  bove it would co
185e0 6e 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69  ntain:  A, B, ni
185f0 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20  l, nil, nil..** 
18600 49 66 20 74 68 65 20 69 53 74 61 72 74 20 61 72  If the iStart ar
18610 67 75 6d 65 6e 74 20 68 61 64 20 62 65 65 6e 20  gument had been 
18620 31 20 69 6e 73 74 65 61 64 20 6f 66 20 32 2c 20  1 instead of 2, 
18630 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a  then the result.
18640 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65  ** would have be
18650 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c  en:  A, nil, nil
18660 2c 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72  , nil, B.  To pr
18670 65 70 65 6e 64 20 74 68 65 20 6e 65 77 20 73 6c  epend the new sl
18680 6f 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61  ots,.** the iSta
18690 72 74 20 76 61 6c 75 65 20 77 6f 75 6c 64 20 62  rt value would b
186a0 65 20 30 2e 20 20 54 68 65 20 72 65 73 75 6c 74  e 0.  The result
186b0 20 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62   then would.** b
186c0 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c  e: nil, nil, nil
186d0 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66  , A, B..**.** If
186e0 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
186f0 74 69 6f 6e 20 66 61 69 6c 73 20 74 68 65 20 53  tion fails the S
18700 72 63 4c 69 73 74 20 69 73 20 75 6e 63 68 61 6e  rcList is unchan
18710 67 65 64 2e 20 20 54 68 65 0a 2a 2a 20 64 62 2d  ged.  The.** db-
18720 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
18730 61 67 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  ag will be set t
18740 6f 20 74 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69  o true..*/.SrcLi
18750 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
18760 73 74 45 6e 6c 61 72 67 65 28 0a 20 20 73 71 6c  stEnlarge(.  sql
18770 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
18780 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
18790 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79  ection to notify
187a0 20 6f 66 20 4f 4f 4d 20 65 72 72 6f 72 73 20 2a   of OOM errors *
187b0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
187c0 63 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 53 72  c,     /* The Sr
187d0 63 4c 69 73 74 20 74 6f 20 62 65 20 65 6e 6c 61  cList to be enla
187e0 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  rged */.  int nE
187f0 78 74 72 61 2c 20 20 20 20 20 20 20 20 2f 2a 20  xtra,        /* 
18800 4e 75 6d 62 65 72 20 6f 66 20 6e 65 77 20 73 6c  Number of new sl
18810 6f 74 73 20 74 6f 20 61 64 64 20 74 6f 20 70 53  ots to add to pS
18820 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74  rc->a[] */.  int
18830 20 69 53 74 61 72 74 20 20 20 20 20 20 20 20 20   iStart         
18840 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 53 72 63  /* Index in pSrc
18850 2d 3e 61 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e  ->a[] of first n
18860 65 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20  ew slot */.){.  
18870 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e  int i;..  /* San
18880 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
18890 63 61 6c 6c 69 6e 67 20 70 61 72 61 6d 65 74 65  calling paramete
188a0 72 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  rs */.  assert( 
188b0 69 53 74 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61  iStart>=0 );.  a
188c0 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 31  ssert( nExtra>=1
188d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
188e0 72 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  rc!=0 );.  asser
188f0 74 28 20 69 53 74 61 72 74 3c 3d 70 53 72 63 2d  t( iStart<=pSrc-
18900 3e 6e 53 72 63 20 29 3b 0a 0a 20 20 2f 2a 20 41  >nSrc );..  /* A
18910 6c 6c 6f 63 61 74 65 20 61 64 64 69 74 69 6f 6e  llocate addition
18920 61 6c 20 73 70 61 63 65 20 69 66 20 6e 65 65 64  al space if need
18930 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63  ed */.  if( pSrc
18940 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70 53  ->nSrc+nExtra>pS
18950 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  rc->nAlloc ){.  
18960 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
18970 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20  .    int nAlloc 
18980 3d 20 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78  = pSrc->nSrc+nEx
18990 74 72 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f  tra;.    int nGo
189a0 74 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  t;.    pNew = sq
189b0 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
189c0 62 2c 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20  b, pSrc,.       
189d0 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
189e0 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d  pSrc) + (nAlloc-
189f0 31 29 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e  1)*sizeof(pSrc->
18a00 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
18a10 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
18a20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
18a30 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
18a40 20 20 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b      return pSrc;
18a50 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20  .    }.    pSrc 
18a60 3d 20 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74  = pNew;.    nGot
18a70 20 3d 20 28 73 71 6c 69 74 65 33 44 62 4d 61 6c   = (sqlite3DbMal
18a80 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77  locSize(db, pNew
18a90 29 20 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72 63  ) - sizeof(*pSrc
18aa0 29 29 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e  ))/sizeof(pSrc->
18ab0 61 5b 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72  a[0])+1;.    pSr
18ac0 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 31 36  c->nAlloc = (u16
18ad0 29 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  )nGot;.  }..  /*
18ae0 20 4d 6f 76 65 20 65 78 69 73 74 69 6e 67 20 73   Move existing s
18af0 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d 65 20 61  lots that come a
18b00 66 74 65 72 20 74 68 65 20 6e 65 77 6c 79 20 69  fter the newly i
18b10 6e 73 65 72 74 65 64 20 73 6c 6f 74 73 0a 20 20  nserted slots.  
18b20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61  ** out of the wa
18b30 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72  y */.  for(i=pSr
18b40 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53  c->nSrc-1; i>=iS
18b50 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  tart; i--){.    
18b60 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61  pSrc->a[i+nExtra
18b70 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a  ] = pSrc->a[i];.
18b80 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63    }.  pSrc->nSrc
18b90 20 2b 3d 20 28 69 31 36 29 6e 45 78 74 72 61 3b   += (i16)nExtra;
18ba0 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20  ..  /* Zero the 
18bb0 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  newly allocated 
18bc0 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65  slots */.  memse
18bd0 74 28 26 70 53 72 63 2d 3e 61 5b 69 53 74 61 72  t(&pSrc->a[iStar
18be0 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  t], 0, sizeof(pS
18bf0 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61  rc->a[0])*nExtra
18c00 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53 74 61 72  );.  for(i=iStar
18c10 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e 45 78 74  t; i<iStart+nExt
18c20 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53  ra; i++){.    pS
18c30 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
18c40 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
18c50 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
18c60 72 20 74 6f 20 74 68 65 20 65 6e 6c 61 72 67 65  r to the enlarge
18c70 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72  d SrcList */.  r
18c80 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a  eturn pSrc;.}...
18c90 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
18ca0 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  ew table name to
18cb0 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69   the given SrcLi
18cc0 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
18cd0 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20  w SrcList if.** 
18ce0 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20  need be.  A new 
18cf0 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64  entry is created
18d00 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
18d10 65 76 65 6e 20 69 66 20 70 54 61 62 6c 65 20 69  even if pTable i
18d20 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20  s NULL..**.** A 
18d30 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72  SrcList is retur
18d40 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
18d50 74 68 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20  there is an OOM 
18d60 65 72 72 6f 72 2e 20 20 54 68 65 20 72 65 74 75  error.  The retu
18d70 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20  rned.** SrcList 
18d80 6d 69 67 68 74 20 62 65 20 74 68 65 20 73 61 6d  might be the sam
18d90 65 20 61 73 20 74 68 65 20 53 72 63 4c 69 73 74  e as the SrcList
18da0 20 74 68 61 74 20 77 61 73 20 69 6e 70 75 74 20   that was input 
18db0 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a  or it might be.*
18dc0 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66  * a new one.  If
18dd0 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f   an OOM error do
18de0 65 73 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  es occurs, then 
18df0 74 68 65 20 70 72 69 6f 72 20 76 61 6c 75 65 20  the prior value 
18e00 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74  of pList.** that
18e10 20 69 73 20 69 6e 70 75 74 20 74 6f 20 74 68 69   is input to thi
18e20 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 75 74  s routine is aut
18e30 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72 65 65 64  omatically freed
18e40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61  ..**.** If pData
18e50 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  base is not null
18e60 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
18e70 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e  the table has an
18e80 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74   optional.** dat
18e90 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69  abase name prefi
18ea0 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20  x.  Like this:  
18eb0 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22  "database.table"
18ec0 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65  .  The pDatabase
18ed0 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  .** points to th
18ee0 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
18ef0 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e   the pTable poin
18f00 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ts to the databa
18f10 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20  se name..** The 
18f20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d  SrcList.a[].zNam
18f30 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65  e field is fille
18f40 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
18f50 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68   name which migh
18f60 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70  t.** come from p
18f70 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62  Table (if pDatab
18f80 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20  ase is NULL) or 
18f90 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20  from pDatabase. 
18fa0 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d   .** SrcList.a[]
18fb0 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69  .zDatabase is fi
18fc0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
18fd0 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d  tabase name from
18fe0 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77   pTable,.** or w
18ff0 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64  ith NULL if no d
19000 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69  atabase is speci
19010 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  fied..**.** In o
19020 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63  ther words, if c
19030 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  all like this:.*
19040 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
19050 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
19060 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a  d(D,A,B,0);.**.*
19070 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61  * Then B is a ta
19080 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
19090 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
190a0 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20  s unspecified.  
190b0 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b  If called.** lik
190c0 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
190d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
190e0 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42  ListAppend(D,A,B
190f0 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,C);.**.** Then 
19100 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  C is the table n
19110 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65  ame and B is the
19120 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 20   database name. 
19130 20 49 66 20 43 20 69 73 20 64 65 66 69 6e 65 64   If C is defined
19140 0a 2a 2a 20 74 68 65 6e 20 73 6f 20 69 73 20 42  .** then so is B
19150 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
19160 73 2c 20 77 65 20 6e 65 76 65 72 20 68 61 76 65  s, we never have
19170 20 61 20 63 61 73 65 20 77 68 65 72 65 3a 0a 2a   a case where:.*
19180 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
19190 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
191a0 64 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a  d(D,A,0,C);.**.*
191b0 2a 20 42 6f 74 68 20 70 54 61 62 6c 65 20 61 6e  * Both pTable an
191c0 64 20 70 44 61 74 61 62 61 73 65 20 61 72 65 20  d pDatabase are 
191d0 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 71 75  assumed to be qu
191e0 6f 74 65 64 2e 20 20 54 68 65 79 20 61 72 65 20  oted.  They are 
191f0 64 65 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f  dequoted.** befo
19200 72 65 20 62 65 69 6e 67 20 61 64 64 65 64 20 74  re being added t
19210 6f 20 74 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a  o the SrcList..*
19220 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
19230 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
19240 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
19250 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
19260 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f  tion to notify o
19270 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  f malloc failure
19280 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  s */.  SrcList *
19290 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 41 70  pList,     /* Ap
192a0 70 65 6e 64 20 74 6f 20 74 68 69 73 20 53 72 63  pend to this Src
192b0 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74  List. NULL creat
192c0 65 73 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  es a new SrcList
192d0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
192e0 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 61 62  ble,      /* Tab
192f0 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a  le to append */.
19300 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61    Token *pDataba
19310 73 65 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  se    /* Databas
19320 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  e of the table *
19330 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  /.){.  struct Sr
19340 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
19350 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 61  m;.  assert( pDa
19360 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61  tabase==0 || pTa
19370 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61  ble!=0 );  /* Ca
19380 6e 6e 6f 74 20 68 61 76 65 20 43 20 77 69 74 68  nnot have C with
19390 6f 75 74 20 42 20 2a 2f 0a 20 20 69 66 28 20 70  out B */.  if( p
193a0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
193b0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
193c0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
193d0 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29  izeof(SrcList) )
193e0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
193f0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
19400 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
19410 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 69 73   = 1;.  }.  pLis
19420 74 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  t = sqlite3SrcLi
19430 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 4c  stEnlarge(db, pL
19440 69 73 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e  ist, 1, pList->n
19450 53 72 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  Src);.  if( db->
19460 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
19470 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
19480 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
19490 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  st);.    return 
194a0 30 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d  0;.  }.  pItem =
194b0 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
194c0 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28  ->nSrc-1];.  if(
194d0 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44   pDatabase && pD
194e0 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b  atabase->z==0 ){
194f0 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
19500 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44   0;.  }.  if( pD
19510 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20 54  atabase ){.    T
19520 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44  oken *pTemp = pD
19530 61 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61  atabase;.    pDa
19540 74 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b  tabase = pTable;
19550 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54  .    pTable = pT
19560 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  emp;.  }.  pItem
19570 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
19580 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
19590 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 70 49  b, pTable);.  pI
195a0 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
195b0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
195c0 54 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74 61 62  Token(db, pDatab
195d0 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ase);.  return p
195e0 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  List;.}../*.** A
195f0 73 73 69 67 6e 20 56 64 62 65 43 75 72 73 6f 72  ssign VdbeCursor
19600 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 73 20 74   index numbers t
19610 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  o all tables in 
19620 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69  a SrcList.*/.voi
19630 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
19640 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61  AssignCursors(Pa
19650 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
19660 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
19670 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
19680 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
19690 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c  tem;.  assert(pL
196a0 69 73 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  ist || pParse->d
196b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
196c0 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
196d0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  {.    for(i=0, p
196e0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
196f0 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
19700 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
19710 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43     if( pItem->iC
19720 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b  ursor>=0 ) break
19730 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69  ;.      pItem->i
19740 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
19750 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69  >nTab++;.      i
19760 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
19770 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
19780 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
19790 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
197a0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d   pItem->pSelect-
197b0 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  >pSrc);.      }.
197c0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
197d0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
197e0 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c  ire SrcList incl
197f0 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75  uding all its su
19800 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76  bstructure..*/.v
19810 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
19820 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
19830 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
19840 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
19850 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
19860 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
19870 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
19880 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74  eturn;.  for(pIt
19890 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
198a0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
198b0 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
198c0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
198d0 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61  e(db, pItem->zDa
198e0 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c  tabase);.    sql
198f0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
19900 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
19910 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
19920 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  db, pItem->zAlia
19930 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  s);.    sqlite3D
19940 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
19950 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71  >zIndex);.    sq
19960 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
19970 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  (db, pItem->pTab
19980 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
19990 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
199a0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  Item->pSelect);.
199b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
199c0 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
199d0 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  >pOn);.    sqlit
199e0 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
199f0 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67  b, pItem->pUsing
19a00 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
19a10 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
19a20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
19a30 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
19a40 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
19a50 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74 65   to add a new te
19a60 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  rm to the.** end
19a70 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46 52   of a growing FR
19a80 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  OM clause.  The 
19a90 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  "p" parameter is
19aa0 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20   the part of.** 
19ab0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
19ac0 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79  that has already
19ad0 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65   been constructe
19ae0 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a  d.  "p" is NULL.
19af0 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ** if this is th
19b00 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20  e first term of 
19b10 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
19b20 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61    pTable and pDa
19b30 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74 68  tabase.** are th
19b40 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
19b50 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73 65  ble and database
19b60 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52   named in the FR
19b70 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a  OM clause term..
19b80 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69 73 20  ** pDatabase is 
19b90 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74 61  NULL if the data
19ba0 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66  base name qualif
19bb0 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2d  ier is missing -
19bc0 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61   the.** usual ca
19bd0 73 65 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d  se.  If the term
19be0 20 68 61 73 20 61 20 61 6c 69 61 73 2c 20 74 68   has a alias, th
19bf0 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73  en pAlias points
19c00 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73   to the.** alias
19c10 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20   token.  If the 
19c20 74 65 72 6d 20 69 73 20 61 20 73 75 62 71 75 65  term is a subque
19c30 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65  ry, then pSubque
19c40 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c  ry is the.** SEL
19c50 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
19c60 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79 20  at the subquery 
19c70 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54  encodes.  The pT
19c80 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74  able and.** pDat
19c90 61 62 61 73 65 20 70 61 72 61 6d 65 74 65 72 73  abase parameters
19ca0 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75   are NULL for su
19cb0 62 71 75 65 72 69 65 73 2e 20 20 54 68 65 20 70  bqueries.  The p
19cc0 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a  On and pUsing.**
19cd0 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
19ce0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
19cf0 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
19d00 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52  clauses..**.** R
19d10 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c  eturn a new SrcL
19d20 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65  ist which encode
19d30 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69  s is the FROM wi
19d40 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65  th the new.** te
19d50 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63  rm added..*/.Src
19d60 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
19d70 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65  ListAppendFromTe
19d80 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rm(.  Parse *pPa
19d90 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
19da0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
19db0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
19dc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
19dd0 20 54 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f   The left part o
19de0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
19df0 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a  e already seen *
19e00 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  /.  Token *pTabl
19e10 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  e,          /* N
19e20 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
19e30 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46   to add to the F
19e40 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
19e50 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65  Token *pDatabase
19e60 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ,       /* Name 
19e70 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
19e80 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c  containing pTabl
19e90 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41  e */.  Token *pA
19ea0 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f  lias,          /
19eb0 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64  * The right-hand
19ec0 20 73 69 64 65 20 6f 66 20 74 68 65 20 41 53 20   side of the AS 
19ed0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  subexpression */
19ee0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71  .  Select *pSubq
19ef0 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20  uery,      /* A 
19f00 73 75 62 71 75 65 72 79 20 75 73 65 64 20 69 6e  subquery used in
19f10 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c   place of a tabl
19f20 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72  e name */.  Expr
19f30 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20   *pOn,          
19f40 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c      /* The ON cl
19f50 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a  ause of a join *
19f60 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69  /.  IdList *pUsi
19f70 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ng          /* T
19f80 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
19f90 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a  of a join */.){.
19fa0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
19fb0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
19fc0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
19fd0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
19fe0 21 70 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55  !p && (pOn || pU
19ff0 73 69 6e 67 29 20 29 7b 0a 20 20 20 20 73 71 6c  sing) ){.    sql
1a000 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1a010 72 73 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61  rse, "a JOIN cla
1a020 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20  use is required 
1a030 62 65 66 6f 72 65 20 25 73 22 2c 20 0a 20 20 20  before %s", .   
1a040 20 20 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a     (pOn ? "ON" :
1a050 20 22 55 53 49 4e 47 22 29 0a 20 20 20 20 29 3b   "USING").    );
1a060 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64  .    goto append
1a070 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d  _from_error;.  }
1a080 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72  .  p = sqlite3Sr
1a090 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20  cListAppend(db, 
1a0a0 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61 74 61  p, pTable, pData
1a0b0 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  base);.  if( p==
1a0c0 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 53  0 || NEVER(p->nS
1a0d0 72 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 67 6f  rc==0) ){.    go
1a0e0 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65  to append_from_e
1a0f0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 49 74 65  rror;.  }.  pIte
1a100 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72  m = &p->a[p->nSr
1a110 63 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  c-1];.  assert( 
1a120 70 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20 69  pAlias!=0 );.  i
1a130 66 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a  f( pAlias->n ){.
1a140 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61      pItem->zAlia
1a150 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  s = sqlite3NameF
1a160 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c  romToken(db, pAl
1a170 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  ias);.  }.  pIte
1a180 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75  m->pSelect = pSu
1a190 62 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d  bquery;.  pItem-
1a1a0 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49  >pOn = pOn;.  pI
1a1b0 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55  tem->pUsing = pU
1a1c0 73 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70  sing;.  return p
1a1d0 3b 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f  ;.. append_from_
1a1e0 65 72 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28  error:.  assert(
1a1f0 20 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   p==0 );.  sqlit
1a200 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1a210 20 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33   pOn);.  sqlite3
1a220 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
1a230 20 70 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69   pUsing);.  sqli
1a240 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
1a250 64 62 2c 20 70 53 75 62 71 75 65 72 79 29 3b 0a  db, pSubquery);.
1a260 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1a270 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45  *.** Add an INDE
1a280 58 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e  XED BY or NOT IN
1a290 44 45 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20  DEXED clause to 
1a2a0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
1a2b0 79 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d  y added .** elem
1a2c0 65 6e 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63  ent of the sourc
1a2d0 65 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  e-list passed as
1a2e0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1a2f0 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
1a300 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65  lite3SrcListInde
1a310 78 65 64 42 79 28 50 61 72 73 65 20 2a 70 50 61  xedBy(Parse *pPa
1a320 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c  rse, SrcList *p,
1a330 20 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64   Token *pIndexed
1a340 42 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  By){.  assert( p
1a350 49 6e 64 65 78 65 64 42 79 21 3d 30 20 29 3b 0a  IndexedBy!=0 );.
1a360 20 20 69 66 28 20 70 20 26 26 20 41 4c 57 41 59    if( p && ALWAY
1a370 53 28 70 2d 3e 6e 53 72 63 3e 30 29 20 29 7b 0a  S(p->nSrc>0) ){.
1a380 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
1a390 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
1a3a0 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31   &p->a[p->nSrc-1
1a3b0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
1a3c0 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  Item->notIndexed
1a3d0 3d 3d 30 20 26 26 20 70 49 74 65 6d 2d 3e 7a 49  ==0 && pItem->zI
1a3e0 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ndex==0 );.    i
1a3f0 66 28 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e  f( pIndexedBy->n
1a400 3d 3d 31 20 26 26 20 21 70 49 6e 64 65 78 65 64  ==1 && !pIndexed
1a410 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f  By->z ){.      /
1a420 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45 58 45 44  * A "NOT INDEXED
1a430 22 20 63 6c 61 75 73 65 20 77 61 73 20 73 75 70  " clause was sup
1a440 70 6c 69 65 64 2e 20 53 65 65 20 70 61 72 73 65  plied. See parse
1a450 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  .y .      ** con
1a460 73 74 72 75 63 74 20 22 69 6e 64 65 78 65 64 5f  struct "indexed_
1a470 6f 70 74 22 20 66 6f 72 20 64 65 74 61 69 6c 73  opt" for details
1a480 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 74 65 6d  . */.      pItem
1a490 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 31  ->notIndexed = 1
1a4a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a4b0 20 20 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78     pItem->zIndex
1a4c0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1a4d0 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
1a4e0 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79 29 3b  db, pIndexedBy);
1a4f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1a500 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e  .** When buildin
1a510 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75  g up a FROM clau
1a520 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  se in the parser
1a530 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  , the join opera
1a540 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61  tor.** is initia
1a550 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f 20  lly attached to 
1a560 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
1a570 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65 20  .  But the code 
1a580 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70  generator.** exp
1a590 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ects the join op
1a5a0 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20  erator to be on 
1a5b0 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
1a5c0 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
1a5d0 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a  .** Shifts all j
1a5e0 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72  oin operators fr
1a5f0 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
1a600 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46   for an entire F
1a610 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a  ROM.** clause..*
1a620 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75  *.** Example: Su
1a630 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69  ppose the join i
1a640 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
1a650 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20 6e  **           A n
1a660 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69  atural cross joi
1a670 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  n B.**.** The op
1a680 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72  erator is "natur
1a690 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20  al cross join". 
1a6a0 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65   The A and B ope
1a6b0 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64  rands are stored
1a6c0 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61  .** in p->a[0] a
1a6d0 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70  nd p->a[1], resp
1a6e0 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70  ectively.  The p
1a6f0 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20  arser initially 
1a700 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70  stores the.** op
1a710 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20  erator with A.  
1a720 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69  This routine shi
1a730 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f  fts that operato
1a740 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a  r over to B..*/.
1a750 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
1a760 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65  istShiftJoinType
1a770 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20  (SrcList *p){.  
1a780 69 66 28 20 70 20 26 26 20 70 2d 3e 61 20 29 7b  if( p && p->a ){
1a790 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1a7a0 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b  for(i=p->nSrc-1;
1a7b0 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
1a7c0 20 20 70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e 74 79    p->a[i].jointy
1a7d0 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 6a  pe = p->a[i-1].j
1a7e0 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20  ointype;.    }. 
1a7f0 20 20 20 70 2d 3e 61 5b 30 5d 2e 6a 6f 69 6e 74     p->a[0].joint
1a800 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ype = 0;.  }.}..
1a810 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72  /*.** Begin a tr
1a820 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
1a830 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72  d sqlite3BeginTr
1a840 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
1a850 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70  *pParse, int typ
1a860 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
1a870 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
1a880 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74  int i;..  assert
1a890 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20  ( pParse!=0 );. 
1a8a0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1a8b0 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
1a8c0 30 20 29 3b 0a 2f 2a 20 20 69 66 28 20 64 62 2d  0 );./*  if( db-
1a8d0 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[0].pBt==0 )
1a8e0 20 72 65 74 75 72 6e 3b 20 2a 2f 0a 20 20 69 66   return; */.  if
1a8f0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1a900 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
1a910 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
1a920 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b  BEGIN", 0, 0) ){
1a930 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1a940 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1a950 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1a960 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72 6e   if( !v ) return
1a970 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b  ;.  if( type!=TK
1a980 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20  _DEFERRED ){.   
1a990 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
1a9a0 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
1a9b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a9c0 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  p2(v, OP_Transac
1a9d0 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d  tion, i, (type==
1a9e0 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29  TK_EXCLUSIVE)+1)
1a9f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1aa00 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
1aa10 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  i);.    }.  }.  
1aa20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1aa30 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
1aa40 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  it, 0, 0);.}../*
1aa50 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61  .** Commit a tra
1aa60 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
1aa70 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72   sqlite3CommitTr
1aa80 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
1aa90 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
1aaa0 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
1aab0 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *v;..  assert( p
1aac0 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62  Parse!=0 );.  db
1aad0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1aae0 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
1aaf0 3b 0a 2f 2a 20 20 69 66 28 20 64 62 2d 3e 61 44  ;./*  if( db->aD
1ab00 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65  b[0].pBt==0 ) re
1ab10 74 75 72 6e 3b 20 2a 2f 0a 20 20 69 66 28 20 73  turn; */.  if( s
1ab20 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1ab30 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
1ab40 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d  RANSACTION, "COM
1ab50 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20  MIT", 0, 0) ){. 
1ab60 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1ab70 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1ab80 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
1ab90 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
1aba0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1abb0 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
1abc0 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  1, 0);.  }.}../*
1abd0 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74  .** Rollback a t
1abe0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
1abf0 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  id sqlite3Rollba
1ac00 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  ckTransaction(Pa
1ac10 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
1ac20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
1ac30 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72  dbe *v;..  asser
1ac40 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
1ac50 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
1ac60 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  b;.  assert( db!
1ac70 3d 30 20 29 3b 0a 2f 2a 20 20 69 66 28 20 64 62  =0 );./*  if( db
1ac80 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20  ->aDb[0].pBt==0 
1ac90 29 20 72 65 74 75 72 6e 3b 20 2a 2f 0a 20 20 69  ) return; */.  i
1aca0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1acb0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1acc0 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
1acd0 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30  "ROLLBACK", 0, 0
1ace0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
1acf0 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74  .  }.  v = sqlit
1ad00 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1ad10 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
1ad20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ad30 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  Op2(v, OP_AutoCo
1ad40 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d  mmit, 1, 1);.  }
1ad50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1ad60 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1ad70 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
1ad80 77 68 65 6e 20 69 74 20 70 61 72 73 65 73 20 61  when it parses a
1ad90 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65 61   command to crea
1ada0 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20 6f  te,.** release o
1adb0 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53 51  r rollback an SQ
1adc0 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f  L savepoint. .*/
1add0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 61 76  .void sqlite3Sav
1ade0 65 70 6f 69 6e 74 28 50 61 72 73 65 20 2a 70 50  epoint(Parse *pP
1adf0 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f  arse, int op, To
1ae00 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63  ken *pName){.  c
1ae10 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c  har *zName = sql
1ae20 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1ae30 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e  n(pParse->db, pN
1ae40 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
1ae50 65 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  e ){.    Vdbe *v
1ae60 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1ae70 65 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64  e(pParse);.#ifnd
1ae80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1ae90 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
1aea0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
1aeb0 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d 20  ar * const az[] 
1aec0 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20 22 52 45  = { "BEGIN", "RE
1aed0 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43  LEASE", "ROLLBAC
1aee0 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74  K" };.    assert
1aef0 28 20 21 53 41 56 45 50 4f 49 4e 54 5f 42 45 47  ( !SAVEPOINT_BEG
1af00 49 4e 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f  IN && SAVEPOINT_
1af10 52 45 4c 45 41 53 45 3d 3d 31 20 26 26 20 53 41  RELEASE==1 && SA
1af20 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1af30 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ==2 );.#endif.  
1af40 20 20 69 66 28 20 21 76 20 7c 7c 20 73 71 6c 69    if( !v || sqli
1af50 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1af60 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 41 56 45  rse, SQLITE_SAVE
1af70 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a  POINT, az[op], z
1af80 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  Name, 0) ){.    
1af90 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1afa0 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d  pParse->db, zNam
1afb0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
1afc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1afd0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1afe0 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f   OP_Savepoint, o
1aff0 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20  p, 0, 0, zName, 
1b000 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
1b010 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
1b020 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74  ure the TEMP dat
1b030 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e  abase is open an
1b040 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  d available for 
1b050 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  use.  Return.** 
1b060 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
1b070 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79  rors.  Leave any
1b080 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
1b090 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
1b0a0 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
1b0b0 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
1b0c0 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70  atabase(Parse *p
1b0d0 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
1b0e0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1b0f0 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44  db;.  if( db->aD
1b100 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21  b[1].pBt==0 && !
1b110 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
1b120 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
1b130 20 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20     Btree *pBt;. 
1b140 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1b150 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20 20 20  int flags = .   
1b160 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1b170 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20  EN_READWRITE |. 
1b180 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1b190 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
1b1a0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1b1b0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a  PEN_EXCLUSIVE |.
1b1c0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1b1d0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
1b1e0 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  OSE |.          
1b1f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1b200 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  _DB;..    rc = s
1b210 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
1b220 30 2c 20 64 62 2c 20 26 70 42 74 2c 20 30 2c 20  0, db, &pBt, 0, 
1b230 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  flags);.    if( 
1b240 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1b250 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
1b260 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1b270 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61  unable to open a
1b280 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
1b290 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66  ase ".        "f
1b2a0 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ile for storing 
1b2b0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
1b2c0 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ");.      pParse
1b2d0 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
1b2e0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1b2f0 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  .    db->aDb[1].
1b300 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 61  pBt = pBt;.    a
1b310 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31  ssert( db->aDb[1
1b320 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ].pSchema );.   
1b330 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   if( SQLITE_NOME
1b340 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53  M==sqlite3BtreeS
1b350 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c 20  etPageSize(pBt, 
1b360 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
1b370 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20 20  , -1, 0) ){.    
1b380 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
1b390 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  ed = 1;.      re
1b3a0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1b3b0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1b3c0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1b3d0 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 77  VDBE code that w
1b3e0 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20 73  ill verify the s
1b3f0 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e 64  chema cookie and
1b400 20 73 74 61 72 74 0a 2a 2a 20 61 20 72 65 61 64   start.** a read
1b410 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
1b420 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61 62   all named datab
1b430 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ase files..**.**
1b440 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   It is important
1b450 20 74 68 61 74 20 61 6c 6c 20 73 63 68 65 6d 61   that all schema
1b460 20 63 6f 6f 6b 69 65 73 20 62 65 20 76 65 72 69   cookies be veri
1b470 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20  fied and all.** 
1b480 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1b490 73 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66  s be started bef
1b4a0 6f 72 65 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  ore anything els
1b4b0 65 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a 20  e happens in.** 
1b4c0 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
1b4d0 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74  .  But this rout
1b4e0 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  ine can be calle
1b4f0 64 20 61 66 74 65 72 20 6d 75 63 68 20 6f 74 68  d after much oth
1b500 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20 62  er.** code has b
1b510 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e 20 20  een generated.  
1b520 53 6f 20 68 65 72 65 20 69 73 20 77 68 61 74 20  So here is what 
1b530 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  we do:.**.** The
1b540 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73   first time this
1b550 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1b560 65 64 2c 20 77 65 20 63 6f 64 65 20 61 6e 20 4f  ed, we code an O
1b570 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20 77  P_Goto that.** w
1b580 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73 75  ill jump to a su
1b590 62 72 6f 75 74 69 6e 65 20 61 74 20 74 68 65 20  broutine at the 
1b5a0 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 67 72  end of the progr
1b5b0 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a 20  am.  Then we.** 
1b5c0 72 65 63 6f 72 64 20 65 76 65 72 79 20 64 61 74  record every dat
1b5d0 61 62 61 73 65 20 74 68 61 74 20 6e 65 65 64 73  abase that needs
1b5e0 20 69 74 73 20 73 63 68 65 6d 61 20 76 65 72 69   its schema veri
1b5f0 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70  fied in the.** p
1b600 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73  Parse->cookieMas
1b610 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74 65 72 2c  k field.  Later,
1b620 20 61 66 74 65 72 20 61 6c 6c 20 6f 74 68 65 72   after all other
1b630 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 0a 2a   code has been.*
1b640 2a 20 67 65 6e 65 72 61 74 65 64 2c 20 74 68 65  * generated, the
1b650 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
1b660 20 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69 65   does the cookie
1b670 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20 61   verifications a
1b680 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20 74 68 65  nd.** starts the
1b690 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 77 69   transactions wi
1b6a0 6c 6c 20 62 65 20 63 6f 64 65 64 20 61 6e 64 20  ll be coded and 
1b6b0 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20 76  the OP_Goto P2 v
1b6c0 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  alue.** will be 
1b6d0 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f  made to point to
1b6e0 20 74 68 61 74 20 73 75 62 72 6f 75 74 69 6e 65   that subroutine
1b6f0 2e 20 20 54 68 65 20 67 65 6e 65 72 61 74 69 6f  .  The generatio
1b700 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b  n of the.** cook
1b710 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20  ie verification 
1b720 73 75 62 72 6f 75 74 69 6e 65 20 63 6f 64 65 20  subroutine code 
1b730 68 61 70 70 65 6e 73 20 69 6e 20 73 71 6c 69 74  happens in sqlit
1b740 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29  e3FinishCoding()
1b750 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30  ..**.** If iDb<0
1b760 20 74 68 65 6e 20 63 6f 64 65 20 74 68 65 20 4f   then code the O
1b770 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f  P_Goto only - do
1b780 6e 27 74 20 73 65 74 20 66 6c 61 67 20 74 6f 20  n't set flag to 
1b790 76 65 72 69 66 79 20 74 68 65 0a 2a 2a 20 73 63  verify the.** sc
1b7a0 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74 61  hema on any data
1b7b0 62 61 73 65 73 2e 20 20 54 68 69 73 20 63 61 6e  bases.  This can
1b7c0 20 62 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69   be used to posi
1b7d0 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74 6f  tion the OP_Goto
1b7e0 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74 68 65  .** early in the
1b7f0 20 63 6f 64 65 2c 20 62 65 66 6f 72 65 20 77 65   code, before we
1b800 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64 61 74   know if any dat
1b810 61 62 61 73 65 20 74 61 62 6c 65 73 20 77 69 6c  abase tables wil
1b820 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f  l be used..*/.vo
1b830 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  id sqlite3CodeVe
1b840 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65  rifySchema(Parse
1b850 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44   *pParse, int iD
1b860 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  b){.  Parse *pTo
1b870 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
1b880 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
1b890 61 72 73 65 29 3b 0a 0a 20 20 69 66 28 20 70 54  arse);..  if( pT
1b8a0 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 47  oplevel->cookieG
1b8b0 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64  oto==0 ){.    Vd
1b8c0 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
1b8d0 65 74 56 64 62 65 28 70 54 6f 70 6c 65 76 65 6c  etVdbe(pToplevel
1b8e0 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
1b8f0 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
1b900 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
1b910 69 66 20 74 68 65 72 65 20 77 61 73 20 61 20 70  if there was a p
1b920 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20  rior error */.  
1b930 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f    pToplevel->coo
1b940 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65  kieGoto = sqlite
1b950 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b960 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 2b 31 3b  P_Goto, 0, 0)+1;
1b970 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3e 3d  .  }.  if( iDb>=
1b980 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1b990 20 2a 64 62 20 3d 20 70 54 6f 70 6c 65 76 65 6c   *db = pToplevel
1b9a0 2d 3e 64 62 3b 0a 20 20 20 20 69 6e 74 20 6d 61  ->db;.    int ma
1b9b0 73 6b 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  sk;..    assert(
1b9c0 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
1b9d0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
1b9e0 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20  aDb[iDb].pBt!=0 
1b9f0 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20  || iDb==1 );.   
1ba00 20 61 73 73 65 72 74 28 20 69 44 62 3c 53 51 4c   assert( iDb<SQL
1ba10 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
1ba20 2b 32 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20 3d  +2 );.    mask =
1ba30 20 31 3c 3c 69 44 62 3b 0a 20 20 20 20 69 66 28   1<<iDb;.    if(
1ba40 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f   (pToplevel->coo
1ba50 6b 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d  kieMask & mask)=
1ba60 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 54 6f 70  =0 ){.      pTop
1ba70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73  level->cookieMas
1ba80 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  k |= mask;.     
1ba90 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b   pToplevel->cook
1baa0 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64  ieValue[iDb] = d
1bab0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
1bac0 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b  ema->schema_cook
1bad0 69 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  ie;.      if( !O
1bae0 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
1baf0 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
1bb00 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
1bb10 61 74 61 62 61 73 65 28 70 54 6f 70 6c 65 76 65  atabase(pTopleve
1bb20 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
1bb30 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
1bb40 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
1bb50 65 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20  e that prepares 
1bb60 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65  for doing an ope
1bb70 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d  ration that.** m
1bb80 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20  ight change the 
1bb90 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
1bba0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61  This routine sta
1bbb0 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61  rts a new transa
1bbc0 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20  ction if we are 
1bbd0 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74 68  not already with
1bbe0 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  in.** a transact
1bbf0 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20  ion.  If we are 
1bc00 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 61  already within a
1bc10 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
1bc20 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a  en a checkpoint.
1bc30 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74 68 65  ** is set if the
1bc40 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61   setStatement pa
1bc50 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e  rameter is true.
1bc60 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73    A checkpoint s
1bc70 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20  hould.** be set 
1bc80 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  for operations t
1bc90 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28  hat might fail (
1bca0 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61  due to a constra
1bcb0 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20  int) part of.** 
1bcc0 74 68 65 20 77 61 79 20 74 68 72 6f 75 67 68 20  the way through 
1bcd0 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e  and which will n
1bce0 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65  eed to undo some
1bcf0 20 77 72 69 74 65 73 20 77 69 74 68 6f 75 74 20   writes without 
1bd00 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c  having to.** rol
1bd10 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20  lback the whole 
1bd20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f  transaction.  Fo
1bd30 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65  r operations whe
1bd40 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  re all constrain
1bd50 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65  ts.** can be che
1bd60 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  cked before any 
1bd70 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
1bd80 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1bd90 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a  , it is never.**
1bda0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e   necessary to un
1bdb0 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20 74  do a write and t
1bdc0 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68  he checkpoint sh
1bdd0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e  ould not be set.
1bde0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1bdf0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
1be00 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
1be10 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d  e, int setStatem
1be20 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  ent, int iDb){. 
1be30 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
1be40 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
1be50 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
1be60 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56  ;.  sqlite3CodeV
1be70 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
1be80 73 65 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f 70  se, iDb);.  pTop
1be90 6c 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b  level->writeMask
1bea0 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 70 54   |= 1<<iDb;.  pT
1beb0 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69  oplevel->isMulti
1bec0 57 72 69 74 65 20 7c 3d 20 73 65 74 53 74 61 74  Write |= setStat
1bed0 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ement;.}../*.** 
1bee0 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  Indicate that th
1bef0 65 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72 72  e statement curr
1bf00 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
1bf10 74 72 75 63 74 69 6f 6e 20 6d 69 67 68 74 20 77  truction might w
1bf20 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61  rite.** more tha
1bf30 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28 65 78 61  n one entry (exa
1bf40 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f  mple: deleting o
1bf50 6e 65 20 72 6f 77 20 74 68 65 6e 20 69 6e 73 65  ne row then inse
1bf60 72 74 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a  rting another,.*
1bf70 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74  * inserting mult
1bf80 69 70 6c 65 20 72 6f 77 73 20 69 6e 20 61 20 74  iple rows in a t
1bf90 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74 69  able, or inserti
1bfa0 6e 67 20 61 20 72 6f 77 20 61 6e 64 20 69 6e 64  ng a row and ind
1bfb0 65 78 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20  ex entries.).** 
1bfc0 49 66 20 61 6e 20 61 62 6f 72 74 20 6f 63 63 75  If an abort occu
1bfd0 72 73 20 61 66 74 65 72 20 73 6f 6d 65 20 6f 66  rs after some of
1bfe0 20 74 68 65 73 65 20 77 72 69 74 65 73 20 68 61   these writes ha
1bff0 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68  ve completed, th
1c000 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65  en it will.** be
1c010 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e   necessary to un
1c020 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 64  do the completed
1c030 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64   writes..*/.void
1c040 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69   sqlite3MultiWri
1c050 74 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  te(Parse *pParse
1c060 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
1c070 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
1c080 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
1c090 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  rse);.  pTopleve
1c0a0 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  l->isMultiWrite 
1c0b0 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54  = 1;.}../* .** T
1c0c0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
1c0d0 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
1c0e0 74 69 6e 65 20 69 66 20 69 73 20 64 69 73 63 6f  tine if is disco
1c0f0 76 65 72 73 20 74 68 61 74 20 69 74 20 69 73 0a  vers that it is.
1c100 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  ** possible to a
1c110 62 6f 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74  bort a statement
1c120 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65   prior to comple
1c130 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20  tion.  In order 
1c140 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74  to .** perform t
1c150 68 69 73 20 61 62 6f 72 74 20 77 69 74 68 6f 75  his abort withou
1c160 74 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65  t corrupting the
1c170 20 64 61 74 61 62 61 73 65 2c 20 77 65 20 6e 65   database, we ne
1c180 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75  ed to make.** su
1c190 72 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74  re that the stat
1c1a0 65 6d 65 6e 74 20 69 73 20 70 72 6f 74 65 63 74  ement is protect
1c1b0 65 64 20 62 79 20 61 20 73 74 61 74 65 6d 65 6e  ed by a statemen
1c1c0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  t transaction..*
1c1d0 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79  *.** Technically
1c1e0 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74  , we only need t
1c1f0 6f 20 73 65 74 20 74 68 65 20 6d 61 79 41 62 6f  o set the mayAbo
1c200 72 74 20 66 6c 61 67 20 69 66 20 74 68 65 0a 2a  rt flag if the.*
1c210 2a 20 69 73 4d 75 6c 74 69 57 72 69 74 65 20 66  * isMultiWrite f
1c220 6c 61 67 20 77 61 73 20 70 72 65 76 69 6f 75 73  lag was previous
1c230 6c 79 20 73 65 74 2e 20 20 54 68 65 72 65 20 69  ly set.  There i
1c240 73 20 61 20 74 69 6d 65 20 64 65 70 65 6e 64 65  s a time depende
1c250 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74 68 61 74  ncy.** such that
1c260 20 74 68 65 20 61 62 6f 72 74 20 6d 75 73 74 20   the abort must 
1c270 6f 63 63 75 72 20 61 66 74 65 72 20 74 68 65 20  occur after the 
1c280 6d 75 6c 74 69 77 72 69 74 65 2e 20 20 54 68 69  multiwrite.  Thi
1c290 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20  s makes.** some 
1c2a0 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c  statements invol
1c2b0 76 69 6e 67 20 74 68 65 20 52 45 50 4c 41 43 45  ving the REPLACE
1c2c0 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   conflict resolu
1c2d0 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a  tion algorithm.*
1c2e0 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65 20 66 61  * go a little fa
1c2f0 73 74 65 72 2e 20 20 42 75 74 20 74 61 6b 69 6e  ster.  But takin
1c300 67 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  g advantage of t
1c310 68 69 73 20 74 69 6d 65 20 64 65 70 65 6e 64 65  his time depende
1c320 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20  ncy.** makes it 
1c330 6d 6f 72 65 20 64 69 66 66 69 63 75 6c 74 20 74  more difficult t
1c340 6f 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65  o prove that the
1c350 20 63 6f 64 65 20 69 73 20 63 6f 72 72 65 63 74   code is correct
1c360 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75   (in .** particu
1c370 6c 61 72 2c 20 69 74 20 70 72 65 76 65 6e 74 73  lar, it prevents
1c380 20 75 73 20 66 72 6f 6d 20 77 72 69 74 69 6e 67   us from writing
1c390 20 61 6e 20 65 66 66 65 63 74 69 76 65 0a 2a 2a   an effective.**
1c3a0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1c3b0 6f 66 20 73 71 6c 69 74 65 33 41 73 73 65 72 74  of sqlite3Assert
1c3c0 4d 61 79 41 62 6f 72 74 28 29 29 20 61 6e 64 20  MayAbort()) and 
1c3d0 73 6f 20 77 65 20 68 61 76 65 20 63 68 6f 73 65  so we have chose
1c3e0 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68 65  n.** to take the
1c3f0 20 73 61 66 65 20 72 6f 75 74 65 20 61 6e 64 20   safe route and 
1c400 73 6b 69 70 20 74 68 65 20 6f 70 74 69 6d 69 7a  skip the optimiz
1c410 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
1c420 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 50  qlite3MayAbort(P
1c430 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
1c440 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
1c450 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
1c460 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
1c470 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d  ;.  pToplevel->m
1c480 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a  ayAbort = 1;.}..
1c490 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
1c4a0 5f 48 61 6c 74 20 74 68 61 74 20 63 61 75 73 65  _Halt that cause
1c4b0 73 20 74 68 65 20 76 64 62 65 20 74 6f 20 72 65  s the vdbe to re
1c4c0 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
1c4d0 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72  ONSTRAINT.** err
1c4e0 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72 20  or. The onError 
1c4f0 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d  parameter determ
1c500 69 6e 65 73 20 77 68 69 63 68 20 28 69 66 20 61  ines which (if a
1c510 6e 79 29 20 6f 66 20 74 68 65 20 73 74 61 74 65  ny) of the state
1c520 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63  ment.** and/or c
1c530 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
1c540 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
1c550 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  k..*/.void sqlit
1c560 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74  e3HaltConstraint
1c570 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c580 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 63 68 61  int onError, cha
1c590 72 20 2a 70 34 2c 20 69 6e 74 20 70 34 74 79 70  r *p4, int p4typ
1c5a0 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
1c5b0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1c5c0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 6f 6e  Parse);.  if( on
1c5d0 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20  Error==OE_Abort 
1c5e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61  ){.    sqlite3Ma
1c5f0 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a  yAbort(pParse);.
1c600 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
1c610 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61  eAddOp4(v, OP_Ha
1c620 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  lt, SQLITE_CONST
1c630 52 41 49 4e 54 2c 20 6f 6e 45 72 72 6f 72 2c 20  RAINT, onError, 
1c640 30 2c 20 70 34 2c 20 70 34 74 79 70 65 29 3b 0a  0, p4, p4type);.
1c650 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
1c660 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65 78 20  o see if pIndex 
1c670 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  uses the collati
1c680 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
1c690 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72  l.  Return.** tr
1c6a0 75 65 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e  ue if it does an
1c6b0 64 20 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f  d false if it do
1c6c0 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64  es not..*/.#ifnd
1c6d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
1c6e0 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e  EINDEX.static in
1c6f0 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68  t collationMatch
1c700 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f  (const char *zCo
1c710 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ll, Index *pInde
1c720 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  x){.  int i;.  a
1c730 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20  ssert( zColl!=0 
1c740 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1c750 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pIndex->nColumn;
1c760 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74   i++){.    const
1c770 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65   char *z = pInde
1c780 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20  x->azColl[i];.  
1c790 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29    assert( z!=0 )
1c7a0 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c  ;.    if( 0==sql
1c7b0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a  ite3StrICmp(z, z
1c7c0 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72  Coll) ){.      r
1c7d0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1c7e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1c7f0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
1c800 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
1c810 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68 61  ices of pTab tha
1c820 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  t use the collat
1c830 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
1c840 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d  ll..** If pColl=
1c850 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74  =0 then recomput
1c860 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
1c870 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65   pTab..*/.#ifnde
1c880 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
1c890 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69  INDEX.static voi
1c8a0 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50  d reindexTable(P
1c8b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
1c8c0 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20  ble *pTab, char 
1c8d0 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20  const *zColl){. 
1c8e0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
1c8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c900 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  An index associa
1c910 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f  ted with pTab */
1c920 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70  ..  for(pIndex=p
1c930 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e  Tab->pIndex; pIn
1c940 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64  dex; pIndex=pInd
1c950 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ex->pNext){.    
1c960 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20  if( zColl==0 || 
1c970 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a  collationMatch(z
1c980 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b  Coll, pIndex) ){
1c990 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d  .      int iDb =
1c9a0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
1c9b0 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
1c9c0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
1c9d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
1c9e0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
1c9f0 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
1ca00 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
1ca10 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
1ca20 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29  rse, pIndex, -1)
1ca30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
1ca40 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  ndif../*.** Reco
1ca50 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
1ca60 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  s of all tables 
1ca70 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  in all databases
1ca80 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e   where the.** in
1ca90 64 69 63 65 73 20 75 73 65 20 74 68 65 20 63 6f  dices use the co
1caa0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1cab0 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c   pColl.  If pCol
1cac0 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
1cad0 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63  ute.** all indic
1cae0 65 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a  es everywhere..*
1caf0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1cb00 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
1cb10 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65  atic void reinde
1cb20 78 44 61 74 61 62 61 73 65 73 28 50 61 72 73 65  xDatabases(Parse
1cb30 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 63   *pParse, char c
1cb40 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20  onst *zColl){.  
1cb50 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
1cb60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1cb70 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
1cb80 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
1cb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cba0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1cbb0 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  e index number *
1cbc0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
1cbd0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
1cbe0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1cbf0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
1cc00 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20  HashElem *k;    
1cc10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1cc20 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1cc30 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f  tables in pDb */
1cc40 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
1cc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cc60 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65  * A table in the
1cc70 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20   database */..  
1cc80 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64  for(iDb=0, pDb=d
1cc90 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e  b->aDb; iDb<db->
1cca0 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b  nDb; iDb++, pDb+
1ccb0 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
1ccc0 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f  pDb!=0 );.    fo
1ccd0 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(k=sqliteHashFi
1cce0 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  rst(&pDb->pSchem
1ccf0 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b  a->tblHash);  k;
1cd00 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   k=sqliteHashNex
1cd10 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61  t(k)){.      pTa
1cd20 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69  b = (Table*)sqli
1cd30 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20  teHashData(k);. 
1cd40 20 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c       reindexTabl
1cd50 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
1cd60 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  zColl);.    }.  
1cd70 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
1cd80 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1cd90 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58 20  for the REINDEX 
1cda0 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20  command..**.**  
1cdb0 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 20        REINDEX   
1cdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdd0 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a           -- 1.**
1cde0 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
1cdf0 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20   <collation>    
1ce00 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a             -- 2.
1ce10 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
1ce20 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f  X  ?<database>.?
1ce30 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20  <tablename>  -- 
1ce40 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  3.**        REIN
1ce50 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
1ce60 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d  .?<indexname>  -
1ce70 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31  - 4.**.** Form 1
1ce80 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69   causes all indi
1ce90 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63  ces in all attac
1cea0 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f  hed databases to
1ceb0 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20   be rebuilt..** 
1cec0 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20  Form 2 rebuilds 
1ced0 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61  all indices in a
1cee0 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74 68 61  ll databases tha
1cef0 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a  t use the named.
1cf00 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  ** collating fun
1cf10 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20  ction.  Forms 3 
1cf20 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74 68  and 4 rebuild th
1cf30 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72  e named index or
1cf40 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20   all.** indices 
1cf50 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1cf60 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e  the named table.
1cf70 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1cf80 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
1cf90 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e  void sqlite3Rein
1cfa0 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
1cfb0 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  e, Token *pName1
1cfc0 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29  , Token *pName2)
1cfd0 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
1cfe0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1cff0 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
1d000 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e  uence to be rein
1d010 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a  dexed, or NULL *
1d020 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
1d030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d040 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62  /* Name of a tab
1d050 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20  le or index */. 
1d060 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1d070 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1d080 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
1d090 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  base */.  Table 
1d0a0 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
1d0b0 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
1d0c0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1d0d0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
1d0e0 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
1d0f0 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
1d100 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
1d110 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  ab */.  int iDb;
1d120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d130 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1d140 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
1d150 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1d160 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
1d170 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1d180 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
1d190 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d    Token *pObjNam
1d1a0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1d1b0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
1d1c0 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62  le or index to b
1d1d0 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a  e reindexed */..
1d1e0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
1d1f0 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
1d200 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1d210 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
1d220 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61  r message.  ** a
1d230 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  nd code in pPars
1d240 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
1d250 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  L. */.  if( SQLI
1d260 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
1d270 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
1d280 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
1d290 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65    }..  if( pName
1d2a0 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e  1==0 ){.    rein
1d2b0 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61  dexDatabases(pPa
1d2c0 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rse, 0);.    ret
1d2d0 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  urn;.  }else if(
1d2e0 20 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30   NEVER(pName2==0
1d2f0 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d  ) || pName2->z==
1d300 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
1d310 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74  Coll;.    assert
1d320 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20  ( pName1->z );. 
1d330 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     zColl = sqlit
1d340 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1d350 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
1d360 65 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43  e1);.    if( !zC
1d370 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  oll ) return;.  
1d380 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1d390 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
1d3a0 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c   ENC(db), zColl,
1d3b0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   0);.    if( pCo
1d3c0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e  ll ){.      rein
1d3d0 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61  dexDatabases(pPa
1d3e0 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  rse, zColl);.   
1d3f0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1d400 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  (db, zColl);.   
1d410 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
1d420 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1d430 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  ee(db, zColl);. 
1d440 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
1d450 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
1d460 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
1d470 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29  ame2, &pObjName)
1d480 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20  ;.  if( iDb<0 ) 
1d490 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71  return;.  z = sq
1d4a0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1d4b0 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29  en(db, pObjName)
1d4c0 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
1d4d0 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64  eturn;.  zDb = d
1d4e0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
1d4f0 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  e;.  pTab = sqli
1d500 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
1d510 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20   z, zDb);.  if( 
1d520 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e  pTab ){.    rein
1d530 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c  dexTable(pParse,
1d540 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73   pTab, 0);.    s
1d550 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1d560 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   z);.    return;
1d570 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20  .  }.  pIndex = 
1d580 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
1d590 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20  (db, z, zDb);.  
1d5a0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1d5b0 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  , z);.  if( pInd
1d5c0 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ex ){.    sqlite
1d5d0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
1d5e0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
1d5f0 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
1d600 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
1d610 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29  rse, pIndex, -1)
1d620 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1d630 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  }.  sqlite3Error
1d640 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
1d650 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20  ble to identify 
1d660 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65  the object to be
1d670 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a   reindexed");.}.
1d680 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
1d690 74 75 72 6e 20 61 20 64 79 6e 61 6d 69 63 6c 79  turn a dynamicly
1d6a0 20 61 6c 6c 6f 63 61 74 65 64 20 4b 65 79 49 6e   allocated KeyIn
1d6b0 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
1d6c0 74 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a  t can be used.**
1d6d0 20 77 69 74 68 20 4f 50 5f 4f 70 65 6e 52 65 61   with OP_OpenRea
1d6e0 64 20 6f 72 20 4f 50 5f 4f 70 65 6e 57 72 69 74  d or OP_OpenWrit
1d6f0 65 20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61  e to access data
1d700 62 61 73 65 20 69 6e 64 65 78 20 70 49 64 78 2e  base index pIdx.
1d710 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
1d720 73 66 75 6c 2c 20 61 20 70 6f 69 6e 74 65 72 20  sful, a pointer 
1d730 74 6f 20 74 68 65 20 6e 65 77 20 73 74 72 75 63  to the new struc
1d740 74 75 72 65 20 69 73 20 72 65 74 75 72 6e 65 64  ture is returned
1d750 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  . In this case.*
1d760 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  * the caller is 
1d770 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
1d780 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 44  calling sqlite3D
1d790 62 46 72 65 65 28 64 62 2c 20 29 20 6f 6e 20 74  bFree(db, ) on t
1d7a0 68 65 20 72 65 74 75 72 6e 65 64 20 0a 2a 2a 20  he returned .** 
1d7b0 70 6f 69 6e 74 65 72 2e 20 49 66 20 61 6e 20 65  pointer. If an e
1d7c0 72 72 6f 72 20 6f 63 63 75 72 73 20 28 6f 75 74  rror occurs (out
1d7d0 20 6f 66 20 6d 65 6d 6f 72 79 20 6f 72 20 6d 69   of memory or mi
1d7e0 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20  ssing collation 
1d7f0 0a 2a 2a 20 73 65 71 75 65 6e 63 65 29 2c 20 4e  .** sequence), N
1d800 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
1d810 61 6e 64 20 74 68 65 20 73 74 61 74 65 20 6f 66  and the state of
1d820 20 70 50 61 72 73 65 20 75 70 64 61 74 65 64 20   pParse updated 
1d830 74 6f 20 72 65 66 6c 65 63 74 0a 2a 2a 20 74 68  to reflect.** th
1d840 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 4b 65 79 49  e error..*/.KeyI
1d850 6e 66 6f 20 2a 73 71 6c 69 74 65 33 49 6e 64 65  nfo *sqlite3Inde
1d860 78 4b 65 79 69 6e 66 6f 28 50 61 72 73 65 20 2a  xKeyinfo(Parse *
1d870 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
1d880 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Idx){.  int i;. 
1d890 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78   int nCol = pIdx
1d8a0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74  ->nColumn;.  int
1d8b0 20 6e 42 79 74 65 73 20 3d 20 73 69 7a 65 6f 66   nBytes = sizeof
1d8c0 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 43 6f  (KeyInfo) + (nCo
1d8d0 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c  l-1)*sizeof(Coll
1d8e0 53 65 71 2a 29 20 2b 20 6e 43 6f 6c 3b 0a 20 20  Seq*) + nCol;.  
1d8f0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1d900 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49  arse->db;.  KeyI
1d910 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 28 4b 65 79  nfo *pKey = (Key
1d920 49 6e 66 6f 20 2a 29 73 71 6c 69 74 65 33 44 62  Info *)sqlite3Db
1d930 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
1d940 42 79 74 65 73 29 3b 0a 0a 20 20 69 66 28 20 70  Bytes);..  if( p
1d950 4b 65 79 20 29 7b 0a 20 20 20 20 70 4b 65 79 2d  Key ){.    pKey-
1d960 3e 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  >db = pParse->db
1d970 3b 0a 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72  ;.    pKey->aSor
1d980 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a 29 26  tOrder = (u8 *)&
1d990 28 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f  (pKey->aColl[nCo
1d9a0 6c 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l]);.    assert(
1d9b0 20 26 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64   &pKey->aSortOrd
1d9c0 65 72 5b 6e 43 6f 6c 5d 3d 3d 26 28 28 28 75 38  er[nCol]==&(((u8
1d9d0 20 2a 29 70 4b 65 79 29 5b 6e 42 79 74 65 73 5d   *)pKey)[nBytes]
1d9e0 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ) );.    for(i=0
1d9f0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
1da00 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
1da10 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  l = pIdx->azColl
1da20 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  [i];.      asser
1da30 74 28 20 7a 43 6f 6c 6c 20 29 3b 0a 20 20 20 20  t( zColl );.    
1da40 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d    pKey->aColl[i]
1da50 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
1da60 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1da70 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 70 4b  zColl);.      pK
1da80 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ey->aSortOrder[i
1da90 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ] = pIdx->aSortO
1daa0 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  rder[i];.    }. 
1dab0 20 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c 64 20     pKey->nField 
1dac0 3d 20 28 75 31 36 29 6e 43 6f 6c 3b 0a 20 20 7d  = (u16)nCol;.  }
1dad0 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
1dae0 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  nErr ){.    sqli
1daf0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4b  te3DbFree(db, pK
1db00 65 79 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20  ey);.    pKey = 
1db10 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1db20 70 4b 65 79 3b 0a 7d 0a                          pKey;.}.