/ Hex Artifact Content
Login

Artifact 30012cb6c42ed63ee28df6dd189815365354d5d5:


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 61 73 73 65 72 74 28 20   *v;..  assert( 
0f40: 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65  pParse->pTopleve
0f50: 6c 3d 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  l==0 );.  db = p
0f60: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0f70: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
0f80: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
0f90: 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  ( pParse->nested
0fa0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
0fb0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
0fc0: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65  return;..  /* Be
0fd0: 67 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e  gin by generatin
0fe0: 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69  g some terminati
0ff0: 6f 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20 65  on code at the e
1000: 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76  nd of the.  ** v
1010: 64 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f  dbe program.  */
1020: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1030: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1040: 20 61 73 73 65 72 74 28 20 21 70 50 61 72 73 65   assert( !pParse
1050: 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a  ->isMultiWrite .
1060: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
1070: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
1080: 6f 72 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d  ort(v, pParse->m
1090: 61 79 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28  ayAbort));.  if(
10a0: 20 76 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28   v ){.    while(
10b0: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
10c0: 74 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 76 2c  tePriorOpcode(v,
10d0: 20 4f 50 5f 43 6c 6f 73 65 29 20 29 7b 7d 0a 20   OP_Close) ){}. 
10e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10f0: 64 4f 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29  dOp0(v, OP_Halt)
1100: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;..    /* The co
1110: 6f 6b 69 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69  okie mask contai
1120: 6e 73 20 6f 6e 65 20 62 69 74 20 66 6f 72 20 65  ns one bit for e
1130: 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ach database fil
1140: 65 20 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a 20 28  e open..    ** (
1150: 42 69 74 20 30 20 69 73 20 66 6f 72 20 6d 61 69  Bit 0 is for mai
1160: 6e 2c 20 62 69 74 20 31 20 69 73 20 66 6f 72 20  n, bit 1 is for 
1170: 74 65 6d 70 2c 20 61 6e 64 20 73 6f 20 66 6f 72  temp, and so for
1180: 74 68 2e 29 20 20 42 69 74 73 20 61 72 65 0a 20  th.)  Bits are. 
1190: 20 20 20 2a 2a 20 73 65 74 20 66 6f 72 20 65 61     ** set for ea
11a0: 63 68 20 64 61 74 61 62 61 73 65 20 74 68 61 74  ch database that
11b0: 20 69 73 20 75 73 65 64 2e 20 20 47 65 6e 65 72   is used.  Gener
11c0: 61 74 65 20 63 6f 64 65 20 74 6f 20 73 74 61 72  ate code to star
11d0: 74 20 61 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  t a.    ** trans
11e0: 61 63 74 69 6f 6e 20 6f 6e 20 65 61 63 68 20 75  action on each u
11f0: 73 65 64 20 64 61 74 61 62 61 73 65 20 61 6e 64  sed database and
1200: 20 74 6f 20 76 65 72 69 66 79 20 74 68 65 20 73   to verify the s
1210: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 20  chema cookie.   
1220: 20 2a 2a 20 6f 6e 20 65 61 63 68 20 75 73 65 64   ** on each used
1230: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a   database..    *
1240: 2f 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  /.    if( db->ma
1250: 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26  llocFailed==0 &&
1260: 20 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65   (pParse->cookie
1270: 4d 61 73 6b 20 7c 7c 20 70 50 61 72 73 65 2d 3e  Mask || pParse->
1280: 70 43 6f 6e 73 74 45 78 70 72 29 20 29 7b 0a 20  pConstExpr) ){. 
1290: 20 20 20 20 20 79 44 62 4d 61 73 6b 20 6d 61 73       yDbMask mas
12a0: 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  k;.      int iDb
12b0: 2c 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72  , i;.      asser
12c0: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  t( sqlite3VdbeGe
12d0: 74 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64  tOp(v, 0)->opcod
12e0: 65 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20  e==OP_Init );.  
12f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
1300: 75 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20  umpHere(v, 0);. 
1310: 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30 2c 20       for(iDb=0, 
1320: 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64 62 2d 3e  mask=1; iDb<db->
1330: 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69  nDb; mask<<=1, i
1340: 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  Db++){.        i
1350: 66 28 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73  f( (mask & pPars
1360: 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d  e->cookieMask)==
1370: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1380: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1390: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
13a0: 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
13b0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
13c0: 28 76 2c 0a 20 20 20 20 20 20 20 20 20 20 4f 50  (v,.          OP
13d0: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20  _Transaction,   
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20   /* Opcode */.  
1400: 20 20 20 20 20 20 20 20 69 44 62 2c 20 20 20 20          iDb,    
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31             /* P1
1430: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 28 6d   */.          (m
1440: 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 77 72  ask & pParse->wr
1450: 69 74 65 4d 61 73 6b 29 21 3d 30 2c 20 20 20 20  iteMask)!=0,    
1460: 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 20 20   /* P2 */.      
1470: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b      pParse->cook
1480: 69 65 56 61 6c 75 65 5b 69 44 62 5d 2c 20 20 20  ieValue[iDb],   
1490: 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a         /* P3 */.
14a0: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44            db->aD
14b0: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
14c0: 69 47 65 6e 65 72 61 74 69 6f 6e 20 20 2f 2a 20  iGeneration  /* 
14d0: 50 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 3b  P4 */.        );
14e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
14f0: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 20  >init.busy==0 ) 
1500: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1510: 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 20 20 20  eP5(v, 1);.     
1520: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1530: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1540: 42 4c 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  BLE.      for(i=
1550: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74  0; i<pParse->nVt
1560: 61 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20  abLock; i++){.  
1570: 20 20 20 20 20 20 63 68 61 72 20 2a 76 74 61 62        char *vtab
1580: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
1590: 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20  e3GetVTable(db, 
15a0: 70 50 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f  pParse->apVtabLo
15b0: 63 6b 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ck[i]);.        
15c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15d0: 34 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20  4(v, OP_VBegin, 
15e0: 30 2c 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50  0, 0, 0, vtab, P
15f0: 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d  4_VTAB);.      }
1600: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
1610: 56 74 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65  VtabLock = 0;.#e
1620: 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f  ndif..      /* O
1630: 6e 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b  nce all the cook
1640: 69 65 73 20 68 61 76 65 20 62 65 65 6e 20 76 65  ies have been ve
1650: 72 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73  rified and trans
1660: 61 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20  actions opened, 
1670: 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e  .      ** obtain
1680: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61   the required ta
1690: 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20  ble-locks. This 
16a0: 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73  is a no-op unles
16b0: 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  s the .      ** 
16c0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61  shared-cache fea
16d0: 74 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  ture is enabled.
16e0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16f0: 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  codeTableLocks(p
1700: 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f  Parse);..      /
1710: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79  * Initialize any
1720: 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64   AUTOINCREMENT d
1730: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 72  ata structures r
1740: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a  equired..      *
1750: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41  /.      sqlite3A
1760: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69  utoincrementBegi
1770: 6e 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  n(pParse);..    
1780: 20 20 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61    /* Code consta
1790: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  nt expressions t
17a0: 68 61 74 20 77 68 65 72 65 20 66 61 63 74 6f 72  hat where factor
17b0: 65 64 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20  ed out of inner 
17c0: 6c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69  loops */.      i
17d0: 66 28 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73  f( pParse->pCons
17e0: 74 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  tExpr ){.       
17f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d   ExprList *pEL =
1800: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1810: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61  xpr;.        pPa
1820: 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74  rse->okConstFact
1830: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  or = 0;.        
1840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e  for(i=0; i<pEL->
1850: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1860: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1870: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1880: 45 4c 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  EL->a[i].pExpr, 
1890: 70 45 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e  pEL->a[i].u.iCon
18a0: 73 74 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20  stExprReg);.    
18b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
18c0: 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c       /* Finally,
18d0: 20 6a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68   jump back to th
18e0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
18f0: 68 65 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f  he executable co
1900: 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  de. */.      sql
1910: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1920: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 31 29  , OP_Goto, 0, 1)
1930: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1940: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1950: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1960: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1970: 0a 20 20 69 66 28 20 76 20 26 26 20 41 4c 57 41  .  if( v && ALWA
1980: 59 53 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  YS(pParse->nErr=
1990: 3d 30 29 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  =0) && !db->mall
19a0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
19b0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
19c0: 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 30 20 29  iCacheLevel==0 )
19d0: 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 73 20 61  ;  /* Disables a
19e0: 6e 64 20 72 65 2d 65 6e 61 62 6c 65 73 20 6d 61  nd re-enables ma
19f0: 74 63 68 20 2a 2f 0a 20 20 20 20 2f 2a 20 41 20  tch */.    /* A 
1a00: 6d 69 6e 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 63  minimum of one c
1a10: 75 72 73 6f 72 20 69 73 20 72 65 71 75 69 72 65  ursor is require
1a20: 64 20 69 66 20 61 75 74 6f 69 6e 63 72 65 6d 65  d if autoincreme
1a30: 6e 74 20 69 73 20 75 73 65 64 0a 20 20 20 20 2a  nt is used.    *
1a40: 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b 61 36    See ticket [a6
1a50: 39 36 33 37 39 63 31 66 30 38 38 36 36 5d 20 2a  96379c1f08866] *
1a60: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  /.    if( pParse
1a70: 2d 3e 70 41 69 6e 63 21 3d 30 20 26 26 20 70 50  ->pAinc!=0 && pP
1a80: 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 30 20 29 20  arse->nTab==0 ) 
1a90: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 31  pParse->nTab = 1
1aa0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1ab0: 65 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70 50  eMakeReady(v, pP
1ac0: 61 72 73 65 29 3b 0a 20 20 20 20 70 50 61 72 73  arse);.    pPars
1ad0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44  e->rc = SQLITE_D
1ae0: 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ONE;.    pParse-
1af0: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 30  >colNamesSet = 0
1b00: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1b10: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
1b20: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
1b30: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30  pParse->nTab = 0
1b40: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
1b50: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
1b60: 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72  nSet = 0;.  pPar
1b70: 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20  se->nVar = 0;.  
1b80: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1b90: 73 6b 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  sk = 0;.}../*.**
1ba0: 20 52 75 6e 20 74 68 65 20 70 61 72 73 65 72 20   Run the parser 
1bb0: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
1bc0: 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79 20 69  or recursively i
1bd0: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72  n order to gener
1be0: 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20  ate.** code for 
1bf0: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
1c00: 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65  t given onto the
1c10: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72   end of the pPar
1c20: 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75  se context.** cu
1c30: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
1c40: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65  nstruction.  Whe
1c50: 6e 20 74 68 65 20 70 61 72 73 65 72 20 69 73 20  n the parser is 
1c60: 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a  run recursively.
1c70: 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68 65  ** this way, the
1c80: 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69   final OP_Halt i
1c90: 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61  s not appended a
1ca0: 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c  nd other initial
1cb0: 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66  ization.** and f
1cc0: 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70  inalization step
1cd0: 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65  s are omitted be
1ce0: 63 61 75 73 65 20 74 68 6f 73 65 20 61 72 65 20  cause those are 
1cf0: 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a  handling by the.
1d00: 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72  ** outermost par
1d10: 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65  ser..**.** Not e
1d20: 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73  verything is nes
1d30: 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63  table.  This fac
1d40: 69 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e 65  ility is designe
1d50: 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49  d to permit.** I
1d60: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61  NSERT, UPDATE, a
1d70: 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74  nd DELETE operat
1d80: 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c  ions against SQL
1d90: 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65  ITE_MASTER.  Use
1da0: 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20  .** care if you 
1db0: 64 65 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f  decide to try to
1dc0: 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   use this routin
1dd0: 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  e for some other
1de0: 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f   purposes..*/.vo
1df0: 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  id sqlite3Nested
1e00: 50 61 72 73 65 28 50 61 72 73 65 20 2a 70 50 61  Parse(Parse *pPa
1e10: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
1e20: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
1e30: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
1e40: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68  char *zSql;.  ch
1e50: 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
1e60: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1e70: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 20 64   pParse->db;.# d
1e80: 65 66 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28  efine SAVE_SZ  (
1e90: 73 69 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20  sizeof(Parse) - 
1ea0: 6f 66 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e  offsetof(Parse,n
1eb0: 56 61 72 29 29 0a 20 20 63 68 61 72 20 73 61 76  Var)).  char sav
1ec0: 65 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a  eBuf[SAVE_SZ];..
1ed0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1ee0: 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  rr ) return;.  a
1ef0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
1f00: 65 73 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20  ested<10 );  /* 
1f10: 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f  Nesting should o
1f20: 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65  nly be of limite
1f30: 64 20 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f  d depth */.  va_
1f40: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
1f50: 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c  t);.  zSql = sql
1f60: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c  ite3VMPrintf(db,
1f70: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
1f80: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69   va_end(ap);.  i
1f90: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
1fa0: 20 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41    return;   /* A
1fb0: 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   malloc must hav
1fc0: 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a  e failed */.  }.
1fd0: 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64    pParse->nested
1fe0: 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76  ++;.  memcpy(sav
1ff0: 65 42 75 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e  eBuf, &pParse->n
2000: 56 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20  Var, SAVE_SZ);. 
2010: 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d   memset(&pParse-
2020: 3e 6e 56 61 72 2c 20 30 2c 20 53 41 56 45 5f 53  >nVar, 0, SAVE_S
2030: 5a 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 75 6e  Z);.  sqlite3Run
2040: 50 61 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a  Parser(pParse, z
2050: 53 71 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  Sql, &zErrMsg);.
2060: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2070: 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  db, zErrMsg);.  
2080: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2090: 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70  , zSql);.  memcp
20a0: 79 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  y(&pParse->nVar,
20b0: 20 73 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53   saveBuf, SAVE_S
20c0: 5a 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65  Z);.  pParse->ne
20d0: 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  sted--;.}../*.**
20e0: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
20f0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
2100: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
2110: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
2120: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
2130: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
2140: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
2150: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
2160: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
2170: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
2180: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
2190: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
21a0: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49  t found..**.** I
21b0: 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30  f zDatabase is 0
21c0: 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  , all databases 
21d0: 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72  are searched for
21e0: 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74   the table and t
21f0: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63  he.** first matc
2200: 68 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65  hing table is re
2210: 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65  turned.  (No che
2220: 63 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63  cking for duplic
2230: 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d  ate table.** nam
2240: 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68  es is done.)  Th
2250: 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69  e search order i
2260: 73 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  s TEMP first, th
2270: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
2280: 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64  y.** auxiliary d
2290: 61 74 61 62 61 73 65 73 20 61 64 64 65 64 20 75  atabases added u
22a0: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
22b0: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53  command..**.** S
22c0: 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c  ee also sqlite3L
22d0: 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f  ocateTable()..*/
22e0: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46  .Table *sqlite3F
22f0: 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33  indTable(sqlite3
2300: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
2310: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
2320: 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b  har *zDatabase){
2330: 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b  .  Table *p = 0;
2340: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
2350: 6e 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28  nName;.  assert(
2360: 20 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 6e   zName!=0 );.  n
2370: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
2380: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
2390: 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20   /* All mutexes 
23a0: 61 72 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  are required for
23b0: 20 73 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20   schema access. 
23c0: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f   Make sure we ho
23d0: 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73  ld them. */.  as
23e0: 73 65 72 74 28 20 7a 44 61 74 61 62 61 73 65 21  sert( zDatabase!
23f0: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72  =0 || sqlite3Btr
2400: 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65  eeHoldsAllMutexe
2410: 73 28 64 62 29 20 29 3b 0a 20 20 66 6f 72 28 69  s(db) );.  for(i
2420: 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c  =OMIT_TEMPDB; i<
2430: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
2440: 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29     int j = (i<2)
2450: 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a   ? i^1 : i;   /*
2460: 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66   Search TEMP bef
2470: 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20  ore MAIN */.    
2480: 69 66 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30  if( zDatabase!=0
2490: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
24a0: 6d 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62  mp(zDatabase, db
24b0: 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20  ->aDb[j].zName) 
24c0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
24d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
24e0: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
24f0: 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20  b, j, 0) );.    
2500: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  p = sqlite3HashF
2510: 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e  ind(&db->aDb[j].
2520: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
2530: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  , zName, nName);
2540: 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65  .    if( p ) bre
2550: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
2560: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63   p;.}../*.** Loc
2570: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
2580: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
2590: 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72   describes a par
25a0: 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
25b0: 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20  .** table given 
25c0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74  the name of that
25d0: 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69   table and (opti
25e0: 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65  onally) the name
25f0: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
2600: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
2610: 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
2620: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
2630: 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65  und.  Also leave
2640: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73   an.** error mes
2650: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
2660: 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54  zErrMsg..**.** T
2670: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
2680: 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
2690: 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69  ne and sqlite3Fi
26a0: 6e 64 54 61 62 6c 65 28 29 20 69 73 20 74 68 61  ndTable() is tha
26b0: 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  t this.** routin
26c0: 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f  e leaves an erro
26d0: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
26e0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65  rse->zErrMsg whe
26f0: 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e  re.** sqlite3Fin
2700: 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f  dTable() does no
2710: 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  t..*/.Table *sql
2720: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
2730: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2740: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e  ,         /* con
2750: 74 65 78 74 20 69 6e 20 77 68 69 63 68 20 74 6f  text in which to
2760: 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73 20 2a   report errors *
2770: 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20  /.  int isView, 
2780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2790: 75 65 20 69 66 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ue if looking fo
27a0: 72 20 61 20 56 49 45 57 20 72 61 74 68 65 72 20  r a VIEW rather 
27b0: 74 68 61 6e 20 61 20 54 41 42 4c 45 20 2a 2f 0a  than a TABLE */.
27c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
27d0: 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame,     /* Name
27e0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65   of the table we
27f0: 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72   are looking for
2800: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2810: 20 2a 7a 44 62 61 73 65 20 20 20 20 20 2f 2a 20   *zDbase     /* 
2820: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
2830: 62 61 73 65 2e 20 20 4d 69 67 68 74 20 62 65 20  base.  Might be 
2840: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  NULL */.){.  Tab
2850: 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65 61  le *p;..  /* Rea
2860: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
2870: 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72  chema. If an err
2880: 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
2890: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
28a0: 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20  e.  ** and code 
28b0: 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
28c0: 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  turn NULL. */.  
28d0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
28e0: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
28f0: 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
2900: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
2910: 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64   p = sqlite3Find
2920: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
2930: 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29  , zName, zDbase)
2940: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
2950: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2960: 7a 4d 73 67 20 3d 20 69 73 56 69 65 77 20 3f 20  zMsg = isView ? 
2970: 22 6e 6f 20 73 75 63 68 20 76 69 65 77 22 20 3a  "no such view" :
2980: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 22   "no such table"
2990: 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 61 73 65  ;.    if( zDbase
29a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
29b0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
29c0: 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a  , "%s: %s.%s", z
29d0: 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61  Msg, zDbase, zNa
29e0: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
29f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2a00: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
2a10: 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 4e  s: %s", zMsg, zN
2a20: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
2a30: 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
2a40: 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  ema = 1;.  }.  r
2a50: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
2a60: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62  * Locate the tab
2a70: 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  le identified by
2a80: 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   *p..**.** This 
2a90: 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
2aa0: 75 6e 64 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  und sqlite3Locat
2ab0: 65 54 61 62 6c 65 28 29 2e 20 54 68 65 20 64 69  eTable(). The di
2ac0: 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
2ad0: 0a 2a 2a 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  .** sqlite3Locat
2ae0: 65 54 61 62 6c 65 28 29 20 61 6e 64 20 74 68 69  eTable() and thi
2af0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68  s function is th
2b00: 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  at this function
2b10: 20 72 65 73 74 72 69 63 74 73 0a 2a 2a 20 74 68   restricts.** th
2b20: 65 20 73 65 61 72 63 68 20 74 6f 20 73 63 68 65  e search to sche
2b30: 6d 61 20 28 70 2d 3e 70 53 63 68 65 6d 61 29 20  ma (p->pSchema) 
2b40: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  if it is not NUL
2b50: 4c 2e 20 70 2d 3e 70 53 63 68 65 6d 61 20 6d 61  L. p->pSchema ma
2b60: 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c  y be.** non-NULL
2b70: 20 69 66 20 69 74 20 69 73 20 70 61 72 74 20 6f   if it is part o
2b80: 66 20 61 20 76 69 65 77 20 6f 72 20 74 72 69 67  f a view or trig
2b90: 67 65 72 20 70 72 6f 67 72 61 6d 20 64 65 66 69  ger program defi
2ba0: 6e 69 74 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73  nition. See.** s
2bb0: 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
2bc0: 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  () for details..
2bd0: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
2be0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d  3LocateTableItem
2bf0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2c00: 65 2c 20 0a 20 20 69 6e 74 20 69 73 56 69 65 77  e, .  int isView
2c10: 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  , .  struct SrcL
2c20: 69 73 74 5f 69 74 65 6d 20 2a 70 0a 29 7b 0a 20  ist_item *p.){. 
2c30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2c40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
2c50: 53 63 68 65 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e  Schema==0 || p->
2c60: 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 29 3b 0a  zDatabase==0 );.
2c70: 20 20 69 66 28 20 70 2d 3e 70 53 63 68 65 6d 61    if( p->pSchema
2c80: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 20   ){.    int iDb 
2c90: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
2ca0: 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
2cb0: 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  b, p->pSchema);.
2cc0: 20 20 20 20 7a 44 62 20 3d 20 70 50 61 72 73 65      zDb = pParse
2cd0: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
2ce0: 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Name;.  }else{. 
2cf0: 20 20 20 7a 44 62 20 3d 20 70 2d 3e 7a 44 61 74     zDb = p->zDat
2d00: 61 62 61 73 65 3b 0a 20 20 7d 0a 20 20 72 65 74  abase;.  }.  ret
2d10: 75 72 6e 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  urn sqlite3Locat
2d20: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  eTable(pParse, i
2d30: 73 56 69 65 77 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  sView, p->zName,
2d40: 20 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   zDb);.}../*.** 
2d50: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
2d60: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
2d70: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a  hat describes .*
2d80: 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  * a particular i
2d90: 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e  ndex given the n
2da0: 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65  ame of that inde
2db0: 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d  x.** and the nam
2dc0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2dd0: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
2de0: 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65  the index..** Re
2df0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
2e00: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
2e10: 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c   zDatabase is 0,
2e20: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61   all databases a
2e30: 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  re searched for 
2e40: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64  the.** table and
2e50: 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
2e60: 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65 74  ing index is ret
2e70: 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63  urned.  (No chec
2e80: 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c  king.** for dupl
2e90: 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65  icate index name
2ea0: 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65  s is done.)  The
2eb0: 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73   search order is
2ec0: 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20  .** TEMP first, 
2ed0: 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20  then MAIN, then 
2ee0: 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61  any auxiliary da
2ef0: 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a  tabases added.**
2f00: 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43   using the ATTAC
2f10: 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e  H command..*/.In
2f20: 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  dex *sqlite3Find
2f30: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
2f40: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
2f50: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
2f60: 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20   *zDb){.  Index 
2f70: 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  *p = 0;.  int i;
2f80: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73  .  int nName = s
2f90: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2fa0: 4e 61 6d 65 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20  Name);.  /* All 
2fb0: 6d 75 74 65 78 65 73 20 61 72 65 20 72 65 71 75  mutexes are requ
2fc0: 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20  ired for schema 
2fd0: 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 75  access.  Make su
2fe0: 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e  re we hold them.
2ff0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 44   */.  assert( zD
3000: 62 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 42  b!=0 || sqlite3B
3010: 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65  treeHoldsAllMute
3020: 78 65 73 28 64 62 29 20 29 3b 0a 20 20 66 6f 72  xes(db) );.  for
3030: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
3040: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
3050: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
3060: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f  2) ? i^1 : i;  /
3070: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
3080: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
3090: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
30a0: 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53   = db->aDb[j].pS
30b0: 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72  chema;.    asser
30c0: 74 28 20 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  t( pSchema );.  
30d0: 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c    if( zDb && sql
30e0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
30f0: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d   db->aDb[j].zNam
3100: 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
3110: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
3120: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
3130: 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20  d(db, j, 0) );. 
3140: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
3150: 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d  shFind(&pSchema-
3160: 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  >idxHash, zName,
3170: 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   nName);.    if(
3180: 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a   p ) break;.  }.
3190: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
31a0: 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68 65  *.** Reclaim the
31b0: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
31c0: 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74  an index.*/.stat
31d0: 69 63 20 76 6f 69 64 20 66 72 65 65 49 6e 64 65  ic void freeInde
31e0: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  x(sqlite3 *db, I
31f0: 6e 64 65 78 20 2a 70 29 7b 0a 23 69 66 6e 64 65  ndex *p){.#ifnde
3200: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e  f SQLITE_OMIT_AN
3210: 41 4c 59 5a 45 0a 20 20 73 71 6c 69 74 65 33 44  ALYZE.  sqlite3D
3220: 65 6c 65 74 65 49 6e 64 65 78 53 61 6d 70 6c 65  eleteIndexSample
3230: 73 28 64 62 2c 20 70 29 3b 0a 23 65 6e 64 69 66  s(db, p);.#endif
3240: 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 7c 7c 20  .  if( db==0 || 
3250: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
3260: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4b 65 79  ==0 ) sqlite3Key
3270: 49 6e 66 6f 55 6e 72 65 66 28 70 2d 3e 70 4b 65  InfoUnref(p->pKe
3280: 79 49 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74 65  yInfo);.  sqlite
3290: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
32a0: 70 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  p->pPartIdxWhere
32b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
32c0: 65 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66  ee(db, p->zColAf
32d0: 66 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 73 52  f);.  if( p->isR
32e0: 65 73 69 7a 65 64 20 29 20 73 71 6c 69 74 65 33  esized ) sqlite3
32f0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a  DbFree(db, p->az
3300: 43 6f 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  Coll);.  sqlite3
3310: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
3320: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ../*.** For the 
3330: 69 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49 64  index called zId
3340: 78 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20 66  xName which is f
3350: 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61  ound in the data
3360: 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c  base iDb,.** unl
3370: 69 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20 66  ike that index f
3380: 72 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74 68  rom its Table th
3390: 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  en remove the in
33a0: 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  dex from.** the 
33b0: 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
33c0: 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d 65   and free all me
33d0: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
33e0: 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
33f0: 74 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f  th the index..*/
3400: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c  .void sqlite3Unl
3410: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65  inkAndDeleteInde
3420: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  x(sqlite3 *db, i
3430: 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68  nt iDb, const ch
3440: 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20  ar *zIdxName){. 
3450: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
3460: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 48 61 73    int len;.  Has
3470: 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73 73  h *pHash;..  ass
3480: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
3490: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
34a0: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48 61  iDb, 0) );.  pHa
34b0: 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  sh = &db->aDb[iD
34c0: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  b].pSchema->idxH
34d0: 61 73 68 3b 0a 20 20 6c 65 6e 20 3d 20 73 71 6c  ash;.  len = sql
34e0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 64  ite3Strlen30(zId
34f0: 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78  xName);.  pIndex
3500: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
3510: 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64 78  sert(pHash, zIdx
3520: 4e 61 6d 65 2c 20 6c 65 6e 2c 20 30 29 3b 0a 20  Name, len, 0);. 
3530: 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e 64   if( ALWAYS(pInd
3540: 65 78 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ex) ){.    if( p
3550: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70  Index->pTable->p
3560: 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b  Index==pIndex ){
3570: 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
3580: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20  Table->pIndex = 
3590: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
35a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35b0: 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20  Index *p;.      
35c0: 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f 6e  /* Justification
35d0: 20 6f 66 20 41 4c 57 41 59 53 28 29 3b 20 20 54   of ALWAYS();  T
35e0: 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65  he index must be
35f0: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 0a   on the list of.
3600: 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73        ** indices
3610: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 20 3d 20 70  . */.      p = p
3620: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70  Index->pTable->p
3630: 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69  Index;.      whi
3640: 6c 65 28 20 41 4c 57 41 59 53 28 70 29 20 26 26  le( ALWAYS(p) &&
3650: 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65   p->pNext!=pInde
3660: 78 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78  x ){ p = p->pNex
3670: 74 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41  t; }.      if( A
3680: 4c 57 41 59 53 28 70 20 26 26 20 70 2d 3e 70 4e  LWAYS(p && p->pN
3690: 65 78 74 3d 3d 70 49 6e 64 65 78 29 20 29 7b 0a  ext==pIndex) ){.
36a0: 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
36b0: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
36c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
36d0: 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64 62      freeIndex(db
36e0: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20  , pIndex);.  }. 
36f0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
3700: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
3710: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f  es;.}../*.** Loo
3720: 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 69  k through the li
3730: 73 74 20 6f 66 20 6f 70 65 6e 20 64 61 74 61 62  st of open datab
3740: 61 73 65 20 66 69 6c 65 73 20 69 6e 20 64 62 2d  ase files in db-
3750: 3e 61 44 62 5b 5d 20 61 6e 64 20 69 66 0a 2a 2a  >aDb[] and if.**
3760: 20 61 6e 79 20 68 61 76 65 20 62 65 65 6e 20 63   any have been c
3770: 6c 6f 73 65 64 2c 20 72 65 6d 6f 76 65 20 74 68  losed, remove th
3780: 65 6d 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  em from the list
3790: 2e 20 20 52 65 61 6c 6c 6f 63 61 74 65 20 74 68  .  Reallocate th
37a0: 65 0a 2a 2a 20 64 62 2d 3e 61 44 62 5b 5d 20 73  e.** db->aDb[] s
37b0: 74 72 75 63 74 75 72 65 20 74 6f 20 61 20 73 6d  tructure to a sm
37c0: 61 6c 6c 65 72 20 73 69 7a 65 2c 20 69 66 20 70  aller size, if p
37d0: 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45  ossible..**.** E
37e0: 6e 74 72 79 20 30 20 28 74 68 65 20 22 6d 61 69  ntry 0 (the "mai
37f0: 6e 22 20 64 61 74 61 62 61 73 65 29 20 61 6e 64  n" database) and
3800: 20 65 6e 74 72 79 20 31 20 28 74 68 65 20 22 74   entry 1 (the "t
3810: 65 6d 70 22 20 64 61 74 61 62 61 73 65 29 0a 2a  emp" database).*
3820: 2a 20 61 72 65 20 6e 65 76 65 72 20 63 61 6e 64  * are never cand
3830: 69 64 61 74 65 73 20 66 6f 72 20 62 65 69 6e 67  idates for being
3840: 20 63 6f 6c 6c 61 70 73 65 64 2e 0a 2a 2f 0a 76   collapsed..*/.v
3850: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61  oid sqlite3Colla
3860: 70 73 65 44 61 74 61 62 61 73 65 41 72 72 61 79  pseDatabaseArray
3870: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
3880: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72   int i, j;.  for
3890: 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44  (i=j=2; i<db->nD
38a0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  b; i++){.    str
38b0: 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64  uct Db *pDb = &d
38c0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
38d0: 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29  f( pDb->pBt==0 )
38e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
38f0: 62 46 72 65 65 28 64 62 2c 20 70 44 62 2d 3e 7a  bFree(db, pDb->z
3900: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62  Name);.      pDb
3910: 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ->zName = 0;.   
3920: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
3930: 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29   }.    if( j<i )
3940: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  {.      db->aDb[
3950: 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b  j] = db->aDb[i];
3960: 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a  .    }.    j++;.
3970: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64 62    }.  memset(&db
3980: 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62  ->aDb[j], 0, (db
3990: 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28  ->nDb-j)*sizeof(
39a0: 64 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20  db->aDb[j]));.  
39b0: 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69  db->nDb = j;.  i
39c0: 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26  f( db->nDb<=2 &&
39d0: 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44   db->aDb!=db->aD
39e0: 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d  bStatic ){.    m
39f0: 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61  emcpy(db->aDbSta
3a00: 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a  tic, db->aDb, 2*
3a10: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30  sizeof(db->aDb[0
3a20: 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ]));.    sqlite3
3a30: 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61  DbFree(db, db->a
3a40: 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Db);.    db->aDb
3a50: 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
3a60: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
3a70: 65 73 65 74 20 74 68 65 20 73 63 68 65 6d 61 20  eset the schema 
3a80: 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
3a90: 20 61 74 20 69 6e 64 65 78 20 69 44 62 2e 20 20   at index iDb.  
3aa0: 41 6c 73 6f 20 72 65 73 65 74 20 74 68 65 0a 2a  Also reset the.*
3ab0: 2a 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 0a 2a  * TEMP schema..*
3ac0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
3ad0: 73 65 74 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c  setOneSchema(sql
3ae0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
3af0: 62 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20  b){.  Db *pDb;. 
3b00: 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d   assert( iDb<db-
3b10: 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 43 61  >nDb );..  /* Ca
3b20: 73 65 20 31 3a 20 20 52 65 73 65 74 20 74 68 65  se 1:  Reset the
3b30: 20 73 69 6e 67 6c 65 20 73 63 68 65 6d 61 20 69   single schema i
3b40: 64 65 6e 74 69 66 69 65 64 20 62 79 20 69 44 62  dentified by iDb
3b50: 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62 2d   */.  pDb = &db-
3b60: 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 61 73 73  >aDb[iDb];.  ass
3b70: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
3b80: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
3b90: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 61 73 73  iDb, 0) );.  ass
3ba0: 65 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d  ert( pDb->pSchem
3bb0: 61 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  a!=0 );.  sqlite
3bc0: 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62  3SchemaClear(pDb
3bd0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 20 20 2f  ->pSchema);..  /
3be0: 2a 20 49 66 20 61 6e 79 20 64 61 74 61 62 61 73  * If any databas
3bf0: 65 20 6f 74 68 65 72 20 74 68 61 6e 20 54 45 4d  e other than TEM
3c00: 50 20 69 73 20 72 65 73 65 74 2c 20 74 68 65 6e  P is reset, then
3c10: 20 61 6c 73 6f 20 72 65 73 65 74 20 54 45 4d 50   also reset TEMP
3c20: 0a 20 20 2a 2a 20 73 69 6e 63 65 20 54 45 4d 50  .  ** since TEMP
3c30: 20 6d 69 67 68 74 20 62 65 20 68 6f 6c 64 69 6e   might be holdin
3c40: 67 20 74 72 69 67 67 65 72 73 20 74 68 61 74 20  g triggers that 
3c50: 72 65 66 65 72 65 6e 63 65 20 74 61 62 6c 65 73  reference tables
3c60: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68   in the.  ** oth
3c70: 65 72 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  er database..  *
3c80: 2f 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20 29  /.  if( iDb!=1 )
3c90: 7b 0a 20 20 20 20 70 44 62 20 3d 20 26 64 62 2d  {.    pDb = &db-
3ca0: 3e 61 44 62 5b 31 5d 3b 0a 20 20 20 20 61 73 73  >aDb[1];.    ass
3cb0: 65 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d  ert( pDb->pSchem
3cc0: 61 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  a!=0 );.    sqli
3cd0: 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70  te3SchemaClear(p
3ce0: 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Db->pSchema);.  
3cf0: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }.  return;.}../
3d00: 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73  *.** Erase all s
3d10: 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f  chema informatio
3d20: 6e 20 66 72 6f 6d 20 61 6c 6c 20 61 74 74 61 63  n from all attac
3d30: 68 65 64 20 64 61 74 61 62 61 73 65 73 20 28 69  hed databases (i
3d40: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 22 6d 61 69  ncluding.** "mai
3d50: 6e 22 20 61 6e 64 20 22 74 65 6d 70 22 29 20 66  n" and "temp") f
3d60: 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
3d70: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
3d80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3d90: 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f  ResetAllSchemasO
3da0: 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 73 71 6c 69  fConnection(sqli
3db0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
3dc0: 69 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  i;.  sqlite3Btre
3dd0: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
3de0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
3df0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44  nDb; i++){.    D
3e00: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
3e10: 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
3e20: 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  b->pSchema ){.  
3e30: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
3e40: 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68  aClear(pDb->pSch
3e50: 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ema);.    }.  }.
3e60: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
3e70: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
3e80: 6e 67 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 56  nges;.  sqlite3V
3e90: 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62  tabUnlockList(db
3ea0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
3eb0: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20  eLeaveAll(db);. 
3ec0: 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65   sqlite3Collapse
3ed0: 44 61 74 61 62 61 73 65 41 72 72 61 79 28 64 62  DatabaseArray(db
3ee0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
3ef0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
3f00: 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74  ed when a commit
3f10: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
3f20: 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
3f30: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71  ternalChanges(sq
3f40: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62  lite3 *db){.  db
3f50: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
3f60: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
3f70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
3f80: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
3f90: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ed for the colum
3fa0: 6e 20 6e 61 6d 65 73 20 6f 66 20 61 20 74 61 62  n names of a tab
3fb0: 6c 65 20 6f 72 20 76 69 65 77 20 28 74 68 65 0a  le or view (the.
3fc0: 2a 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20  ** Table.aCol[] 
3fd0: 61 72 72 61 79 29 2e 0a 2a 2f 0a 73 74 61 74 69  array)..*/.stati
3fe0: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c  c void sqliteDel
3ff0: 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 73  eteColumnNames(s
4000: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
4010: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e  e *pTable){.  in
4020: 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  t i;.  Column *p
4030: 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Col;.  assert( p
4040: 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66  Table!=0 );.  if
4050: 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65  ( (pCol = pTable
4060: 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20  ->aCol)!=0 ){.  
4070: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
4080: 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  ble->nCol; i++, 
4090: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73  pCol++){.      s
40a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
40b0: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
40c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
40d0: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d  Delete(db, pCol-
40e0: 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73  >pDflt);.      s
40f0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4100: 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20   pCol->zDflt);. 
4110: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
4120: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79  ee(db, pCol->zTy
4130: 70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pe);.      sqlit
4140: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
4150: 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d  l->zColl);.    }
4160: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
4170: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61  ee(db, pTable->a
4180: 43 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Col);.  }.}../*.
4190: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65  ** Remove the me
41a0: 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74  mory data struct
41b0: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ures associated 
41c0: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a  with the given.*
41d0: 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61  * Table.  No cha
41e0: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
41f0: 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f   disk by this ro
4200: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  utine..**.** Thi
4210: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64  s routine just d
4220: 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20  eletes the data 
4230: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64  structure.  It d
4240: 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a  oes not unlink.*
4250: 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61  * the table data
4260: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
4270: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
4280: 20 42 75 74 20 69 74 20 64 6f 65 73 20 64 65 73   But it does des
4290: 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73  troy.** memory s
42a0: 74 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65  tructures of the
42b0: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
42c0: 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69  eign keys associ
42d0: 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68  ated with .** th
42e0: 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
42f0: 68 65 20 64 62 20 70 61 72 61 6d 65 74 65 72 20  he db parameter 
4300: 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74  is optional.  It
4310: 20 69 73 20 6e 65 65 64 65 64 20 69 66 20 74 68   is needed if th
4320: 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a  e Table object .
4330: 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b  ** contains look
4340: 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28  aside memory.  (
4350: 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e  Table objects in
4360: 20 74 68 65 20 73 63 68 65 6d 61 20 64 6f 20 6e   the schema do n
4370: 6f 74 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73  ot use.** lookas
4380: 69 64 65 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20  ide memory, but 
4390: 73 6f 6d 65 20 65 70 68 65 6d 65 72 61 6c 20 54  some ephemeral T
43a0: 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e  able objects do.
43b0: 29 20 20 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20  )  Or the.** db 
43c0: 70 61 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65  parameter can be
43d0: 20 75 73 65 64 20 77 69 74 68 20 64 62 2d 3e 70   used with db->p
43e0: 6e 42 79 74 65 73 46 72 65 65 64 20 74 6f 20 6d  nBytesFreed to m
43f0: 65 61 73 75 72 65 20 74 68 65 20 6d 65 6d 6f 72  easure the memor
4400: 79 0a 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65  y.** used by the
4410: 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a   Table object..*
4420: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
4430: 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65  leteTable(sqlite
4440: 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54  3 *db, Table *pT
4450: 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a  able){.  Index *
4460: 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a  pIndex, *pNext;.
4470: 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20    TESTONLY( int 
4480: 6e 4c 6f 6f 6b 61 73 69 64 65 3b 20 29 20 2f 2a  nLookaside; ) /*
4490: 20 55 73 65 64 20 74 6f 20 76 65 72 69 66 79 20   Used to verify 
44a0: 6c 6f 6f 6b 61 73 69 64 65 20 6e 6f 74 20 75 73  lookaside not us
44b0: 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 2a 2f  ed for schema */
44c0: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 54 61  ..  assert( !pTa
44d0: 62 6c 65 20 7c 7c 20 70 54 61 62 6c 65 2d 3e 6e  ble || pTable->n
44e0: 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 44  Ref>0 );..  /* D
44f0: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
4500: 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65   table until the
4510: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
4520: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a   reaches zero. *
4530: 2f 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65 20  /.  if( !pTable 
4540: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
4550: 28 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42  ((!db || db->pnB
4560: 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26  ytesFreed==0) &&
4570: 20 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 52 65 66   (--pTable->nRef
4580: 29 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  )>0) ) return;..
4590: 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
45a0: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61  number of outsta
45b0: 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20  nding lookaside 
45c0: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 20 73  allocations in s
45d0: 63 68 65 6d 61 20 54 61 62 6c 65 73 0a 20 20 2a  chema Tables.  *
45e0: 2a 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  * prior to doing
45f0: 20 61 6e 79 20 66 72 65 65 28 29 20 6f 70 65 72   any free() oper
4600: 61 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65 20 73  ations.  Since s
4610: 63 68 65 6d 61 20 54 61 62 6c 65 73 20 64 6f 20  chema Tables do 
4620: 6e 6f 74 20 75 73 65 0a 20 20 2a 2a 20 6c 6f 6f  not use.  ** loo
4630: 6b 61 73 69 64 65 2c 20 74 68 69 73 20 6e 75 6d  kaside, this num
4640: 62 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63  ber should not c
4650: 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 54 45 53 54  hange. */.  TEST
4660: 4f 4e 4c 59 28 20 6e 4c 6f 6f 6b 61 73 69 64 65  ONLY( nLookaside
4670: 20 3d 20 28 64 62 20 26 26 20 28 70 54 61 62 6c   = (db && (pTabl
4680: 65 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  e->tabFlags & TF
4690: 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 29 20  _Ephemeral)==0) 
46a0: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
46b0: 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6c             db->l
46c0: 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 3a 20  ookaside.nOut : 
46d0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  0 );..  /* Delet
46e0: 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73  e all indices as
46f0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
4700: 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66  is table. */.  f
4710: 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62  or(pIndex = pTab
4720: 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  le->pIndex; pInd
4730: 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74  ex; pIndex=pNext
4740: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
4750: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
4760: 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
4770: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c  ->pSchema==pTabl
4780: 65 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  e->pSchema );.  
4790: 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d    if( !db || db-
47a0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
47b0: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
47c0: 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d 3e  zName = pIndex->
47d0: 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20 54 45  zName; .      TE
47e0: 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20 2a  STONLY ( Index *
47f0: 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74 65 33  pOld = ) sqlite3
4800: 48 61 73 68 49 6e 73 65 72 74 28 0a 20 20 20 20  HashInsert(.    
4810: 20 20 20 20 20 26 70 49 6e 64 65 78 2d 3e 70 53       &pIndex->pS
4820: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
4830: 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74  zName, sqlite3St
4840: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 2c 20 30  rlen30(zName), 0
4850: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
4860: 61 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c  assert( db==0 ||
4870: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
4880: 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
4890: 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20  Index->pSchema) 
48a0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
48b0: 20 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20 7c 7c   pOld==pIndex ||
48c0: 20 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20   pOld==0 );.    
48d0: 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28  }.    freeIndex(
48e0: 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d  db, pIndex);.  }
48f0: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e  ..  /* Delete an
4900: 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  y foreign keys a
4910: 74 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20  ttached to this 
4920: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69  table. */.  sqli
4930: 74 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20  te3FkDelete(db, 
4940: 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44  pTable);..  /* D
4950: 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20  elete the Table 
4960: 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
4970: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 44  ..  */.  sqliteD
4980: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
4990: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
49a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
49b0: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
49c0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
49d0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43  e(db, pTable->zC
49e0: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
49f0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
4a00: 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
4a10: 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t);.#ifndef SQLI
4a20: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
4a30: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
4a40: 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65  elete(db, pTable
4a50: 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69  ->pCheck);.#endi
4a60: 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
4a70: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
4a80: 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  LE.  sqlite3Vtab
4a90: 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65  Clear(db, pTable
4aa0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
4ab0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
4ac0: 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72  able);..  /* Ver
4ad0: 69 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b  ify that no look
4ae0: 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73  aside memory was
4af0: 20 75 73 65 64 20 62 79 20 73 63 68 65 6d 61 20   used by schema 
4b00: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65  tables */.  asse
4b10: 72 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d  rt( nLookaside==
4b20: 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d  0 || nLookaside=
4b30: 3d 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e  =db->lookaside.n
4b40: 4f 75 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Out );.}../*.** 
4b50: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
4b60: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
4b70: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
4b80: 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a  the delete the.*
4b90: 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  * table structur
4ba0: 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69  e with all its i
4bb0: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
4bc0: 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64  gn keys..*/.void
4bd0: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
4be0: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
4bf0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
4c00: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
4c10: 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c  TabName){.  Tabl
4c20: 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b  e *p;.  Db *pDb;
4c30: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
4c40: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
4c50: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
4c60: 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
4c70: 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20  ( zTabName );.  
4c80: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
4c90: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
4ca0: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
4cb0: 74 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61  testcase( zTabNa
4cc0: 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20  me[0]==0 );  /* 
4cd0: 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c  Zero-length tabl
4ce0: 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f  e names are allo
4cf0: 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26  wed */.  pDb = &
4d00: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
4d10: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
4d20: 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68  nsert(&pDb->pSch
4d30: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54  ema->tblHash, zT
4d40: 61 62 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  abName,.        
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d60: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
4d70: 7a 54 61 62 4e 61 6d 65 29 2c 30 29 3b 0a 20 20  zTabName),0);.  
4d80: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
4d90: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d  le(db, p);.  db-
4da0: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
4db0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
4dc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
4dd0: 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61   token, return a
4de0: 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e   string that con
4df0: 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78  sists of the tex
4e00: 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b  t of that.** tok
4e10: 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  en.  Space to ho
4e20: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
4e30: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74  string.** is obt
4e40: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
4e50: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
4e60: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
4e70: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
4e80: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e  nction..**.** An
4e90: 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b  y quotation mark
4ea0: 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20  s (ex:  "name", 
4eb0: 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20  'name', [name], 
4ec0: 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a  or `name`) that.
4ed0: 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20  ** surround the 
4ee0: 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65  body of the toke
4ef0: 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a  n are removed..*
4f00: 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20  *.** Tokens are 
4f10: 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74  often just point
4f20: 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ers into the ori
4f30: 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61  ginal SQL text a
4f40: 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74  nd so.** are not
4f50: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
4f60: 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72   and are not per
4f70: 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65  sistent.  The re
4f80: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a  turned string.**
4f90: 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61   is \000 termina
4fa0: 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69  ted and is persi
4fb0: 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a  stent..*/.char *
4fc0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
4fd0: 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  oken(sqlite3 *db
4fe0: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
4ff0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
5000: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
5010: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
5020: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
5030: 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c  (char*)pName->z,
5040: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
5050: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
5060: 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Name);.  }else{.
5070: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20      zName = 0;. 
5080: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d   }.  return zNam
5090: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  e;.}../*.** Open
50a0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
50b0: 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20  er table stored 
50c0: 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62  in database numb
50d0: 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72  er iDb for.** wr
50e0: 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65  iting. The table
50f0: 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67   is opened using
5100: 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f   cursor 0..*/.vo
5110: 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61  id sqlite3OpenMa
5120: 73 74 65 72 54 61 62 6c 65 28 50 61 72 73 65 20  sterTable(Parse 
5130: 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  *p, int iDb){.  
5140: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
5150: 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73  3GetVdbe(p);.  s
5160: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
5170: 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52  p, iDb, MASTER_R
5180: 4f 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54  OOT, 1, SCHEMA_T
5190: 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 73 71  ABLE(iDb));.  sq
51a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
51b0: 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  nt(v, OP_OpenWri
51c0: 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f  te, 0, MASTER_RO
51d0: 4f 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20 69  OT, iDb, 5);.  i
51e0: 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b  f( p->nTab==0 ){
51f0: 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31  .    p->nTab = 1
5200: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
5210: 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70  arameter zName p
5220: 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74  oints to a nul-t
5230: 65 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72  erminated buffer
5240: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
5250: 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74  name.** of a dat
5260: 61 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22  abase ("main", "
5270: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
5280: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
5290: 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75   db). This.** fu
52a0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
52b0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
52c0: 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69  named database i
52d0: 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a  n db->aDb[], or.
52e0: 2a 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d  ** -1 if the nam
52f0: 65 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20  ed db cannot be 
5300: 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  found..*/.int sq
5310: 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
5320: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
5330: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
5340: 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20  .  int i = -1;  
5350: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
5360: 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  se number */.  i
5370: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
5380: 44 62 20 2a 70 44 62 3b 0a 20 20 20 20 69 6e 74  Db *pDb;.    int
5390: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
53a0: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  en30(zName);.   
53b0: 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d   for(i=(db->nDb-
53c0: 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44 62  1), pDb=&db->aDb
53d0: 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  [i]; i>=0; i--, 
53e0: 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  pDb--){.      if
53f0: 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  ( (!OMIT_TEMPDB 
5400: 7c 7c 20 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d  || i!=1 ) && n==
5410: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
5420: 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a  pDb->zName) && .
5430: 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c            0==sql
5440: 69 74 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d  ite3StrICmp(pDb-
5450: 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29  >zName, zName) )
5460: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
5470: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5480: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
5490: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65  ../*.** The toke
54a0: 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e  n *pName contain
54b0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
54c0: 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72  database (either
54d0: 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74   "main" or.** "t
54e0: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
54f0: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
5500: 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  db). This routin
5510: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
5520: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61   index of the na
5530: 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20  med database in 
5540: 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31  db->aDb[], or -1
5550: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62   if the named db
5560: 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78   .** does not ex
5570: 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ist..*/.int sqli
5580: 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65  te3FindDb(sqlite
5590: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
55a0: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  ame){.  int i;  
55b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
55d0: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
55e0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
55f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
5610: 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68 69  e we are searchi
5620: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d  ng for */.  zNam
5630: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
5640: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
5650: 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74  me);.  i = sqlit
5660: 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c  e3FindDbName(db,
5670: 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74   zName);.  sqlit
5680: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
5690: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b  me);.  return i;
56a0: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65  .}../* The table
56b0: 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67   or view or trig
56c0: 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73  ger name is pass
56d0: 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ed to this routi
56e0: 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a  ne via tokens.**
56f0: 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d   pName1 and pNam
5700: 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  e2. If the table
5710: 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20   name was fully 
5720: 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65  qualified, for e
5730: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52  xample:.**.** CR
5740: 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79  EATE TABLE xxx.y
5750: 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a  yy (...);.** .**
5760: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
5770: 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64  set to "xxx" and
5780: 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f   pName2 "yyy". O
5790: 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
57a0: 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   if.** the table
57b0: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c   name is not ful
57c0: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e  ly qualified, i.
57d0: 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45  e.:.**.** CREATE
57e0: 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b   TABLE yyy(...);
57f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d  .**.** Then pNam
5800: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79  e1 is set to "yy
5810: 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73  y" and pName2 is
5820: 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   ""..**.** This 
5830: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
5840: 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74   *ppUnqual point
5850: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
5860: 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31  he token (pName1
5870: 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74   or.** pName2) t
5880: 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75  hat stores the u
5890: 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65  nqualified table
58a0: 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65   name.  The inde
58b0: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  x of the.** data
58c0: 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65  base "xxx" is re
58d0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
58e0: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
58f0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
5900: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
5910: 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
5920: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
5930: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
5940: 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e1,      /* The 
5950: 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d  "xxx" in the nam
5960: 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22  e "xxx.yyy" or "
5970: 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  xxx" */.  Token 
5980: 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a  *pName2,      /*
5990: 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74 68   The "yyy" in th
59a0: 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22  e name "xxx.yyy"
59b0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55   */.  Token **pU
59c0: 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69  nqual     /* Wri
59d0: 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  te the unqualifi
59e0: 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68  ed object name h
59f0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
5a00: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
5a10: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
5a20: 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ase holding the 
5a30: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
5a40: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5a50: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 41 4c 57  ->db;..  if( ALW
5a60: 41 59 53 28 70 4e 61 6d 65 32 21 3d 30 29 20 26  AYS(pName2!=0) &
5a70: 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b  & pName2->n>0 ){
5a80: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  .    if( db->ini
5a90: 74 2e 62 75 73 79 20 29 20 7b 0a 20 20 20 20 20  t.busy ) {.     
5aa0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5ab0: 28 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70  (pParse, "corrup
5ac0: 74 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20  t database");.  
5ad0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
5ae0: 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
5af0: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a   -1;.    }.    *
5b00: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32  pUnqual = pName2
5b10: 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
5b20: 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e  te3FindDb(db, pN
5b30: 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69  ame1);.    if( i
5b40: 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71  Db<0 ){.      sq
5b50: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5b60: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64  arse, "unknown d
5b70: 61 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61  atabase %T", pNa
5b80: 6d 65 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72  me1);.      pPar
5b90: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
5ba0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
5bb0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
5bc0: 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74  assert( db->init
5bd0: 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69  .iDb==0 || db->i
5be0: 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20  nit.busy );.    
5bf0: 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69  iDb = db->init.i
5c00: 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c  Db;.    *pUnqual
5c10: 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20   = pName1;.  }. 
5c20: 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a   return iDb;.}..
5c30: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
5c40: 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68  ne is used to ch
5c50: 65 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38  eck if the UTF-8
5c60: 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73   string zName is
5c70: 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75   a legal.** unqu
5c80: 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72  alified name for
5c90: 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62   a new schema ob
5ca0: 6a 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64  ject (table, ind
5cb0: 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74  ex, view or.** t
5cc0: 72 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d  rigger). All nam
5cd0: 65 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63  es are legal exc
5ce0: 65 70 74 20 74 68 6f 73 65 20 74 68 61 74 20 62  ept those that b
5cf0: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 73 74  egin with the st
5d00: 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f  ring.** "sqlite_
5d10: 22 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77  " (in upper, low
5d20: 65 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65  er or mixed case
5d30: 29 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20  ). This portion 
5d40: 6f 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65  of the namespace
5d50: 0a 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64 20  .** is reserved 
5d60: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65  for internal use
5d70: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5d80: 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
5d90: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
5da0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
5db0: 29 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  ){.  if( !pParse
5dc0: 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ->db->init.busy 
5dd0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  && pParse->neste
5de0: 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  d==0 .          
5df0: 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  && (pParse->db->
5e00: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57  flags & SQLITE_W
5e10: 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20  riteSchema)==0. 
5e20: 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73           && 0==s
5e30: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
5e40: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
5e50: 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   7) ){.    sqlit
5e60: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5e70: 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20  e, "object name 
5e80: 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74  reserved for int
5e90: 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20  ernal use: %s", 
5ea0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
5eb0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
5ec0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
5ed0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
5ee0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 52 49  * Return the PRI
5ef0: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 6f  MARY KEY index o
5f00: 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64  f a table.*/.Ind
5f10: 65 78 20 2a 73 71 6c 69 74 65 33 50 72 69 6d 61  ex *sqlite3Prima
5f20: 72 79 4b 65 79 49 6e 64 65 78 28 54 61 62 6c 65  ryKeyIndex(Table
5f30: 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78   *pTab){.  Index
5f40: 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 54 61   *p;.  for(p=pTa
5f50: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20  b->pIndex; p && 
5f60: 70 2d 3e 61 75 74 6f 49 6e 64 65 78 21 3d 32 3b  p->autoIndex!=2;
5f70: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20   p=p->pNext){}. 
5f80: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
5f90: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
5fa0: 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70  olumn of index p
5fb0: 49 64 78 20 74 68 61 74 20 63 6f 72 72 65 73 70  Idx that corresp
5fc0: 6f 6e 64 73 20 74 6f 20 74 61 62 6c 65 0a 2a 2a  onds to table.**
5fd0: 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20 20 52   column iCol.  R
5fe0: 65 74 75 72 6e 20 2d 31 20 69 66 20 6e 6f 74 20  eturn -1 if not 
5ff0: 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20 73 71  found..*/.i16 sq
6000: 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
6010: 65 78 28 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  ex(Index *pIdx, 
6020: 69 31 36 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74  i16 iCol){.  int
6030: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
6040: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
6050: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 43  i++){.    if( iC
6060: 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ol==pIdx->aiColu
6070: 6d 6e 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 69  mn[i] ) return i
6080: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
6090: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  1;.}../*.** Begi
60a0: 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61  n constructing a
60b0: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65   new table repre
60c0: 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d  sentation in mem
60d0: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a  ory.  This is.**
60e0: 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65   the first of se
60f0: 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75  veral action rou
6100: 74 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63  tines that get c
6110: 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73  alled in respons
6120: 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45  e.** to a CREATE
6130: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
6140: 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72  .  In particular
6150: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
6160: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65  s called.** afte
6170: 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20  r seeing tokens 
6180: 22 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41  "CREATE" and "TA
6190: 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62  BLE" and the tab
61a0: 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54  le name. The isT
61b0: 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74  emp.** flag is t
61c0: 72 75 65 20 69 66 20 74 68 65 20 74 61 62 6c 65  rue if the table
61d0: 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65   should be store
61e0: 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61  d in the auxilia
61f0: 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  ry database.** f
6200: 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ile instead of i
6210: 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
6220: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ase file.  This 
6230: 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20  is normally the 
6240: 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65  case.** when the
6250: 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50   "TEMP" or "TEMP
6260: 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f  ORARY" keyword o
6270: 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e  ccurs in between
6280: 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54  .** CREATE and T
6290: 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ABLE..**.** The 
62a0: 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64  new table record
62b0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
62c0: 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72 73  and put in pPars
62d0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a  e->pNewTable..**
62e0: 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   As more of the 
62f0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
6300: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
6310: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74  , additional act
6320: 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20  ion.** routines 
6330: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74  will be called t
6340: 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72  o add more infor
6350: 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72  mation to this r
6360: 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65  ecord..** At the
6370: 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41   end of the CREA
6380: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
6390: 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45  nt, the sqlite3E
63a0: 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e  ndTable() routin
63b0: 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74  e.** is called t
63c0: 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63  o complete the c
63d0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74  onstruction of t
63e0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
63f0: 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ord..*/.void sql
6400: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a  ite3StartTable(.
6410: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
6420: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
6430: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
6440: 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69  *pName1,   /* Fi
6450: 72 73 74 20 70 61 72 74 20 6f 66 20 74 68 65 20  rst part of the 
6460: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
6470: 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54  e or view */.  T
6480: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
6490: 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f  /* Second part o
64a0: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
64b0: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
64c0: 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c  */.  int isTemp,
64d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
64e0: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 20   this is a TEMP 
64f0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
6500: 73 56 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54  sView,      /* T
6510: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
6520: 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69   VIEW */.  int i
6530: 73 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54  sVirtual,   /* T
6540: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
6550: 20 56 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a   VIRTUAL table *
6560: 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20  /.  int noErr   
6570: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69       /* Do nothi
6580: 6e 67 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65  ng if table alre
6590: 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b  ady exists */.){
65a0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
65b0: 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  ;.  char *zName 
65c0: 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65  = 0; /* The name
65d0: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
65e0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
65f0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
6600: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
6610: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f  t iDb;         /
6620: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
6630: 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20  r to create the 
6640: 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f  table in */.  To
6650: 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f  ken *pName;    /
6660: 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61  * Unqualified na
6670: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
6680: 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20  to create */..  
6690: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20  /* The table or 
66a0: 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65  view name to cre
66b0: 61 74 65 20 69 73 20 70 61 73 73 65 64 20 74 6f  ate is passed to
66c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69   this routine vi
66d0: 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e  a tokens.  ** pN
66e0: 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e  ame1 and pName2.
66f0: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61   If the table na
6700: 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61  me was fully qua
6710: 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d  lified, for exam
6720: 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  ple:.  **.  ** C
6730: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e  REATE TABLE xxx.
6740: 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20  yyy (...);.  ** 
6750: 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  .  ** Then pName
6760: 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78  1 is set to "xxx
6770: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79  " and pName2 "yy
6780: 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  y". On the other
6790: 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68   hand if.  ** th
67a0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20  e table name is 
67b0: 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  not fully qualif
67c0: 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a  ied, i.e.:.  **.
67d0: 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
67e0: 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a  E yyy(...);.  **
67f0: 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  .  ** Then pName
6800: 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79  1 is set to "yyy
6810: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20  " and pName2 is 
6820: 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ""..  **.  ** Th
6830: 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74  e call below set
6840: 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e  s the pName poin
6850: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
6860: 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65  the token (pName
6870: 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32  1 or.  ** pName2
6880: 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  ) that stores th
6890: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61  e unqualified ta
68a0: 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61  ble name. The va
68b0: 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20  riable iDb is.  
68c0: 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  ** set to the in
68d0: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
68e0: 61 73 65 20 74 68 61 74 20 74 68 65 20 74 61 62  ase that the tab
68f0: 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f  le or view is to
6900: 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64   be.  ** created
6910: 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20   in..  */.  iDb 
6920: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
6930: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
6940: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
6950: 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c  ame);.  if( iDb<
6960: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
6970: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
6980: 26 20 69 73 54 65 6d 70 20 26 26 20 70 4e 61 6d  & isTemp && pNam
6990: 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62 21 3d  e2->n>0 && iDb!=
69a0: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63  1 ){.    /* If c
69b0: 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74  reating a temp t
69c0: 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d  able, the name m
69d0: 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66  ay not be qualif
69e0: 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a 20 20 20  ied. Unless .   
69f0: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
6a00: 20 6e 61 6d 65 20 69 73 20 22 74 65 6d 70 22 20   name is "temp" 
6a10: 61 6e 79 77 61 79 2e 20 20 2a 2f 0a 20 20 20 20  anyway.  */.    
6a20: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
6a30: 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61  pParse, "tempora
6a40: 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75  ry table name mu
6a50: 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65  st be unqualifie
6a60: 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d");.    return;
6a70: 0a 20 20 7d 0a 20 20 69 66 28 20 21 4f 4d 49 54  .  }.  if( !OMIT
6a80: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
6a90: 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20  p ) iDb = 1;..  
6aa0: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
6ab0: 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a  en = *pName;.  z
6ac0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
6ad0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
6ae0: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
6af0: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
6b00: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
6b10: 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  !=sqlite3CheckOb
6b20: 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  jectName(pParse,
6b30: 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67   zName) ){.    g
6b40: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
6b50: 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28  error;.  }.  if(
6b60: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31   db->init.iDb==1
6b70: 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23   ) isTemp = 1;.#
6b80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6b90: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
6ba0: 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 54 65  .  assert( (isTe
6bb0: 6d 70 20 26 20 31 29 3d 3d 69 73 54 65 6d 70 20  mp & 1)==isTemp 
6bc0: 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  );.  {.    int c
6bd0: 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ode;.    char *z
6be0: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
6bf0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ].zName;.    if(
6c00: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
6c10: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
6c20: 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f  _INSERT, SCHEMA_
6c30: 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30  TABLE(isTemp), 0
6c40: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
6c50: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
6c60: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
6c70: 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
6c80: 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
6c90: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
6ca0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
6cb0: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
6cc0: 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20  _TEMP_VIEW;.    
6cd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6ce0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
6cf0: 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20  REATE_VIEW;.    
6d00: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
6d10: 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
6d20: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
6d30: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
6d40: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
6d50: 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  TEMP_TABLE;.    
6d60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6d70: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
6d80: 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20  REATE_TABLE;.   
6d90: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
6da0: 66 28 20 21 69 73 56 69 72 74 75 61 6c 20 26 26  f( !isVirtual &&
6db0: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
6dc0: 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
6dd0: 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29  zName, 0, zDb) )
6de0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  {.      goto beg
6df0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
6e00: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
6e10: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
6e20: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e   the new table n
6e30: 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c  ame does not col
6e40: 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65 78 69  lide with an exi
6e50: 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78  sting.  ** index
6e60: 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69   or table name i
6e70: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
6e80: 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65  ase.  Issue an e
6e90: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a  rror message if.
6ea0: 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20 54 68    ** it does. Th
6eb0: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69  e exception is i
6ec0: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
6ed0: 62 65 69 6e 67 20 70 61 72 73 65 64 20 77 61 73  being parsed was
6ee0: 20 70 61 73 73 65 64 0a 20 20 2a 2a 20 74 6f 20   passed.  ** to 
6ef0: 61 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61  an sqlite3_decla
6f00: 72 65 5f 76 74 61 62 28 29 20 63 61 6c 6c 2e 20  re_vtab() call. 
6f10: 49 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c  In that case onl
6f20: 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
6f30: 65 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79 70 65  es.  ** and type
6f40: 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20  s will be used, 
6f50: 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  so there is no n
6f60: 65 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20  eed to test for 
6f70: 6e 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a 20 63  namespace.  ** c
6f80: 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  ollisions..  */.
6f90: 20 20 69 66 28 20 21 49 4e 5f 44 45 43 4c 41 52    if( !IN_DECLAR
6fa0: 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 63 68  E_VTAB ){.    ch
6fb0: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
6fc0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
6fd0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
6fe0: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
6ff0: 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
7000: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
7010: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
7020: 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 73  }.    pTable = s
7030: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
7040: 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b  db, zName, zDb);
7050: 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 20  .    if( pTable 
7060: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6e 6f  ){.      if( !no
7070: 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Err ){.        s
7080: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7090: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54  Parse, "table %T
70a0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
70b0: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , pName);.      
70c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
70d0: 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
70e0: 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20 20  .busy );.       
70f0: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
7100: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
7110: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20   iDb);.      }. 
7120: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
7130: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
7140: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
7150: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
7160: 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29  zName, zDb)!=0 )
7170: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
7180: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7190: 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
71a0: 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64  y an index named
71b0: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
71c0: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
71d0: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
71e0: 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20  }.  }..  pTable 
71f0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
7200: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
7210: 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20  (Table));.  if( 
7220: 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  pTable==0 ){.   
7230: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
7240: 64 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 72 73  d = 1;.    pPars
7250: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  e->rc = SQLITE_N
7260: 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65  OMEM;.    pParse
7270: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
7280: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7290: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rror;.  }.  pTab
72a0: 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  le->zName = zNam
72b0: 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b  e;.  pTable->iPK
72c0: 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c  ey = -1;.  pTabl
72d0: 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  e->pSchema = db-
72e0: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
72f0: 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65  a;.  pTable->nRe
7300: 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 6c 65 2d  f = 1;.  pTable-
7310: 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30  >nRowLogEst = 20
7320: 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d  0; assert( 200==
7330: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
7340: 34 38 35 37 36 29 20 29 3b 0a 20 20 61 73 73 65  48576) );.  asse
7350: 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  rt( pParse->pNew
7360: 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70 50  Table==0 );.  pP
7370: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
7380: 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20  = pTable;..  /* 
7390: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d  If this is the m
73a0: 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75  agic sqlite_sequ
73b0: 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64 20  ence table used 
73c0: 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  by autoincrement
73d0: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f  ,.  ** then reco
73e0: 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rd a pointer to 
73f0: 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68  this table in th
7400: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
7410: 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73  structure.  ** s
7420: 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20 63 61  o that INSERT ca
7430: 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65  n find the table
7440: 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69   easily..  */.#i
7450: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7460: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
7470: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e    if( !pParse->n
7480: 65 73 74 65 64 20 26 26 20 73 74 72 63 6d 70 28  ested && strcmp(
7490: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73  zName, "sqlite_s
74a0: 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a  equence")==0 ){.
74b0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
74c0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
74d0: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
74e0: 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53  ;.    pTable->pS
74f0: 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d  chema->pSeqTab =
7500: 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e   pTable;.  }.#en
7510: 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  dif..  /* Begin 
7520: 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63  generating the c
7530: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ode that will in
7540: 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72  sert the table r
7550: 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20  ecord into.  ** 
7560: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
7570: 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69  R table.  Note i
7580: 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61  n particular tha
7590: 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65  t we must go ahe
75a0: 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f  ad.  ** and allo
75b0: 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20  cate the record 
75c0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
75d0: 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20  able entry now. 
75e0: 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a   Before any.  **
75f0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
7600: 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20  UNIQUE keywords 
7610: 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f  are parsed.  Tho
7620: 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c  se keywords will
7630: 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69   cause.  ** indi
7640: 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65  ces to be create
7650: 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  d and the table 
7660: 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65  record must come
7670: 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a   before the .  *
7680: 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63  * indices.  Henc
7690: 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  e, the record nu
76a0: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
76b0: 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63  le must be alloc
76c0: 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20  ated.  ** now.. 
76d0: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
76e0: 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d  nit.busy && (v =
76f0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
7700: 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20  pParse))!=0 ){. 
7710: 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20 20 20 69     int j1;.    i
7720: 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20  nt fileFormat;. 
7730: 20 20 20 69 6e 74 20 72 65 67 31 2c 20 72 65 67     int reg1, reg
7740: 32 2c 20 72 65 67 33 3b 0a 20 20 20 20 73 71 6c  2, reg3;.    sql
7750: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
7760: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
7770: 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  0, iDb);..#ifnde
7780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
7790: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
77a0: 66 28 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a  f( isVirtual ){.
77b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
77c0: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42  eAddOp0(v, OP_VB
77d0: 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  egin);.    }.#en
77e0: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  dif..    /* If t
77f0: 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61  he file format a
7800: 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74  nd encoding in t
7810: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 76 65  he database have
7820: 20 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a   not been set, .
7830: 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20      ** set them 
7840: 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  now..    */.    
7850: 72 65 67 31 20 3d 20 70 50 61 72 73 65 2d 3e 72  reg1 = pParse->r
7860: 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72  egRowid = ++pPar
7870: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
7880: 67 32 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67  g2 = pParse->reg
7890: 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Root = ++pParse-
78a0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33 20  >nMem;.    reg3 
78b0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
78c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
78d0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65  eAddOp3(v, OP_Re
78e0: 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72  adCookie, iDb, r
78f0: 65 67 33 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f  eg3, BTREE_FILE_
7900: 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20 73 71 6c  FORMAT);.    sql
7910: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
7920: 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 6a  e(v, iDb);.    j
7930: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
7940: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp1(v, OP_If, 
7950: 72 65 67 33 29 3b 20 56 64 62 65 43 6f 76 65 72  reg3); VdbeCover
7960: 61 67 65 28 76 29 3b 0a 20 20 20 20 66 69 6c 65  age(v);.    file
7970: 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c  Format = (db->fl
7980: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65 67  ags & SQLITE_Leg
7990: 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f  acyFileFmt)!=0 ?
79a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
79b0: 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41     1 : SQLITE_MA
79c0: 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20  X_FILE_FORMAT;. 
79d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
79e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
79f0: 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74 2c 20  er, fileFormat, 
7a00: 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg3);.    sqlit
7a10: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7a20: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
7a30: 62 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f  b, BTREE_FILE_FO
7a40: 52 4d 41 54 2c 20 72 65 67 33 29 3b 0a 20 20 20  RMAT, reg3);.   
7a50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7a60: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
7a70: 2c 20 45 4e 43 28 64 62 29 2c 20 72 65 67 33 29  , ENC(db), reg3)
7a80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7a90: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
7aa0: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54  tCookie, iDb, BT
7ab0: 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e  REE_TEXT_ENCODIN
7ac0: 47 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71  G, reg3);.    sq
7ad0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
7ae0: 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 20 20 2f  e(v, j1);..    /
7af0: 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72 65 61  * This just crea
7b00: 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64  tes a place-hold
7b10: 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  er record in the
7b20: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
7b30: 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  able..    ** The
7b40: 20 72 65 63 6f 72 64 20 63 72 65 61 74 65 64 20   record created 
7b50: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
7b60: 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20   anything yet.  
7b70: 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61  It will be repla
7b80: 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ced.    ** by th
7b90: 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20  e real entry in 
7ba0: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 61  code generated a
7bb0: 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  t sqlite3EndTabl
7bc0: 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
7bd0: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  ** The rowid for
7be0: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69   the new entry i
7bf0: 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74  s left in regist
7c00: 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  er pParse->regRo
7c10: 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  wid..    ** The 
7c20: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
7c30: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
7c40: 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  e is left in reg
7c50: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
7c60: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77  ..    ** The row
7c70: 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65  id and root page
7c80: 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73 20 61   number values a
7c90: 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65  re needed by the
7ca0: 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20 2a   code that.    *
7cb0: 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  * sqlite3EndTabl
7cc0: 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e  e will generate.
7cd0: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  .    */.#if !def
7ce0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
7cf0: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
7d00: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
7d10: 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20  IRTUALTABLE).   
7d20: 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20 69   if( isView || i
7d30: 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20  sVirtual ){.    
7d40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7d50: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
7d60: 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20 20 20  r, 0, reg2);.   
7d70: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
7d80: 20 20 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65    {.      pParse
7d90: 2d 3e 61 64 64 72 43 72 54 61 62 20 3d 20 73 71  ->addrCrTab = sq
7da0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7db0: 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  v, OP_CreateTabl
7dc0: 65 2c 20 69 44 62 2c 20 72 65 67 32 29 3b 0a 20  e, iDb, reg2);. 
7dd0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
7de0: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
7df0: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
7e00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7e10: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
7e20: 69 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20  id, 0, reg1);.  
7e30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7e40: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
7e50: 30 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71  0, reg3);.    sq
7e60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
7e70: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c  v, OP_Insert, 0,
7e80: 20 72 65 67 33 2c 20 72 65 67 31 29 3b 0a 20 20   reg3, reg1);.  
7e90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
7ea0: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
7eb0: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c  APPEND);.    sql
7ec0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
7ed0: 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d  , OP_Close);.  }
7ee0: 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e  ..  /* Normal (n
7ef0: 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e  on-error) return
7f00: 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a  . */.  return;..
7f10: 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
7f20: 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70   occurs, we jump
7f30: 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74   here */.begin_t
7f40: 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71  able_error:.  sq
7f50: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7f60: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
7f70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
7f80: 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f  macro is used to
7f90: 20 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 72   compare two str
7fa0: 69 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d 69  ings in a case-i
7fb0: 6e 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65  nsensitive manne
7fc0: 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69 67  r..** It is slig
7fd0: 68 74 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e  htly faster than
7fe0: 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
7ff0: 53 74 72 49 43 6d 70 28 29 20 64 69 72 65 63 74  StrICmp() direct
8000: 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75  ly, but.** produ
8010: 63 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65 2e  ces larger code.
8020: 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20  .**.** WARNING: 
8030: 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f  This macro is no
8040: 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  t compatible wit
8050: 68 20 74 68 65 20 73 74 72 63 6d 70 28 29 20 66  h the strcmp() f
8060: 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74  amily. It.** ret
8070: 75 72 6e 73 20 74 72 75 65 20 69 66 20 74 68 65  urns true if the
8080: 20 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72 65   two strings are
8090: 20 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69 73   equal, otherwis
80a0: 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66  e false..*/.#def
80b0: 69 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20 79  ine STRICMP(x, y
80c0: 29 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70 65  ) (\.sqlite3Uppe
80d0: 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67  rToLower[*(unsig
80e0: 6e 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d 3d  ned char *)(x)]=
80f0: 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70 70  =   \.sqlite3Upp
8100: 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69  erToLower[*(unsi
8110: 67 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29 5d  gned char *)(y)]
8120: 20 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74 65       \.&& sqlite
8130: 33 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c 28  3StrICmp((x)+1,(
8140: 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a  y)+1)==0 )../*.*
8150: 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75  * Add a new colu
8160: 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  mn to the table 
8170: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
8180: 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a  constructed..**.
8190: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
81a0: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
81b0: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63   once for each c
81c0: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
81d0: 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45  n.** in a CREATE
81e0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
81f0: 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  .  sqlite3StartT
8200: 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c  able() gets call
8210: 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67  ed.** first to g
8220: 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e  et things going.
8230: 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74    Then this rout
8240: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ine is called fo
8250: 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e  r each.** column
8260: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8270: 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65  3AddColumn(Parse
8280: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
8290: 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  *pName){.  Table
82a0: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
82b0: 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d  char *z;.  Colum
82c0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74  n *pCol;.  sqlit
82d0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
82e0: 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  >db;.  if( (p = 
82f0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
8300: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
8310: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
8320: 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 6e  OLUMN.  if( p->n
8330: 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74  Col+1>db->aLimit
8340: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
8350: 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c  LUMN] ){.    sql
8360: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8370: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
8380: 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70  olumns on %s", p
8390: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
83a0: 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
83b0: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61  .  z = sqlite3Na
83c0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
83d0: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d  pName);.  if( z=
83e0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
83f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
8400: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
8410: 20 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61   STRICMP(z, p->a
8420: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b  Col[i].zName) ){
8430: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
8440: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8450: 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e  duplicate column
8460: 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a   name: %s", z);.
8470: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
8480: 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
8490: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
84a0: 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43    }.  if( (p->nC
84b0: 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a  ol & 0x7)==0 ){.
84c0: 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77      Column *aNew
84d0: 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c  ;.    aNew = sql
84e0: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
84f0: 2c 70 2d 3e 61 43 6f 6c 2c 28 69 36 34 29 28 70  ,p->aCol,(i64)(p
8500: 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66  ->nCol+8)*sizeof
8510: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
8520: 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
8530: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
8540: 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
8550: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
8560: 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20  }.    p->aCol = 
8570: 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c  aNew;.  }.  pCol
8580: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e   = &p->aCol[p->n
8590: 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  Col];.  memset(p
85a0: 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  Col, 0, sizeof(p
85b0: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70  ->aCol[0]));.  p
85c0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a  Col->zName = z;.
85d0: 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20   .  /* If there 
85e0: 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69  is no type speci
85f0: 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61  fied, columns ha
8600: 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 61  ve the default a
8610: 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e 4f  ffinity.  ** 'NO
8620: 4e 45 27 2e 20 49 66 20 74 68 65 72 65 20 69 73  NE'. If there is
8630: 20 61 20 74 79 70 65 20 73 70 65 63 69 66 69 65   a type specifie
8640: 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33 41  d, then sqlite3A
8650: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77  ddColumnType() w
8660: 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c  ill.  ** be call
8670: 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74 20 70  ed next to set p
8680: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f  Col->affinity co
8690: 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20  rrectly..  */.  
86a0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
86b0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
86c0: 3b 0a 20 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20  ;.  pCol->szEst 
86d0: 3d 20 31 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b  = 1;.  p->nCol++
86e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
86f0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
8700: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
8710: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
8720: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
8730: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
8740: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22   statement.  A "
8750: 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72  NOT NULL" constr
8760: 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e  aint has.** been
8770: 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d   seen on a colum
8780: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
8790: 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c   sets the notNul
87a0: 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65  l flag on.** the
87b0: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
87c0: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
87d0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
87e0: 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28  lite3AddNotNull(
87f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
8800: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54  nt onError){.  T
8810: 61 62 6c 65 20 2a 70 3b 0a 20 20 70 20 3d 20 70  able *p;.  p = p
8820: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
8830: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
8840: 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29  NEVER(p->nCol<1)
8850: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e   ) return;.  p->
8860: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e  aCol[p->nCol-1].
8870: 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e  notNull = (u8)on
8880: 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Error;.}../*.** 
8890: 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Scan the column 
88a0: 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20  type name zType 
88b0: 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61  (length nType) a
88c0: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a  nd return the.**
88d0: 20 61 73 73 6f 63 69 61 74 65 64 20 61 66 66 69   associated affi
88e0: 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a  nity type..**.**
88f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
8900: 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65 70 65  es a case-indepe
8910: 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f 66 20  ndent search of 
8920: 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 0a 2a  zType for the .*
8930: 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20  * substrings in 
8940: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  the following ta
8950: 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74  ble. If one of t
8960: 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 73  he substrings is
8970: 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20 63  .** found, the c
8980: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 66 66  orresponding aff
8990: 69 6e 69 74 79 20 69 73 20 72 65 74 75 72 6e 65  inity is returne
89a0: 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f 6e 74  d. If zType cont
89b0: 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61  ains.** more tha
89c0: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62  n one of the sub
89d0: 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69 65 73  strings, entries
89e0: 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f 70 20   toward the top 
89f0: 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  of .** the table
8a00: 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79 2e 20   take priority. 
8a10: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
8a20: 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42 49 4e  zType is 'BLOBIN
8a30: 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  T', .** SQLITE_A
8a40: 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20 72 65  FF_INTEGER is re
8a50: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75  turned..**.** Su
8a60: 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20 41 66  bstring     | Af
8a70: 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  finity.** ------
8a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49  ----------.** 'I
8aa0: 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20 53 51  NT'         | SQ
8ab0: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
8ac0: 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20 20 20  .** 'CHAR'      
8ad0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54    | SQLITE_AFF_T
8ae0: 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20  EXT.** 'CLOB'   
8af0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
8b00: 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58 54 27  F_TEXT.** 'TEXT'
8b10: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
8b20: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c  _AFF_TEXT.** 'BL
8b30: 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OB'        | SQL
8b40: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a 20  ITE_AFF_NONE.** 
8b50: 27 52 45 41 4c 27 20 20 20 20 20 20 20 20 7c 20  'REAL'        | 
8b60: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
8b70: 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20 20 20  ** 'FLOA'       
8b80: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   | SQLITE_AFF_RE
8b90: 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20 20  AL.** 'DOUB'    
8ba0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
8bb0: 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  _REAL.**.** If n
8bc0: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
8bd0: 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61 62 6f  rings in the abo
8be0: 76 65 20 74 61 62 6c 65 20 61 72 65 20 66 6f 75  ve table are fou
8bf0: 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46  nd,.** SQLITE_AF
8c00: 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72 65 74  F_NUMERIC is ret
8c10: 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73  urned..*/.char s
8c20: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
8c30: 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  pe(const char *z
8c40: 49 6e 2c 20 75 38 20 2a 70 73 7a 45 73 74 29 7b  In, u8 *pszEst){
8c50: 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20  .  u32 h = 0;.  
8c60: 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54  char aff = SQLIT
8c70: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
8c80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68   const char *zCh
8c90: 61 72 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 7a  ar = 0;..  if( z
8ca0: 49 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61  In==0 ) return a
8cb0: 66 66 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e  ff;.  while( zIn
8cc0: 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20 28  [0] ){.    h = (
8cd0: 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55  h<<8) + sqlite3U
8ce0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49  pperToLower[(*zI
8cf0: 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49  n)&0xff];.    zI
8d00: 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d  n++;.    if( h==
8d10: 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c  (('c'<<24)+('h'<
8d20: 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72  <16)+('a'<<8)+'r
8d30: 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  ') ){           
8d40: 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20    /* CHAR */.   
8d50: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8d60: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 20 20  AFF_TEXT;.      
8d70: 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20 20  zChar = zIn;.   
8d80: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
8d90: 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'c'<<24)+('l'<<1
8da0: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29  6)+('o'<<8)+'b')
8db0: 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f   ){       /* CLO
8dc0: 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  B */.      aff =
8dd0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
8de0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8df0: 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27  h==(('t'<<24)+('
8e00: 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29  e'<<16)+('x'<<8)
8e10: 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'t') ){       /
8e20: 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20  * TEXT */.      
8e30: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
8e40: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
8e50: 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32   if( h==(('b'<<2
8e60: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
8e70: 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20  '<<8)+'b')      
8e80: 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20      /* BLOB */. 
8e90: 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d         && (aff==
8ea0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
8eb0: 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  IC || aff==SQLIT
8ec0: 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20  E_AFF_REAL) ){. 
8ed0: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
8ee0: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
8ef0: 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28    if( zIn[0]=='(
8f00: 27 20 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b  ' ) zChar = zIn;
8f10: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8f20: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
8f30: 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  INT.    }else if
8f40: 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b  ( h==(('r'<<24)+
8f50: 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c  ('e'<<16)+('a'<<
8f60: 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20 20  8)+'l')         
8f70: 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20   /* REAL */.    
8f80: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
8f90: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
8fa0: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
8fb0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
8fc0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
8fd0: 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('f'<<24)+('l'<
8fe0: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61  <16)+('o'<<8)+'a
8ff0: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ')          /* F
9000: 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  LOA */.        &
9010: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
9020: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
9030: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
9040: 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65  AFF_REAL;.    }e
9050: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64 27  lse if( h==(('d'
9060: 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b  <<24)+('o'<<16)+
9070: 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20 20  ('u'<<8)+'b')   
9080: 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a         /* DOUB *
9090: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
90a0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
90b0: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
90c0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
90d0: 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  EAL;.#endif.    
90e0: 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30 78 30  }else if( (h&0x0
90f0: 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c  0FFFFFF)==(('i'<
9100: 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74  <16)+('n'<<8)+'t
9110: 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20  ') ){    /* INT 
9120: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
9130: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
9140: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
9150: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
9160: 49 66 20 70 73 7a 45 73 74 20 69 73 20 6e 6f 74  If pszEst is not
9170: 20 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20   NULL, store an 
9180: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
9190: 66 69 65 6c 64 20 73 69 7a 65 2e 20 20 54 68 65  field size.  The
91a0: 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 69  .  ** estimate i
91b0: 73 20 73 63 61 6c 65 64 20 73 6f 20 74 68 61 74  s scaled so that
91c0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20   the size of an 
91d0: 69 6e 74 65 67 65 72 20 69 73 20 31 2e 20 20 2a  integer is 1.  *
91e0: 2f 0a 20 20 69 66 28 20 70 73 7a 45 73 74 20 29  /.  if( pszEst )
91f0: 7b 0a 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20  {.    *pszEst = 
9200: 31 3b 20 20 20 2f 2a 20 64 65 66 61 75 6c 74 20  1;   /* default 
9210: 73 69 7a 65 20 69 73 20 61 70 70 72 6f 78 20 34  size is approx 4
9220: 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 66   bytes */.    if
9230: 28 20 61 66 66 3c 3d 53 51 4c 49 54 45 5f 41 46  ( aff<=SQLITE_AF
9240: 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  F_NONE ){.      
9250: 69 66 28 20 7a 43 68 61 72 20 29 7b 0a 20 20 20  if( zChar ){.   
9260: 20 20 20 20 20 77 68 69 6c 65 28 20 7a 43 68 61       while( zCha
9270: 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[0] ){.        
9280: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 64    if( sqlite3Isd
9290: 69 67 69 74 28 7a 43 68 61 72 5b 30 5d 29 20 29  igit(zChar[0]) )
92a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
92b0: 74 20 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t v = 0;.       
92c0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 74 49       sqlite3GetI
92d0: 6e 74 33 32 28 7a 43 68 61 72 2c 20 26 76 29 3b  nt32(zChar, &v);
92e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 20 3d  .            v =
92f0: 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20 20 20   v/4 + 1;.      
9300: 20 20 20 20 20 20 69 66 28 20 76 3e 32 35 35 20        if( v>255 
9310: 29 20 76 20 3d 20 32 35 35 3b 0a 20 20 20 20 20  ) v = 255;.     
9320: 20 20 20 20 20 20 20 2a 70 73 7a 45 73 74 20 3d         *pszEst =
9330: 20 76 3b 20 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20   v; /* BLOB(k), 
9340: 56 41 52 43 48 41 52 28 6b 29 2c 20 43 48 41 52  VARCHAR(k), CHAR
9350: 28 6b 29 20 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29  (k) -> r=(k/4+1)
9360: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
9370: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
9380: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 43 68   }.          zCh
9390: 61 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ar++;.        }.
93a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
93b0: 20 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 35       *pszEst = 5
93c0: 3b 20 20 20 2f 2a 20 42 4c 4f 42 2c 20 54 45 58  ;   /* BLOB, TEX
93d0: 54 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d 35 20 20  T, CLOB -> r=5  
93e0: 28 61 70 70 72 6f 78 20 32 30 20 62 79 74 65 73  (approx 20 bytes
93f0: 29 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )*/.      }.    
9400: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  }.  }.  return a
9410: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ff;.}../*.** Thi
9420: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
9430: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
9440: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
9450: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
9460: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
9470: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  LE statement.  T
9480: 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20  he pFirst token 
9490: 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  is the first.** 
94a0: 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71  token in the seq
94b0: 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20  uence of tokens 
94c0: 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68  that describe th
94d0: 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a  e type of the.**
94e0: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
94f0: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
9500: 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73  tion.   pLast is
9510: 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a   the last token.
9520: 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e  ** in the sequen
9530: 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e  ce.  Use this in
9540: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e  formation to con
9550: 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a  struct a string.
9560: 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ** that contains
9570: 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66   the typename of
9580: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   the column and 
9590: 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e  store that strin
95a0: 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a  g.** in zType..*
95b0: 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  / .void sqlite3A
95c0: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72  ddColumnType(Par
95d0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
95e0: 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62  n *pType){.  Tab
95f0: 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20  le *p;.  Column 
9600: 2a 70 43 6f 6c 3b 0a 0a 20 20 70 20 3d 20 70 50  *pCol;..  p = pP
9610: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
9620: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e  .  if( p==0 || N
9630: 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20  EVER(p->nCol<1) 
9640: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c  ) return;.  pCol
9650: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e   = &p->aCol[p->n
9660: 43 6f 6c 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74  Col-1];.  assert
9670: 28 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30  ( pCol->zType==0
9680: 20 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70   );.  pCol->zTyp
9690: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
96a0: 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
96b0: 3e 64 62 2c 20 70 54 79 70 65 29 3b 0a 20 20 70  >db, pType);.  p
96c0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
96d0: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
96e0: 79 70 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 2c  ype(pCol->zType,
96f0: 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 3b 0a   &pCol->szEst);.
9700: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70  }../*.** The exp
9710: 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64  ression is the d
9720: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
9730: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
9740: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a  ly added column.
9750: 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
9760: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
9770: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a  construction..**
9780: 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75  .** Default valu
9790: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75  e expressions mu
97a0: 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20  st be constant. 
97b0: 20 52 61 69 73 65 20 61 6e 20 65 78 63 65 70 74   Raise an except
97c0: 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69  ion if this.** i
97d0: 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a  s not the case..
97e0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
97f0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
9800: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
9810: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
9820: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
9830: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
9840: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
9850: 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74  qlite3AddDefault
9860: 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61  Value(Parse *pPa
9870: 72 73 65 2c 20 45 78 70 72 53 70 61 6e 20 2a 70  rse, ExprSpan *p
9880: 53 70 61 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Span){.  Table *
9890: 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  p;.  Column *pCo
98a0: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  l;.  sqlite3 *db
98b0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
98c0: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
98d0: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 21  wTable;.  if( p!
98e0: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d  =0 ){.    pCol =
98f0: 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43   &(p->aCol[p->nC
9900: 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20  ol-1]);.    if( 
9910: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
9920: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
9930: 28 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 20 29  (pSpan->pExpr) )
9940: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
9950: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
9960: 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f  "default value o
9970: 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73  f column [%s] is
9980: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a   not constant",.
9990: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
99a0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
99b0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63 6f  e{.      /* A co
99c0: 70 79 20 6f 66 20 70 45 78 70 72 20 69 73 20 75  py of pExpr is u
99d0: 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74  sed instead of t
99e0: 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20  he original, as 
99f0: 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20  pExpr contains. 
9a00: 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74       ** tokens t
9a10: 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c  hat point to vol
9a20: 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 20 54 68  atile memory. Th
9a30: 65 20 27 73 70 61 6e 27 20 6f 66 20 74 68 65 20  e 'span' of the 
9a40: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20  expression.     
9a50: 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 20   ** is required 
9a60: 62 79 20 70 72 61 67 6d 61 20 74 61 62 6c 65 5f  by pragma table_
9a70: 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  info..      */. 
9a80: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
9a90: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d  Delete(db, pCol-
9aa0: 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 70  >pDflt);.      p
9ab0: 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c  Col->pDflt = sql
9ac0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
9ad0: 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c 20 45 58  pSpan->pExpr, EX
9ae0: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
9af0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
9b00: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66  ee(db, pCol->zDf
9b10: 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  lt);.      pCol-
9b20: 3e 7a 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33  >zDflt = sqlite3
9b30: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
9b40: 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61  har*)pSpan->zSta
9b50: 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt,.            
9b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b70: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70           (int)(p
9b80: 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70  Span->zEnd - pSp
9b90: 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20  an->zStart));.  
9ba0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
9bb0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
9bc0: 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d  pSpan->pExpr);.}
9bd0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74  ../*.** Designat
9be0: 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  e the PRIMARY KE
9bf0: 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  Y for the table.
9c00: 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73    pList is a lis
9c10: 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f  t of names .** o
9c20: 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66  f columns that f
9c30: 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20  orm the primary 
9c40: 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69  key.  If pList i
9c50: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  s NULL, then the
9c60: 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  .** most recentl
9c70: 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f  y added column o
9c80: 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74  f the table is t
9c90: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a  he primary key..
9ca0: 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61  **.** A table ca
9cb0: 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f  n have at most o
9cc0: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  ne primary key. 
9cd0: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   If the table al
9ce0: 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70  ready has.** a p
9cf0: 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20  rimary key (and 
9d00: 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f  this is the seco
9d10: 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20  nd primary key) 
9d20: 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a  then create an.*
9d30: 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  * error..**.** I
9d40: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
9d50: 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65  Y is on a single
9d60: 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61   column whose da
9d70: 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47 45  tatype is INTEGE
9d80: 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69  R,.** then we wi
9d90: 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  ll try to use th
9da0: 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65  at column as the
9db0: 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65   rowid.  Set the
9dc0: 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20   Table.iPKey.** 
9dd0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62  field of the tab
9de0: 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
9df0: 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20  ction to be the 
9e00: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
9e10: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
9e20: 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62  KEY column.  Tab
9e30: 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20  le.iPKey is set 
9e40: 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69  to -1 if there i
9e50: 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20  s.** no INTEGER 
9e60: 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a  PRIMARY KEY..**.
9e70: 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73  ** If the key is
9e80: 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20   not an INTEGER 
9e90: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
9ea0: 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  n create a uniqu
9eb0: 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74  e.** index for t
9ec0: 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65  he key.  No inde
9ed0: 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72  x is created for
9ee0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
9ef0: 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   KEYs..*/.void s
9f00: 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79  qlite3AddPrimary
9f10: 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Key(.  Parse *pP
9f20: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
9f30: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9f40: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9f50: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69  ,  /* List of fi
9f60: 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20  eld names to be 
9f70: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
9f80: 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
9f90: 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
9fa0: 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63  h a uniqueness c
9fb0: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74  onflict */.  int
9fc0: 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f   autoInc,      /
9fd0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41 55  * True if the AU
9fe0: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77  TOINCREMENT keyw
9ff0: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
a000: 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
a010: 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  r     /* SQLITE_
a020: 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45  SO_ASC or SQLITE
a030: 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20  _SO_DESC */.){. 
a040: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
a050: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
a060: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20  ;.  char *zType 
a070: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20  = 0;.  int iCol 
a080: 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 6e 74 20 6e  = -1, i;.  int n
a090: 54 65 72 6d 3b 0a 20 20 69 66 28 20 70 54 61 62  Term;.  if( pTab
a0a0: 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  ==0 || IN_DECLAR
a0b0: 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 70 72  E_VTAB ) goto pr
a0c0: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
a0d0: 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46    if( pTab->tabF
a0e0: 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69  lags & TF_HasPri
a0f0: 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20 20 20 73  maryKey ){.    s
a100: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
a110: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74  Parse, .      "t
a120: 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20  able \"%s\" has 
a130: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72  more than one pr
a140: 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62  imary key", pTab
a150: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
a160: 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  to primary_key_e
a170: 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  xit;.  }.  pTab-
a180: 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
a190: 48 61 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a 20  HasPrimaryKey;. 
a1a0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
a1b0: 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62  .    iCol = pTab
a1c0: 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20  ->nCol - 1;.    
a1d0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
a1e0: 2e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c  .colFlags |= COL
a1f0: 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20  FLAG_PRIMKEY;.  
a200: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
a210: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
a220: 3b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 31 3b  ;.    nTerm = 1;
a230: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 54  .  }else{.    nT
a240: 65 72 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  erm = pList->nEx
a250: 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  pr;.    for(i=0;
a260: 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a   i<nTerm; i++){.
a270: 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30        for(iCol=0
a280: 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ; iCol<pTab->nCo
a290: 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
a2a0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
a2b0: 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
a2c0: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i].zName, pTab->
a2d0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
a2e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
a2f0: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f    pTab->aCol[iCo
a300: 6c 5d 2e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l].colFlags |= C
a310: 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a  OLFLAG_PRIMKEY;.
a320: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
a330: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
a340: 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20  l].zType;.      
a350: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a360: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
a370: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 54 65   }.  }.  if( nTe
a380: 72 6d 3d 3d 31 0a 20 20 20 26 26 20 7a 54 79 70  rm==1.   && zTyp
a390: 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  e && sqlite3StrI
a3a0: 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45  Cmp(zType, "INTE
a3b0: 47 45 52 22 29 3d 3d 30 0a 20 20 20 26 26 20 73  GER")==0.   && s
a3c0: 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45  ortOrder==SQLITE
a3d0: 5f 53 4f 5f 41 53 43 0a 20 20 29 7b 0a 20 20 20  _SO_ASC.  ){.   
a3e0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69   pTab->iPKey = i
a3f0: 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b  Col;.    pTab->k
a400: 65 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45  eyConf = (u8)onE
a410: 72 72 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74  rror;.    assert
a420: 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20  ( autoInc==0 || 
a430: 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20  autoInc==1 );.  
a440: 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
a450: 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41   |= autoInc*TF_A
a460: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20  utoincrement;.  
a470: 20 20 69 66 28 20 70 4c 69 73 74 20 29 20 70 50    if( pList ) pP
a480: 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64  arse->iPkSortOrd
a490: 65 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  er = pList->a[0]
a4a0: 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 65  .sortOrder;.  }e
a4b0: 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20  lse if( autoInc 
a4c0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
a4d0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
a4e0: 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33  MENT.    sqlite3
a4f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
a500: 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20   "AUTOINCREMENT 
a510: 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20  is only allowed 
a520: 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22  on an ".       "
a530: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
a540: 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  KEY");.#endif.  
a550: 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 20  }else{.    Vdbe 
a560: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
a570: 62 65 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  be;.    Index *p
a580: 3b 0a 20 20 20 20 69 66 28 20 76 20 29 20 70 50  ;.    if( v ) pP
a590: 61 72 73 65 2d 3e 61 64 64 72 53 6b 69 70 50 4b  arse->addrSkipPK
a5a0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
a5b0: 64 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29  dOp0(v, OP_Noop)
a5c0: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
a5d0: 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61  3CreateIndex(pPa
a5e0: 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c  rse, 0, 0, 0, pL
a5f0: 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c  ist, onError, 0,
a600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a610: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73              0, s
a620: 6f 72 74 4f 72 64 65 72 2c 20 30 29 3b 0a 20 20  ortOrder, 0);.  
a630: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
a640: 20 70 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20   p->autoIndex = 
a650: 32 3b 0a 20 20 20 20 20 20 69 66 28 20 76 20 29  2;.      if( v )
a660: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
a670: 48 65 72 65 28 76 2c 20 70 50 61 72 73 65 2d 3e  Here(v, pParse->
a680: 61 64 64 72 53 6b 69 70 50 4b 29 3b 0a 20 20 20  addrSkipPK);.   
a690: 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30   }.    pList = 0
a6a0: 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b  ;.  }..primary_k
a6b0: 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ey_exit:.  sqlit
a6c0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
a6d0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69  (pParse->db, pLi
a6e0: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  st);.  return;.}
a6f0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
a700: 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  w CHECK constrai
a710: 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  nt to the table 
a720: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
a730: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f  construction..*/
a740: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
a750: 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28  CheckConstraint(
a760: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a770: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
a780: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
a790: 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f  r *pCheckExpr  /
a7a0: 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78 70 72  * The check expr
a7b0: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66  ession */.){.#if
a7c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a7d0: 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a  _CHECK.  Table *
a7e0: 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
a7f0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
a800: 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c  pTab && !IN_DECL
a810: 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  ARE_VTAB ){.    
a820: 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73  pTab->pCheck = s
a830: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
a840: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 54 61  pend(pParse, pTa
a850: 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68 65 63  b->pCheck, pChec
a860: 6b 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  kExpr);.    if( 
a870: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
a880: 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20 20 20  ntName.n ){.    
a890: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
a8a0: 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  tSetName(pParse,
a8b0: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 26   pTab->pCheck, &
a8c0: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
a8d0: 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20  ntName, 1);.    
a8e0: 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
a8f0: 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
a900: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
a910: 65 2d 3e 64 62 2c 20 70 43 68 65 63 6b 45 78 70  e->db, pCheckExp
a920: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
a930: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
a940: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74  on function of t
a950: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
a960: 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f   parsed table co
a970: 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43  lumn.** to the C
a980: 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f  ollSeq given..*/
a990: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
a9a0: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
a9b0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
a9c0: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62   *pToken){.  Tab
a9d0: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
a9e0: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20    char *zColl;  
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
aa00: 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20  equoted name of 
aa10: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
aa20: 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ce */.  sqlite3 
aa30: 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d  *db;..  if( (p =
aa40: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
aa50: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
aa60: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
aa70: 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
aa80: 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73  >db;.  zColl = s
aa90: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
aaa0: 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b  ken(db, pToken);
aab0: 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20  .  if( !zColl ) 
aac0: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73  return;..  if( s
aad0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
aae0: 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
aaf0: 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  l) ){.    Index 
ab00: 2a 70 49 64 78 3b 0a 20 20 20 20 73 71 6c 69 74  *pIdx;.    sqlit
ab10: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
ab20: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a  aCol[i].zColl);.
ab30: 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a      p->aCol[i].z
ab40: 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20  Coll = zColl;.  
ab50: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
ab60: 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65  olumn is declare
ab70: 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49  d as "<name> PRI
ab80: 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45  MARY KEY COLLATE
ab90: 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a   <type>",.    **
aba0: 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d   then an index m
abb0: 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72 65  ay have been cre
abc0: 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c  ated on this col
abd0: 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20  umn before the. 
abe0: 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20     ** collation 
abf0: 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e 20  type was added. 
ac00: 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66 20  Correct this if 
ac10: 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  it is the case..
ac20: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
ac30: 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70  Idx=p->pIndex; p
ac40: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
ac50: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
ac60: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79  sert( pIdx->nKey
ac70: 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Col==1 );.      
ac80: 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
ac90: 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20  mn[0]==i ){.    
aca0: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
acb0: 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d  [0] = p->aCol[i]
acc0: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  .zColl;.      }.
acd0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
ace0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
acf0: 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, zColl);.  }
ad00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
ad10: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
ad20: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
ad30: 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62  quence for datab
ad40: 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a  ase native text.
ad50: 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e  ** encoding iden
ad60: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73 74  tified by the st
ad70: 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67  ring zName, leng
ad80: 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  th nName..**.** 
ad90: 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
ada0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
adb0: 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  nce is not avail
adc0: 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61  able, or not ava
add0: 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65  ilable.** in the
ade0: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
adf0: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63   encoding, the c
ae00: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
ae10: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a   is invoked to.*
ae20: 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49 66  * request it. If
ae30: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
ae40: 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20  actory does not 
ae50: 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73 65  supply such a se
ae60: 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74  quence,.** and t
ae70: 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20 61  he sequence is a
ae80: 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74  vailable in anot
ae90: 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  her text encodin
aea0: 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a  g, then that is.
aeb0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  ** returned inst
aec0: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ead..**.** If no
aed0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
aee0: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
aef0: 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61  tions sequence a
af00: 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72  re available, or
af10: 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f  .** another erro
af20: 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
af30: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61  s returned and a
af40: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
af50: 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
af60: 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pParse..**.** Th
af70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
af80: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
af90: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
afa0: 71 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69  q().  This routi
afb0: 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68  ne.** invokes th
afc0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
afd0: 6f 72 79 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ory if the named
afe0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f   collation canno
aff0: 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e  t be found.** an
b000: 64 20 67 65 6e 65 72 61 74 65 73 20 61 6e 20 65  d generates an e
b010: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2a  rror message..**
b020: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71  .** See also: sq
b030: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
b040: 28 29 2c 20 73 71 6c 69 74 65 33 47 65 74 43 6f  (), sqlite3GetCo
b050: 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53  llSeq().*/.CollS
b060: 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74  eq *sqlite3Locat
b070: 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  eCollSeq(Parse *
b080: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
b090: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71  ar *zName){.  sq
b0a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
b0b0: 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63  se->db;.  u8 enc
b0c0: 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38   = ENC(db);.  u8
b0d0: 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e   initbusy = db->
b0e0: 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c  init.busy;.  Col
b0f0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20  lSeq *pColl;..  
b100: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
b110: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65  indCollSeq(db, e
b120: 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e 69 74 62  nc, zName, initb
b130: 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69  usy);.  if( !ini
b140: 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c  tbusy && (!pColl
b150: 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70   || !pColl->xCmp
b160: 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  ) ){.    pColl =
b170: 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
b180: 65 71 28 70 50 61 72 73 65 2c 20 65 6e 63 2c 20  eq(pParse, enc, 
b190: 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20  pColl, zName);. 
b1a0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f   }..  return pCo
b1b0: 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  ll;.}.../*.** Ge
b1c0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
b1d0: 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20   will increment 
b1e0: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
b1f0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68  e..**.** The sch
b200: 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73  ema cookie is us
b210: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
b220: 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20  when the schema 
b230: 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  for the.** datab
b240: 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66  ase changes.  Af
b250: 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61 20  ter each schema 
b260: 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b  change, the cook
b270: 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e  ie value.** chan
b280: 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f  ges.  When a pro
b290: 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64 73  cess first reads
b2a0: 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20 72   the schema it r
b2b0: 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f  ecords the.** co
b2c0: 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74 65  okie.  Thereafte
b2d0: 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20 67  r, whenever it g
b2e0: 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68  oes to access th
b2f0: 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69  e database,.** i
b300: 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f  t checks the coo
b310: 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  kie to make sure
b320: 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20   the schema has 
b330: 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73  not changed.** s
b340: 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74  ince it was last
b350: 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   read..**.** Thi
b360: 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f  s plan is not co
b370: 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d  mpletely bullet-
b380: 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f  proof.  It is po
b390: 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68  ssible for.** th
b3a0: 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e  e schema to chan
b3b0: 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ge multiple time
b3c0: 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f  s and for the co
b3d0: 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65  okie to be.** se
b3e0: 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20  t back to prior 
b3f0: 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65  value.  But sche
b400: 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 69  ma changes are i
b410: 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64  nfrequent.** and
b420: 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
b430: 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65 20   of hitting the 
b440: 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75  same cookie valu
b450: 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63  e is only.** 1 c
b460: 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20  hance in 2^32.  
b470: 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65 6e  So we're safe en
b480: 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ough..*/.void sq
b490: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
b4a0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
b4b0: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74   int iDb){.  int
b4c0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
b4d0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
b4e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
b4f0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
b500: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
b510: 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
b520: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
b530: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
b540: 2c 20 30 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  , 0) );.  sqlite
b550: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b560: 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61  P_Integer, db->a
b570: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
b580: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31  >schema_cookie+1
b590: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
b5a0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b5b0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
b5c0: 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45   BTREE_SCHEMA_VE
b5d0: 52 53 49 4f 4e 2c 20 72 31 29 3b 0a 20 20 73 71  RSION, r1);.  sq
b5e0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
b5f0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
b600: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72  .}../*.** Measur
b610: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
b620: 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65  characters neede
b630: 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  d to output the 
b640: 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66  given.** identif
b650: 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ier.  The number
b660: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
b670: 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73  es any quotes us
b680: 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e  ed.** but does n
b690: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  ot include the n
b6a0: 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ull terminator..
b6b0: 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61  **.** The estima
b6c0: 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69  te is conservati
b6d0: 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65  ve.  It might be
b6e0: 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61   larger that wha
b6f0: 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e  t is.** really n
b700: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
b710: 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68   int identLength
b720: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
b730: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28  .  int n;.  for(
b740: 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b  n=0; *z; n++, z+
b750: 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
b760: 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20  '"' ){ n++; }.  
b770: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32  }.  return n + 2
b780: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
b790: 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 69  irst parameter i
b7a0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
b7b0: 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  n output buffer.
b7c0: 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   The second .** 
b7d0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
b7e0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74  ointer to an int
b7f0: 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69  eger that contai
b800: 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20 61 74  ns the offset at
b810: 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72 69  .** which to wri
b820: 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  te into the outp
b830: 75 74 20 62 75 66 66 65 72 2e 20 54 68 69 73 20  ut buffer. This 
b840: 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73 20  function copies 
b850: 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  the.** nul-termi
b860: 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f 69  nated string poi
b870: 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 74  nted to by the t
b880: 68 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c 20  hird parameter, 
b890: 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a  zSignedIdent,.**
b8a0: 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
b8b0: 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  d offset in the 
b8c0: 62 75 66 66 65 72 20 61 6e 64 20 75 70 64 61 74  buffer and updat
b8d0: 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66 65  es *pIdx to refe
b8e0: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73  r.** to the firs
b8f0: 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68 65  t byte after the
b900: 20 6c 61 73 74 20 62 79 74 65 20 77 72 69 74 74   last byte writt
b910: 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  en before return
b920: 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  ing..** .** If t
b930: 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e 65  he string zSigne
b940: 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73 20  dIdent consists 
b950: 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70 68  entirely of alph
b960: 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61  a-numeric.** cha
b970: 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e 6f  racters, does no
b980: 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 64  t begin with a d
b990: 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74 20  igit and is not 
b9a0: 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c 0a  an SQL keyword,.
b9b0: 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f  ** then it is co
b9c0: 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70  pied to the outp
b9d0: 75 74 20 62 75 66 66 65 72 20 65 78 61 63 74 6c  ut buffer exactl
b9e0: 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68 65  y as it is. Othe
b9f0: 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20  rwise,.** it is 
ba00: 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f 75  quoted using dou
ba10: 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73  ble-quotes..*/.s
ba20: 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74  tatic void ident
ba30: 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74  Put(char *z, int
ba40: 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53   *pIdx, char *zS
ba50: 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75  ignedIdent){.  u
ba60: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
ba70: 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  dent = (unsigned
ba80: 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64   char*)zSignedId
ba90: 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  ent;.  int i, j,
baa0: 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20   needQuote;.  i 
bab0: 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72 28  = *pIdx;..  for(
bac0: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
bad0: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73  j++){.    if( !s
bae0: 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 49  qlite3Isalnum(zI
baf0: 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65  dent[j]) && zIde
bb00: 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65  nt[j]!='_' ) bre
bb10: 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75  ak;.  }.  needQu
bb20: 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73 64  ote = sqlite3Isd
bb30: 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a  igit(zIdent[0]).
bb40: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
bb50: 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64  qlite3KeywordCod
bb60: 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b  e(zIdent, j)!=TK
bb70: 5f 49 44 0a 20 20 20 20 20 20 20 20 20 20 20 20  _ID.            
bb80: 7c 7c 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 0a  || zIdent[j]!=0.
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6a              || j
bba0: 3d 3d 30 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64  ==0;..  if( need
bbb0: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
bbc0: 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b   '"';.  for(j=0;
bbd0: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
bbe0: 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a  {.    z[i++] = z
bbf0: 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66  Ident[j];.    if
bc00: 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27  ( zIdent[j]=='"'
bc10: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
bc20: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51  .  }.  if( needQ
bc30: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
bc40: 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b  '"';.  z[i] = 0;
bc50: 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a  .  *pIdx = i;.}.
bc60: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
bc70: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
bc80: 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72  tatement appropr
bc90: 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76  iate for the giv
bca0: 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65  en.** table.  Me
bcb0: 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  mory to hold the
bcc0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74 61   text of the sta
bcd0: 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e  tement is obtain
bce0: 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74  ed.** from sqlit
bcf0: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
bd00: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
bd10: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
bd20: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ion..*/.static c
bd30: 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65  har *createTable
bd40: 53 74 6d 74 28 73 71 6c 69 74 65 33 20 2a 64 62  Stmt(sqlite3 *db
bd50: 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69  , Table *p){.  i
bd60: 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68  nt i, k, n;.  ch
bd70: 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61  ar *zStmt;.  cha
bd80: 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c  r *zSep, *zSep2,
bd90: 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e   *zEnd;.  Column
bda0: 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b   *pCol;.  n = 0;
bdb0: 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d  .  for(pCol = p-
bdc0: 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d  >aCol, i=0; i<p-
bdd0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
bde0: 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64  ++){.    n += id
bdf0: 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e  entLength(pCol->
be00: 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a 20 20 7d 0a  zName) + 5;.  }.
be10: 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67    n += identLeng
be20: 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  th(p->zName);.  
be30: 69 66 28 20 6e 3c 35 30 20 29 7b 20 0a 20 20 20  if( n<50 ){ .   
be40: 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20   zSep = "";.    
be50: 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20  zSep2 = ",";.   
be60: 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d   zEnd = ")";.  }
be70: 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d  else{.    zSep =
be80: 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65   "\n  ";.    zSe
be90: 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20  p2 = ",\n  ";.  
bea0: 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a    zEnd = "\n)";.
beb0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 69    }.  assert( si
bec0: 7a 65 6f 66 28 70 2d 3e 6e 43 6f 6c 29 3d 3d 32  zeof(p->nCol)==2
bed0: 20 29 3b 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20   );.  n += 35 + 
bee0: 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74  6*p->nCol;.  zSt
bef0: 6d 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  mt = sqlite3DbMa
bf00: 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 29 3b 0a 20  llocRaw(0, n);. 
bf10: 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 7b   if( zStmt==0 ){
bf20: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
bf30: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 72  ailed = 1;.    r
bf40: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
bf50: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
bf60: 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45 41 54  n, zStmt, "CREAT
bf70: 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20  E TABLE ");.  k 
bf80: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
bf90: 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e  0(zStmt);.  iden
bfa0: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
bfb0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74  p->zName);.  zSt
bfc0: 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20  mt[k++] = '(';. 
bfd0: 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f   for(pCol=p->aCo
bfe0: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
bff0: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
c000: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
c010: 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61  t char * const a
c020: 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  zType[] = {.    
c030: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
c040: 46 5f 54 45 58 54 20 20 20 20 2a 2f 20 22 20 54  F_TEXT    */ " T
c050: 45 58 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  EXT",.        /*
c060: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
c070: 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20 20      */ "",.     
c080: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
c090: 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22 20 4e 55  _NUMERIC */ " NU
c0a0: 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  M",.        /* S
c0b0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
c0c0: 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a 20 20 20  R */ " INT",.   
c0d0: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
c0e0: 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f 20 22 20  FF_REAL    */ " 
c0f0: 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a 20 20 20  REAL".    };.   
c100: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63 6f   int len;.    co
c110: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
c120: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ..    sqlite3_sn
c130: 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74  printf(n-k, &zSt
c140: 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20  mt[k], zSep);.  
c150: 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    k += sqlite3St
c160: 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74 5b 6b 5d  rlen30(&zStmt[k]
c170: 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53  );.    zSep = zS
c180: 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75  ep2;.    identPu
c190: 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f  t(zStmt, &k, pCo
c1a0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 61  l->zName);.    a
c1b0: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66  ssert( pCol->aff
c1c0: 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46  inity-SQLITE_AFF
c1d0: 5f 54 45 58 54 20 3e 3d 20 30 20 29 3b 0a 20 20  _TEXT >= 0 );.  
c1e0: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
c1f0: 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f  affinity-SQLITE_
c200: 41 46 46 5f 54 45 58 54 20 3c 20 41 72 72 61 79  AFF_TEXT < Array
c210: 53 69 7a 65 28 61 7a 54 79 70 65 29 20 29 3b 0a  Size(azType) );.
c220: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
c230: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
c240: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b  LITE_AFF_TEXT );
c250: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
c260: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
c270: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
c280: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
c290: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
c2a0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
c2b0: 49 43 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IC );.    testca
c2c0: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
c2d0: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ty==SQLITE_AFF_I
c2e0: 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 74 65  NTEGER );.    te
c2f0: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
c300: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
c310: 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20 20 20 0a  FF_REAL );.    .
c320: 20 20 20 20 7a 54 79 70 65 20 3d 20 61 7a 54 79      zType = azTy
c330: 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  pe[pCol->affinit
c340: 79 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  y - SQLITE_AFF_T
c350: 45 58 54 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  EXT];.    len = 
c360: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
c370: 7a 54 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65  zType);.    asse
c380: 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  rt( pCol->affini
c390: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ty==SQLITE_AFF_N
c3a0: 4f 4e 45 20 0a 20 20 20 20 20 20 20 20 20 20 20  ONE .           
c3b0: 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69   || pCol->affini
c3c0: 74 79 3d 3d 73 71 6c 69 74 65 33 41 66 66 69 6e  ty==sqlite3Affin
c3d0: 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c 20 30  ityType(zType, 0
c3e0: 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) );.    memcpy(
c3f0: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65  &zStmt[k], zType
c400: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d  , len);.    k +=
c410: 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74   len;.    assert
c420: 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20  ( k<=n );.  }.  
c430: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
c440: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
c450: 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20   "%s", zEnd);.  
c460: 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a  return zStmt;.}.
c470: 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 61 6e  ./*.** Resize an
c480: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f   Index object to
c490: 20 68 6f 6c 64 20 4e 20 63 6f 6c 75 6d 6e 73 20   hold N columns 
c4a0: 74 6f 74 61 6c 2e 20 20 52 65 74 75 72 6e 20 53  total.  Return S
c4b0: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
c4c0: 75 63 63 65 73 73 20 61 6e 64 20 53 51 4c 49 54  uccess and SQLIT
c4d0: 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61 6e 20 4f 4f  E_NOMEM on an OO
c4e0: 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  M error..*/.stat
c4f0: 69 63 20 69 6e 74 20 72 65 73 69 7a 65 49 6e 64  ic int resizeInd
c500: 65 78 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33  exObject(sqlite3
c510: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64   *db, Index *pId
c520: 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 63 68 61  x, int N){.  cha
c530: 72 20 2a 7a 45 78 74 72 61 3b 0a 20 20 69 36 34  r *zExtra;.  i64
c540: 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 49   nByte;.  if( pI
c550: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20 29  dx->nColumn>=N )
c560: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c570: 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  K;.  assert( pId
c580: 78 2d 3e 69 73 52 65 73 69 7a 65 64 3d 3d 30 20  x->isResized==0 
c590: 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28 73 69  );.  nByte = (si
c5a0: 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b 20 73 69  zeof(char*) + si
c5b0: 7a 65 6f 66 28 69 31 36 29 20 2b 20 31 29 2a 28  zeof(i16) + 1)*(
c5c0: 69 36 34 29 4e 3b 0a 20 20 7a 45 78 74 72 61 20  i64)N;.  zExtra 
c5d0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
c5e0: 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29  cZero(db, nByte)
c5f0: 3b 0a 20 20 69 66 28 20 7a 45 78 74 72 61 3d 3d  ;.  if( zExtra==
c600: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
c610: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70  E_NOMEM;.  memcp
c620: 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e  y(zExtra, pIdx->
c630: 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66 28 63  azColl, sizeof(c
c640: 68 61 72 2a 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c  har*)*pIdx->nCol
c650: 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 7a  umn);.  pIdx->az
c660: 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29 7a  Coll = (char**)z
c670: 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20  Extra;.  zExtra 
c680: 2b 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  += sizeof(char*)
c690: 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78  *N;.  memcpy(zEx
c6a0: 74 72 61 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c  tra, pIdx->aiCol
c6b0: 75 6d 6e 2c 20 73 69 7a 65 6f 66 28 69 31 36 29  umn, sizeof(i16)
c6c0: 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b  *pIdx->nColumn);
c6d0: 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  .  pIdx->aiColum
c6e0: 6e 20 3d 20 28 69 31 36 2a 29 7a 45 78 74 72 61  n = (i16*)zExtra
c6f0: 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69  ;.  zExtra += si
c700: 7a 65 6f 66 28 69 31 36 29 2a 4e 3b 0a 20 20 6d  zeof(i16)*N;.  m
c710: 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49  emcpy(zExtra, pI
c720: 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20  dx->aSortOrder, 
c730: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a  pIdx->nColumn);.
c740: 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64    pIdx->aSortOrd
c750: 65 72 20 3d 20 28 75 38 2a 29 7a 45 78 74 72 61  er = (u8*)zExtra
c760: 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ;.  pIdx->nColum
c770: 6e 20 3d 20 4e 3b 0a 20 20 70 49 64 78 2d 3e 69  n = N;.  pIdx->i
c780: 73 52 65 73 69 7a 65 64 20 3d 20 31 3b 0a 20 20  sResized = 1;.  
c790: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c7a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  ;.}../*.** Estim
c7b0: 61 74 65 20 74 68 65 20 74 6f 74 61 6c 20 72 6f  ate the total ro
c7c0: 77 20 77 69 64 74 68 20 66 6f 72 20 61 20 74 61  w width for a ta
c7d0: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
c7e0: 6f 69 64 20 65 73 74 69 6d 61 74 65 54 61 62 6c  oid estimateTabl
c7f0: 65 57 69 64 74 68 28 54 61 62 6c 65 20 2a 70 54  eWidth(Table *pT
c800: 61 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ab){.  unsigned 
c810: 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 63 6f  wTable = 0;.  co
c820: 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62  nst Column *pTab
c830: 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Col;.  int i;.  
c840: 66 6f 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f 6c  for(i=pTab->nCol
c850: 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e  , pTabCol=pTab->
c860: 61 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  aCol; i>0; i--, 
c870: 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  pTabCol++){.    
c880: 77 54 61 62 6c 65 20 2b 3d 20 70 54 61 62 43 6f  wTable += pTabCo
c890: 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20  l->szEst;.  }.  
c8a0: 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c  if( pTab->iPKey<
c8b0: 30 20 29 20 77 54 61 62 6c 65 2b 2b 3b 0a 20 20  0 ) wTable++;.  
c8c0: 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d  pTab->szTabRow =
c8d0: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77   sqlite3LogEst(w
c8e0: 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a  Table*4);.}../*.
c8f0: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
c900: 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20  average size of 
c910: 61 20 72 6f 77 20 66 6f 72 20 61 6e 20 69 6e 64  a row for an ind
c920: 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
c930: 69 64 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78  id estimateIndex
c940: 57 69 64 74 68 28 49 6e 64 65 78 20 2a 70 49 64  Width(Index *pId
c950: 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77  x){.  unsigned w
c960: 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69 6e 74  Index = 0;.  int
c970: 20 69 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75   i;.  const Colu
c980: 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78 2d  mn *aCol = pIdx-
c990: 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 20  >pTable->aCol;. 
c9a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
c9b0: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
c9c0: 0a 20 20 20 20 69 31 36 20 78 20 3d 20 70 49 64  .    i16 x = pId
c9d0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  x->aiColumn[i];.
c9e0: 20 20 20 20 61 73 73 65 72 74 28 20 78 3c 70 49      assert( x<pI
c9f0: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  dx->pTable->nCol
ca00: 20 29 3b 0a 20 20 20 20 77 49 6e 64 65 78 20 2b   );.    wIndex +
ca10: 3d 20 78 3c 30 20 3f 20 31 20 3a 20 61 43 6f 6c  = x<0 ? 1 : aCol
ca20: 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  [pIdx->aiColumn[
ca30: 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20  i]].szEst;.  }. 
ca40: 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 20   pIdx->szIdxRow 
ca50: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
ca60: 77 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a  wIndex*4);.}../*
ca70: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
ca80: 76 61 6c 75 65 20 78 20 69 73 20 66 6f 75 6e 64  value x is found
ca90: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 69 72 73   any of the firs
caa0: 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20 6f  t nCol entries o
cab0: 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61  f aiCol[].*/.sta
cac0: 74 69 63 20 69 6e 74 20 68 61 73 43 6f 6c 75 6d  tic int hasColum
cad0: 6e 28 63 6f 6e 73 74 20 69 31 36 20 2a 61 69 43  n(const i16 *aiC
cae0: 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 6e  ol, int nCol, in
caf0: 74 20 78 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e  t x){.  while( n
cb00: 43 6f 6c 2d 2d 20 3e 20 30 20 29 20 69 66 28 20  Col-- > 0 ) if( 
cb10: 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20 29 20  x==*(aiCol++) ) 
cb20: 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
cb30: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
cb40: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
cb50: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 70   at the end of p
cb60: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
cb70: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
cb80: 74 68 61 74 0a 2a 2a 20 68 61 73 20 61 20 57 49  that.** has a WI
cb90: 54 48 4f 55 54 20 52 4f 57 49 44 20 63 6c 61 75  THOUT ROWID clau
cba0: 73 65 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20  se.  The job of 
cbb0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
cbc0: 74 6f 20 63 6f 6e 76 65 72 74 20 62 6f 74 68 0a  to convert both.
cbd0: 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  ** internal sche
cbe0: 6d 61 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ma data structur
cbf0: 65 73 20 61 6e 64 20 74 68 65 20 67 65 6e 65 72  es and the gener
cc00: 61 74 65 64 20 56 44 42 45 20 63 6f 64 65 20 73  ated VDBE code s
cc10: 6f 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 61  o that they.** a
cc20: 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  re appropriate f
cc30: 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  or a WITHOUT ROW
cc40: 49 44 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64  ID table instead
cc50: 20 6f 66 20 61 20 72 6f 77 69 64 20 74 61 62 6c   of a rowid tabl
cc60: 65 2e 0a 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e  e..** Changes in
cc70: 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  clude:.**.**    
cc80: 20 28 31 29 20 20 43 6f 6e 76 65 72 74 20 74 68   (1)  Convert th
cc90: 65 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65  e OP_CreateTable
cca0: 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 43 72 65 61   into an OP_Crea
ccb0: 74 65 49 6e 64 65 78 2e 20 20 54 68 65 72 65 20  teIndex.  There 
ccc0: 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 6e  is.**          n
ccd0: 6f 20 72 6f 77 69 64 20 62 74 72 65 65 20 66 6f  o rowid btree fo
cce0: 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  r a WITHOUT ROWI
ccf0: 44 2e 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65  D.  Instead, the
cd00: 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 20 20   canonical.**   
cd10: 20 20 20 20 20 20 20 64 61 74 61 20 73 74 6f 72         data stor
cd20: 61 67 65 20 69 73 20 61 20 63 6f 76 65 72 69 6e  age is a coverin
cd30: 67 20 69 6e 64 65 78 20 62 74 72 65 65 2e 0a 2a  g index btree..*
cd40: 2a 20 20 20 20 20 28 32 29 20 20 42 79 70 61 73  *     (2)  Bypas
cd50: 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f  s the creation o
cd60: 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  f the sqlite_mas
cd70: 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79 0a  ter table entry.
cd80: 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 20  **          for 
cd90: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
cda0: 61 73 20 74 68 65 20 74 68 65 20 70 72 69 6d 61  as the the prima
cdb0: 72 79 20 6b 65 79 20 69 6e 64 65 78 20 69 73 20  ry key index is 
cdc0: 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  now.**          
cdd0: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
cde0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
cdf0: 74 61 62 6c 65 20 65 6e 74 72 79 20 6f 66 20 74  table entry of t
ce00: 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e  he table itself.
ce10: 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 53 65 74  .**     (3)  Set
ce20: 20 74 68 65 20 49 6e 64 65 78 2e 74 6e 75 6d 20   the Index.tnum 
ce30: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
ce40: 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  EY Index object 
ce50: 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
ce60: 20 20 20 73 63 68 65 6d 61 20 74 6f 20 74 68 65     schema to the
ce70: 20 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d 20 74   rootpage from t
ce80: 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a  he main table..*
ce90: 2a 20 20 20 20 20 28 34 29 20 20 53 65 74 20 61  *     (4)  Set a
cea0: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  ll columns of th
ceb0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 73 63  e PRIMARY KEY sc
cec0: 68 65 6d 61 20 6f 62 6a 65 63 74 20 74 6f 20 62  hema object to b
ced0: 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20  e NOT NULL..**  
cee0: 20 20 20 28 35 29 20 20 41 64 64 20 61 6c 6c 20     (5)  Add all 
cef0: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f  table columns to
cf00: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
cf10: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 0a 2a 2a   Index object.**
cf20: 20 20 20 20 20 20 20 20 20 20 73 6f 20 74 68 61            so tha
cf30: 74 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  t the PRIMARY KE
cf40: 59 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20  Y is a covering 
cf50: 69 6e 64 65 78 2e 20 20 54 68 65 20 73 75 72 70  index.  The surp
cf60: 6c 75 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  lus.**          
cf70: 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70 61 72 74  columns are part
cf80: 20 6f 66 20 4b 65 79 49 6e 66 6f 2e 6e 58 46 69   of KeyInfo.nXFi
cf90: 65 6c 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20  eld and are not 
cfa0: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20  used for.**     
cfb0: 20 20 20 20 20 73 6f 72 74 69 6e 67 20 6f 72 20       sorting or 
cfc0: 6c 6f 6f 6b 75 70 20 6f 72 20 75 6e 69 71 75 65  lookup or unique
cfd0: 6e 65 73 73 20 63 68 65 63 6b 73 2e 0a 2a 2a 20  ness checks..** 
cfe0: 20 20 20 20 28 36 29 20 20 52 65 70 6c 61 63 65      (6)  Replace
cff0: 20 74 68 65 20 72 6f 77 69 64 20 74 61 69 6c 20   the rowid tail 
d000: 6f 6e 20 61 6c 6c 20 61 75 74 6f 6d 61 74 69 63  on all automatic
d010: 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 20 55  ally generated U
d020: 4e 49 51 55 45 0a 2a 2a 20 20 20 20 20 20 20 20  NIQUE.**        
d030: 20 20 69 6e 64 69 63 65 73 20 77 69 74 68 20 74    indices with t
d040: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  he PRIMARY KEY c
d050: 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  olumns..*/.stati
d060: 63 20 76 6f 69 64 20 63 6f 6e 76 65 72 74 54 6f  c void convertTo
d070: 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c  WithoutRowidTabl
d080: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
d090: 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20   Table *pTab){. 
d0a0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
d0b0: 49 6e 64 65 78 20 2a 70 50 6b 3b 0a 20 20 69 6e  Index *pPk;.  in
d0c0: 74 20 6e 50 6b 3b 0a 20 20 69 6e 74 20 69 2c 20  t nPk;.  int i, 
d0d0: 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  j;.  sqlite3 *db
d0e0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
d0f0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
d100: 65 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 2f 2a 20  e->pVdbe;..  /* 
d110: 43 6f 6e 76 65 72 74 20 74 68 65 20 4f 50 5f 43  Convert the OP_C
d120: 72 65 61 74 65 54 61 62 6c 65 20 6f 70 63 6f 64  reateTable opcod
d130: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 6f 72  e that would nor
d140: 6d 61 6c 6c 79 20 63 72 65 61 74 65 20 74 68 65  mally create the
d150: 0a 20 20 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20  .  ** root-page 
d160: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 6e  for the table in
d170: 74 6f 20 61 20 4f 50 5f 43 72 65 61 74 65 49 6e  to a OP_CreateIn
d180: 64 65 78 20 6f 70 63 6f 64 65 2e 20 20 54 68 65  dex opcode.  The
d190: 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63 72 65 61   index.  ** crea
d1a0: 74 65 64 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  ted will become 
d1b0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
d1c0: 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66  index..  */.  if
d1d0: 28 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72  ( pParse->addrCr
d1e0: 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
d1f0: 74 28 20 76 20 29 3b 0a 20 20 20 20 73 71 6c 69  t( v );.    sqli
d200: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
d210: 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61  pParse->addrCrTa
d220: 62 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  b)->opcode = OP_
d230: 43 72 65 61 74 65 49 6e 64 65 78 3b 0a 20 20 7d  CreateIndex;.  }
d240: 0a 0a 20 20 2f 2a 20 42 79 70 61 73 73 20 74 68  ..  /* Bypass th
d250: 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68  e creation of th
d260: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 62 74  e PRIMARY KEY bt
d270: 72 65 65 20 61 6e 64 20 74 68 65 20 73 71 6c 69  ree and the sqli
d280: 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74  te_master.  ** t
d290: 61 62 6c 65 20 65 6e 74 72 79 2e 0a 20 20 2a 2f  able entry..  */
d2a0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61  .  if( pParse->a
d2b0: 64 64 72 53 6b 69 70 50 4b 20 29 7b 0a 20 20 20  ddrSkipPK ){.   
d2c0: 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20   assert( v );.  
d2d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74    sqlite3VdbeGet
d2e0: 4f 70 28 76 2c 20 70 50 61 72 73 65 2d 3e 61 64  Op(v, pParse->ad
d2f0: 64 72 53 6b 69 70 50 4b 29 2d 3e 6f 70 63 6f 64  drSkipPK)->opcod
d300: 65 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d  e = OP_Goto;.  }
d310: 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
d320: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
d330: 64 65 78 2e 20 20 4f 72 2c 20 69 66 20 74 68 69  dex.  Or, if thi
d340: 73 20 74 61 62 6c 65 20 77 61 73 20 6f 72 69 67  s table was orig
d350: 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 61 6e 20 49  inally.  ** an I
d360: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
d370: 45 59 20 74 61 62 6c 65 2c 20 63 72 65 61 74 65  EY table, create
d380: 20 61 20 6e 65 77 20 50 52 49 4d 41 52 59 20 4b   a new PRIMARY K
d390: 45 59 20 69 6e 64 65 78 2e 20 0a 20 20 2a 2f 0a  EY index. .  */.
d3a0: 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65    if( pTab->iPKe
d3b0: 79 3e 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72  y>=0 ){.    Expr
d3c0: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 20  List *pList;.   
d3d0: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
d3e0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
d3f0: 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Parse, 0, 0);.  
d400: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
d410: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 69   return;.    pLi
d420: 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d  st->a[0].zName =
d430: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
d440: 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20  (pParse->db,.   
d450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d470: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
d480: 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61  pTab->iPKey].zNa
d490: 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  me);.    pList->
d4a0: 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  a[0].sortOrder =
d4b0: 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74   pParse->iPkSort
d4c0: 4f 72 64 65 72 3b 0a 20 20 20 20 61 73 73 65 72  Order;.    asser
d4d0: 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  t( pParse->pNewT
d4e0: 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20  able==pTab );.  
d4f0: 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 43    pPk = sqlite3C
d500: 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  reateIndex(pPars
d510: 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73  e, 0, 0, 0, pLis
d520: 74 2c 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66  t, pTab->keyConf
d530: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
d540: 20 20 20 69 66 28 20 70 50 6b 3d 3d 30 20 29 20     if( pPk==0 ) 
d550: 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 50 6b 2d  return;.    pPk-
d560: 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 32 3b 0a  >autoIndex = 2;.
d570: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
d580: 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = -1;.  }else{. 
d590: 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33     pPk = sqlite3
d5a0: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
d5b0: 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20 70 50 6b  pTab);.  }.  pPk
d5c0: 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31  ->isCovering = 1
d5d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 6b 21  ;.  assert( pPk!
d5e0: 3d 30 20 29 3b 0a 20 20 6e 50 6b 20 3d 20 70 50  =0 );.  nPk = pP
d5f0: 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f  k->nKeyCol;..  /
d600: 2a 20 4d 61 6b 65 20 73 75 72 65 20 65 76 65 72  * Make sure ever
d610: 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  y column of the 
d620: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 4e  PRIMARY KEY is N
d630: 4f 54 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72  OT NULL */.  for
d640: 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b  (i=0; i<nPk; i++
d650: 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  ){.    pTab->aCo
d660: 6c 5b 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  l[pPk->aiColumn[
d670: 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 31 3b  i]].notNull = 1;
d680: 0a 20 20 7d 0a 20 20 70 50 6b 2d 3e 75 6e 69 71  .  }.  pPk->uniq
d690: 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 0a 20 20  NotNull = 1;..  
d6a0: 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  /* The root page
d6b0: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
d6c0: 4b 45 59 20 69 73 20 74 68 65 20 74 61 62 6c 65  KEY is the table
d6d0: 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20   root page */.  
d6e0: 70 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54 61 62  pPk->tnum = pTab
d6f0: 2d 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55 70  ->tnum;..  /* Up
d700: 64 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  date the in-memo
d710: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
d720: 6e 20 6f 66 20 61 6c 6c 20 55 4e 49 51 55 45 20  n of all UNIQUE 
d730: 69 6e 64 69 63 65 73 20 62 79 20 63 6f 6e 76 65  indices by conve
d740: 72 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  rting.  ** the f
d750: 69 6e 61 6c 20 72 6f 77 69 64 20 63 6f 6c 75 6d  inal rowid colum
d760: 6e 20 69 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f  n into one or mo
d770: 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  re columns of th
d780: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20  e PRIMARY KEY.. 
d790: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70   */.  for(pIdx=p
d7a0: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
d7b0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
d7c0: 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  ext){.    int n;
d7d0: 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61  .    if( pIdx->a
d7e0: 75 74 6f 49 6e 64 65 78 3d 3d 32 20 29 20 63 6f  utoIndex==2 ) co
d7f0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
d800: 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b  i=n=0; i<nPk; i+
d810: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68  +){.      if( !h
d820: 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61  asColumn(pIdx->a
d830: 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e  iColumn, pIdx->n
d840: 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43  KeyCol, pPk->aiC
d850: 6f 6c 75 6d 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b  olumn[i]) ) n++;
d860: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
d870: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
d880: 54 68 69 73 20 69 6e 64 65 78 20 69 73 20 61 20  This index is a 
d890: 73 75 70 65 72 73 65 74 20 6f 66 20 74 68 65 20  superset of the 
d8a0: 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20  primary key */. 
d8b0: 20 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75       pIdx->nColu
d8c0: 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43  mn = pIdx->nKeyC
d8d0: 6f 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ol;.      contin
d8e0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
d8f0: 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a  ( resizeIndexObj
d900: 65 63 74 28 64 62 2c 20 70 49 64 78 2c 20 70 49  ect(db, pIdx, pI
d910: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29  dx->nKeyCol+n) )
d920: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72   return;.    for
d930: 28 69 3d 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b  (i=0, j=pIdx->nK
d940: 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b  eyCol; i<nPk; i+
d950: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68  +){.      if( !h
d960: 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61  asColumn(pIdx->a
d970: 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e  iColumn, pIdx->n
d980: 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43  KeyCol, pPk->aiC
d990: 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20  olumn[i]) ){.   
d9a0: 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
d9b0: 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69  umn[j] = pPk->ai
d9c0: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
d9d0: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
d9e0: 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c  j] = pPk->azColl
d9f0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b  [i];.        j++
da00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
da10: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
da20: 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d  ->nColumn>=pIdx-
da30: 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20  >nKeyCol+n );.  
da40: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
da50: 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20  nColumn>=j );.  
da60: 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20  }..  /* Add all 
da70: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f  table columns to
da80: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
da90: 20 69 6e 64 65 78 0a 20 20 2a 2f 0a 20 20 69 66   index.  */.  if
daa0: 28 20 6e 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c  ( nPk<pTab->nCol
dab0: 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73 69   ){.    if( resi
dac0: 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62  zeIndexObject(db
dad0: 2c 20 70 50 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f  , pPk, pTab->nCo
dae0: 6c 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  l) ) return;.   
daf0: 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b   for(i=0, j=nPk;
db00: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
db10: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  ++){.      if( !
db20: 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61  hasColumn(pPk->a
db30: 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29  iColumn, j, i) )
db40: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
db50: 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e  ( j<pPk->nColumn
db60: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d   );.        pPk-
db70: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69  >aiColumn[j] = i
db80: 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61  ;.        pPk->a
db90: 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 22 42 49 4e 41  zColl[j] = "BINA
dba0: 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b  RY";.        j++
dbb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dbc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d      assert( pPk-
dbd0: 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20  >nColumn==j );. 
dbe0: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
dbf0: 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 65  >nCol==j );.  }e
dc00: 6c 73 65 7b 0a 20 20 20 20 70 50 6b 2d 3e 6e 43  lse{.    pPk->nC
dc10: 6f 6c 75 6d 6e 20 3d 20 70 54 61 62 2d 3e 6e 43  olumn = pTab->nC
dc20: 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ol;.  }.}../*.**
dc30: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
dc40: 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72   called to repor
dc50: 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20  t the final ")" 
dc60: 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a  that terminates.
dc70: 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ** a CREATE TABL
dc80: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
dc90: 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72  ** The table str
dca0: 75 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65  ucture that othe
dcb0: 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65  r action routine
dcc0: 73 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c  s have been buil
dcd0: 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64  ding.** is added
dce0: 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   to the internal
dcf0: 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73   hash tables, as
dd00: 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73  suming no errors
dd10: 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65   have.** occurre
dd20: 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72  d..**.** An entr
dd30: 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  y for the table 
dd40: 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d  is made in the m
dd50: 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64  aster table on d
dd60: 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74  isk, unless.** t
dd70: 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61  his is a tempora
dd80: 72 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e  ry table or db->
dd90: 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57  init.busy==1.  W
dda0: 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  hen db->init.bus
ddb0: 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73  y==1.** it means
ddc0: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
ddd0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
dde0: 72 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20  r table because 
ddf0: 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65  we just.** conne
de00: 63 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  cted to the data
de10: 62 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20  base or because 
de20: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
de30: 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72  r table has.** r
de40: 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c  ecently changed,
de50: 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f   so the entry fo
de60: 72 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72  r this table alr
de70: 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a  eady exists in.*
de80: 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  * the sqlite_mas
de90: 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64  ter table.  We d
dea0: 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72  o not want to cr
deb0: 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a  eate it again..*
dec0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c  *.** If the pSel
ded0: 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ect argument is 
dee0: 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61  not NULL, it mea
def0: 6e 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75  ns that this rou
df00: 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c  tine.** was call
df10: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74  ed to create a t
df20: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66  able generated f
df30: 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54  rom a .** "CREAT
df40: 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53  E TABLE ... AS S
df50: 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65  ELECT ..." state
df60: 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d  ment.  The colum
df70: 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68  n names of.** th
df80: 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c  e new table will
df90: 20 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c   match the resul
dfa0: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
dfb0: 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ECT..*/.void sql
dfc0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20  ite3EndTable(.  
dfd0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
dfe0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
dff0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
e000: 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20  ken *pCons,     
e010: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27        /* The ','
e020: 20 74 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65   token after the
e030: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66   last column def
e040: 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  n. */.  Token *p
e050: 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  End,            
e060: 2f 2a 20 54 68 65 20 27 29 27 20 62 65 66 6f 72  /* The ')' befor
e070: 65 20 6f 70 74 69 6f 6e 73 20 69 6e 20 74 68 65  e options in the
e080: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f   CREATE TABLE */
e090: 0a 20 20 75 38 20 74 61 62 4f 70 74 73 2c 20 20  .  u8 tabOpts,  
e0a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
e0b0: 74 72 61 20 74 61 62 6c 65 20 6f 70 74 69 6f 6e  tra table option
e0c0: 73 2e 20 55 73 75 61 6c 6c 79 20 30 2e 20 2a 2f  s. Usually 0. */
e0d0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
e0e0: 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ct         /* Se
e0f0: 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45  lect from a "CRE
e100: 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  ATE ... AS SELEC
e110: 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  T" */.){.  Table
e120: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
e130: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
e140: 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
e150: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
e160: 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61  >db; /* The data
e170: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
e180: 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
e190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e1a0: 2a 20 44 61 74 61 62 61 73 65 20 69 6e 20 77 68  * Database in wh
e1b0: 69 63 68 20 74 68 65 20 74 61 62 6c 65 20 6c 69  ich the table li
e1c0: 76 65 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ves */.  Index *
e1d0: 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
e1e0: 20 20 20 2f 2a 20 41 6e 20 69 6d 70 6c 69 65 64     /* An implied
e1f0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61   index of the ta
e200: 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70  ble */..  if( (p
e210: 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63  End==0 && pSelec
e220: 74 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c  t==0) || db->mal
e230: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
e240: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
e250: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
e260: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
e270: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
e280: 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e  sert( !db->init.
e290: 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74  busy || !pSelect
e2a0: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
e2b0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
e2c0: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
e2d0: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
e2e0: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
e2f0: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
e300: 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70   or "sqlite_temp
e310: 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f  _master" table o
e320: 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a  n the disk..  **
e330: 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65   So do not write
e340: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61   to the disk aga
e350: 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
e360: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
e370: 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74  r.  ** for the t
e380: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62  able from the db
e390: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66  ->init.newTnum f
e3a0: 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65  ield.  (The page
e3b0: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f   number.  ** sho
e3c0: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75  uld have been pu
e3d0: 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73  t there by the s
e3e0: 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74  qliteOpenCb rout
e3f0: 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ine.).  */.  if(
e400: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
e410: 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20  {.    p->tnum = 
e420: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
e430: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63  ;.  }..  /* Spec
e440: 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66  ial processing f
e450: 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  or WITHOUT ROWID
e460: 20 54 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28   Tables */.  if(
e470: 20 74 61 62 4f 70 74 73 20 26 20 54 46 5f 57 69   tabOpts & TF_Wi
e480: 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20 20  thoutRowid ){.  
e490: 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61    if( (p->tabFla
e4a0: 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72  gs & TF_Autoincr
e4b0: 65 6d 65 6e 74 29 20 29 7b 0a 20 20 20 20 20 20  ement) ){.      
e4c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
e4d0: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
e4e0: 20 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54    "AUTOINCREMENT
e4f0: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   not allowed on 
e500: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
e510: 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 72 65  bles");.      re
e520: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
e530: 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73  if( (p->tabFlags
e540: 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79   & TF_HasPrimary
e550: 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Key)==0 ){.     
e560: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
e570: 28 70 50 61 72 73 65 2c 20 22 50 52 49 4d 41 52  (pParse, "PRIMAR
e580: 59 20 4b 45 59 20 6d 69 73 73 69 6e 67 20 6f 6e  Y KEY missing on
e590: 20 74 61 62 6c 65 20 25 73 22 2c 20 70 2d 3e 7a   table %s", p->z
e5a0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
e5b0: 7b 0a 20 20 20 20 20 20 70 2d 3e 74 61 62 46 6c  {.      p->tabFl
e5c0: 61 67 73 20 7c 3d 20 54 46 5f 57 69 74 68 6f 75  ags |= TF_Withou
e5d0: 74 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 63 6f  tRowid;.      co
e5e0: 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f  nvertToWithoutRo
e5f0: 77 69 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c  widTable(pParse,
e600: 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   p);.    }.  }..
e610: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
e620: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
e630: 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23   p->pSchema);..#
e640: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e650: 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65  IT_CHECK.  /* Re
e660: 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61  solve names in a
e670: 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ll CHECK constra
e680: 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  int expressions.
e690: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
e6a0: 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c  Check ){.    sql
e6b0: 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52  ite3ResolveSelfR
e6c0: 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c  eference(pParse,
e6d0: 20 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c 20   p, NC_IsCheck, 
e6e0: 30 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a 20  0, p->pCheck);. 
e6f0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65   }.#endif /* !de
e700: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e710: 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f  T_CHECK) */..  /
e720: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 61  * Estimate the a
e730: 76 65 72 61 67 65 20 72 6f 77 20 73 69 7a 65 20  verage row size 
e740: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e  for the table an
e750: 64 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c 69 65  d for all implie
e760: 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 65  d indices */.  e
e770: 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74  stimateTableWidt
e780: 68 28 70 29 3b 0a 20 20 66 6f 72 28 70 49 64 78  h(p);.  for(pIdx
e790: 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  =p->pIndex; pIdx
e7a0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
e7b0: 78 74 29 7b 0a 20 20 20 20 65 73 74 69 6d 61 74  xt){.    estimat
e7c0: 65 49 6e 64 65 78 57 69 64 74 68 28 70 49 64 78  eIndexWidth(pIdx
e7d0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
e7e0: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  not initializing
e7f0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
e800: 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e  record for the n
e810: 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e  ew table.  ** in
e820: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
e830: 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ER table of the 
e840: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20  database..  **. 
e850: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
e860: 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65   TEMPORARY table
e870: 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72  , write the entr
e880: 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c  y into the auxil
e890: 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69  iary.  ** file i
e8a0: 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74  nstead of into t
e8b0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
e8c0: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
e8d0: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
e8e0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20   ){.    int n;. 
e8f0: 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
e900: 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20  char *zType;    
e910: 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61  /* "view" or "ta
e920: 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72  ble" */.    char
e930: 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22   *zType2;   /* "
e940: 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22  VIEW" or "TABLE"
e950: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
e960: 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20  tmt;    /* Text 
e970: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
e980: 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49  BLE or CREATE VI
e990: 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EW statement */.
e9a0: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
e9b0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
e9c0: 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 76  .    if( NEVER(v
e9d0: 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  ==0) ) return;..
e9e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e9f0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
ea00: 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a  e, 0);..    /* .
ea10: 20 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a      ** Initializ
ea20: 65 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20  e zType for the 
ea30: 6e 65 77 20 76 69 65 77 20 6f 72 20 74 61 62 6c  new view or tabl
ea40: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
ea50: 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  ( p->pSelect==0 
ea60: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65  ){.      /* A re
ea70: 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20  gular table */. 
ea80: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61       zType = "ta
ea90: 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70  ble";.      zTyp
eaa0: 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69  e2 = "TABLE";.#i
eab0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
eac0: 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65  T_VIEW.    }else
ead0: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65  {.      /* A vie
eae0: 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65  w */.      zType
eaf0: 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20   = "view";.     
eb00: 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22   zType2 = "VIEW"
eb10: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  ;.#endif.    }..
eb20: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
eb30: 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  s a CREATE TABLE
eb40: 20 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e   xx AS SELECT ..
eb50: 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53  ., execute the S
eb60: 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61  ELECT.    ** sta
eb70: 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61  tement to popula
eb80: 74 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  te the new table
eb90: 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  . The root-page 
eba0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20  number for the. 
ebb0: 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20     ** new table 
ebc0: 69 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 70  is in register p
ebd0: 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a  Parse->regRoot..
ebe0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e      **.    ** On
ebf0: 63 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61  ce the SELECT ha
ec00: 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20  s been coded by 
ec10: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c  sqlite3Select(),
ec20: 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20   it is in a.    
ec30: 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74  ** suitable stat
ec40: 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74  e to query for t
ec50: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
ec60: 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20  and types to be 
ec70: 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  used.    ** by t
ec80: 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20  he new table..  
ec90: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68    **.    ** A sh
eca0: 61 72 65 64 2d 63 61 63 68 65 20 77 72 69 74 65  ared-cache write
ecb0: 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71  -lock is not req
ecc0: 75 69 72 65 64 20 74 6f 20 77 72 69 74 65 20 74  uired to write t
ecd0: 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c  o the new table,
ece0: 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68  .    ** as a sch
ecf0: 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61  ema-lock must ha
ed00: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
ed10: 6f 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61  obtained to crea
ed20: 74 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20  te it. Since.   
ed30: 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63   ** a schema-loc
ed40: 6b 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f  k excludes all o
ed50: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 75 73  ther database us
ed60: 65 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c  ers, the write-l
ed70: 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a  ock would.    **
ed80: 20 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20   be redundant.. 
ed90: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
eda0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53  elect ){.      S
edb0: 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
edc0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65        Table *pSe
edd0: 6c 54 61 62 3b 0a 0a 20 20 20 20 20 20 61 73 73  lTab;..      ass
ede0: 65 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62  ert(pParse->nTab
edf0: 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ==1);.      sqli
ee00: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ee10: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31   OP_OpenWrite, 1
ee20: 2c 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  , pParse->regRoo
ee30: 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  t, iDb);.      s
ee40: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
ee50: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32 49  P5(v, OPFLAG_P2I
ee60: 53 52 45 47 29 3b 0a 20 20 20 20 20 20 70 50 61  SREG);.      pPa
ee70: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20  rse->nTab = 2;. 
ee80: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
ee90: 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
eea0: 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 29 3b  , SRT_Table, 1);
eeb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
eec0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
eed0: 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20  lect, &dest);.  
eee0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
eef0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
ef00: 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 1);.      if(
ef10: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
ef20: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   ){.        pSel
ef30: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
ef40: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
ef50: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b  Parse, pSelect);
ef60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65  .        if( pSe
ef70: 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  lTab==0 ) return
ef80: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
ef90: 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ( p->aCol==0 );.
efa0: 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20          p->nCol 
efb0: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
efc0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c  .        p->aCol
efd0: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
efe0: 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61  ;.        pSelTa
eff0: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
f000: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43       pSelTab->aC
f010: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ol = 0;.        
f020: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
f030: 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b  le(db, pSelTab);
f040: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
f050: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
f060: 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
f070: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73   of the CREATE s
f080: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
f090: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
f0a0: 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65       zStmt = cre
f0b0: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c  ateTableStmt(db,
f0c0: 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   p);.    }else{.
f0d0: 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 45 6e        Token *pEn
f0e0: 64 32 20 3d 20 74 61 62 4f 70 74 73 20 3f 20 26  d2 = tabOpts ? &
f0f0: 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
f100: 65 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20 20 20  en : pEnd;.     
f110: 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 32   n = (int)(pEnd2
f120: 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e  ->z - pParse->sN
f130: 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20  ameToken.z);.   
f140: 20 20 20 69 66 28 20 70 45 6e 64 32 2d 3e 7a 5b     if( pEnd2->z[
f150: 30 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d 20 70  0]!=';' ) n += p
f160: 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a  End2->n;.      z
f170: 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
f180: 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20  rintf(db, .     
f190: 20 20 20 20 20 22 43 52 45 41 54 45 20 25 73 20       "CREATE %s 
f1a0: 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e  %.*s", zType2, n
f1b0: 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  , pParse->sNameT
f1c0: 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a  oken.z.      );.
f1d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20      }..    /* A 
f1e0: 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63  slot for the rec
f1f0: 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  ord has already 
f200: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69  been allocated i
f210: 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51  n the .    ** SQ
f220: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
f230: 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64  e.  We just need
f240: 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20   to update that 
f250: 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20  slot with all.  
f260: 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61    ** the informa
f270: 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65  tion we've colle
f280: 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cted..    */.   
f290: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
f2a0: 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
f2b0: 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
f2c0: 22 0a 20 20 20 20 20 20 20 20 20 22 53 45 54 20  ".         "SET 
f2d0: 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d  type='%s', name=
f2e0: 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c  %Q, tbl_name=%Q,
f2f0: 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73   rootpage=#%d, s
f300: 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22  ql=%Q ".       "
f310: 57 48 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22  WHERE rowid=#%d"
f320: 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ,.      db->aDb[
f330: 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
f340: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20  MA_TABLE(iDb),. 
f350: 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20       zType,.    
f360: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20    p->zName,.    
f370: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20    p->zName,.    
f380: 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f    pParse->regRoo
f390: 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a  t,.      zStmt,.
f3a0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65        pParse->re
f3b0: 67 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20  gRowid.    );.  
f3c0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
f3d0: 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20  db, zStmt);.    
f3e0: 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
f3f0: 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
f400: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
f410: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
f420: 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63  MENT.    /* Chec
f430: 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e  k to see if we n
f440: 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e  eed to create an
f450: 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
f460: 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a   table for.    *
f470: 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20  * keeping track 
f480: 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  of autoincrement
f490: 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20   keys..    */.  
f4a0: 20 20 69 66 28 20 70 2d 3e 74 61 62 46 6c 61 67    if( p->tabFlag
f4b0: 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
f4c0: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 44 62  ment ){.      Db
f4d0: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
f4e0: 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 61 73 73  [iDb];.      ass
f4f0: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
f500: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
f510: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20  iDb, 0) );.     
f520: 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
f530: 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b  a->pSeqTab==0 ){
f540: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f550: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
f560: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43  se,.          "C
f570: 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73  REATE TABLE %Q.s
f580: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e  qlite_sequence(n
f590: 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20  ame,seq)",.     
f5a0: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a       pDb->zName.
f5b0: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
f5c0: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
f5d0: 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20  .    /* Reparse 
f5e0: 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70  everything to up
f5f0: 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
f600: 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  l data structure
f610: 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
f620: 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65  VdbeAddParseSche
f630: 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20  maOp(v, iDb,.   
f640: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
f650: 50 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f  Printf(db, "tbl_
f660: 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79  name='%q' AND ty
f670: 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 20  pe!='trigger'", 
f680: 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a  p->zName));.  }.
f690: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74  ..  /* Add the t
f6a0: 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d  able to the in-m
f6b0: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
f6c0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
f6d0: 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  base..  */.  if(
f6e0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
f6f0: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c  {.    Table *pOl
f700: 64 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  d;.    Schema *p
f710: 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68  Schema = p->pSch
f720: 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ema;.    assert(
f730: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
f740: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
f750: 20 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20   0) );.    pOld 
f760: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
f770: 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62  ert(&pSchema->tb
f780: 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  lHash, p->zName,
f790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
f7b0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d  lite3Strlen30(p-
f7c0: 3e 7a 4e 61 6d 65 29 2c 70 29 3b 0a 20 20 20 20  >zName),p);.    
f7d0: 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20  if( pOld ){.    
f7e0: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c    assert( p==pOl
f7f0: 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  d );  /* Malloc 
f800: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
f810: 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65   inside HashInse
f820: 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 64 62  rt() */.      db
f830: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
f840: 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
f850: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
f860: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
f870: 30 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  0;.    db->flags
f880: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
f890: 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64  nChanges;..#ifnd
f8a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
f8b0: 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66  LTERTABLE.    if
f8c0: 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b  ( !p->pSelect ){
f8d0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
f8e0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73  r *zName = (cons
f8f0: 74 20 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d  t char *)pParse-
f900: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20  >sNameToken.z;. 
f910: 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a       int nName;.
f920: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
f930: 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20  Select && pCons 
f940: 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20  && pEnd );.     
f950: 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30   if( pCons->z==0
f960: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e   ){.        pCon
f970: 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  s = pEnd;.      
f980: 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20  }.      nName = 
f990: 28 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61  (int)((const cha
f9a0: 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a  r *)pCons->z - z
f9b0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Name);.      p->
f9c0: 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31  addColOffset = 1
f9d0: 33 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43  3 + sqlite3Utf8C
f9e0: 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e  harLen(zName, nN
f9f0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ame);.    }.#end
fa00: 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  if.  }.}..#ifnde
fa10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
fa20: 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72  EW./*.** The par
fa30: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
fa40: 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20  outine in order 
fa50: 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
fa60: 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  VIEW.*/.void sql
fa70: 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a  ite3CreateView(.
fa80: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
fa90: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
faa0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
fab0: 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20   Token *pBegin, 
fac0: 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
fad0: 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
fae0: 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ins the statemen
faf0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
fb00: 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame1,     /* The
fb10: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
fb20: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
fb30: 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65  e view */.  Toke
fb40: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
fb50: 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
fb60: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
fb70: 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
fb80: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
fb90: 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20  ,   /* A SELECT 
fba0: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77  statement that w
fbb0: 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
fbc0: 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  ew view */.  int
fbd0: 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20   isTemp,        
fbe0: 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45  /* TRUE for a TE
fbf0: 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a  MPORARY view */.
fc00: 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
fc10: 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73       /* Suppress
fc20: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
fc30: 69 66 20 56 49 45 57 20 61 6c 72 65 61 64 79 20  if VIEW already 
fc40: 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  exists */.){.  T
fc50: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  able *p;.  int n
fc60: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
fc70: 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b  z;.  Token sEnd;
fc80: 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b  .  DbFixer sFix;
fc90: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  .  Token *pName 
fca0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  = 0;.  int iDb;.
fcb0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
fcc0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
fcd0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e  f( pParse->nVar>
fce0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
fcf0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
fd00: 20 22 70 61 72 61 6d 65 74 65 72 73 20 61 72 65   "parameters are
fd10: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20   not allowed in 
fd20: 76 69 65 77 73 22 29 3b 0a 20 20 20 20 73 71 6c  views");.    sql
fd30: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
fd40: 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (db, pSelect);. 
fd50: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
fd60: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
fd70: 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  le(pParse, pName
fd80: 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d  1, pName2, isTem
fd90: 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b  p, 1, 0, noErr);
fda0: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
fdb0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
fdc0: 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p==0 || pParse->
fdd0: 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  nErr ){.    sqli
fde0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
fdf0: 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
fe00: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
fe10: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
fe20: 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
fe30: 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
fe40: 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  e);.  iDb = sqli
fe50: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
fe60: 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  (db, p->pSchema)
fe70: 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e  ;.  sqlite3FixIn
fe80: 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
fe90: 2c 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70  , iDb, "view", p
fea0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c  Name);.  if( sql
feb0: 69 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73  ite3FixSelect(&s
fec0: 46 69 78 2c 20 70 53 65 6c 65 63 74 29 20 29 7b  Fix, pSelect) ){
fed0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
fee0: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
fef0: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
ff00: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  n;.  }..  /* Mak
ff10: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
ff20: 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74  entire SELECT st
ff30: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
ff40: 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
ff50: 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f   ** This will fo
ff60: 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72  rce all the Expr
ff70: 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20  .token.z values 
ff80: 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
ff90: 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
ffa0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69   rather than poi
ffb0: 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20  nt to the input 
ffc0: 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d  string - which m
ffd0: 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  eans that.  ** t
ffe0: 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74  hey will persist
fff0: 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65   after the curre
10000 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  nt sqlite3_exec(
10010 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a  ) call returns..
10020 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63    */.  p->pSelec
10030 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
10040 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74  tDup(db, pSelect
10050 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
10060 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
10070 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
10080 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 64 62 2d  lect);.  if( db-
10090 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
100a0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
100b0 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
100c0 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c  .busy ){.    sql
100d0 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
100e0 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
100f0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  );.  }..  /* Loc
10100 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
10110 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73  he CREATE VIEW s
10120 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20  tatement.  Make 
10130 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20  sEnd point to.  
10140 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f  ** the end..  */
10150 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65  .  sEnd = pParse
10160 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20  ->sLastToken;.  
10170 69 66 28 20 41 4c 57 41 59 53 28 73 45 6e 64 2e  if( ALWAYS(sEnd.
10180 7a 5b 30 5d 21 3d 30 29 20 26 26 20 73 45 6e 64  z[0]!=0) && sEnd
10190 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20  .z[0]!=';' ){.  
101a0 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64    sEnd.z += sEnd
101b0 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e  .n;.  }.  sEnd.n
101c0 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74   = 0;.  n = (int
101d0 29 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69  )(sEnd.z - pBegi
101e0 6e 2d 3e 7a 29 3b 0a 20 20 7a 20 3d 20 70 42 65  n->z);.  z = pBe
101f0 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28  gin->z;.  while(
10200 20 41 4c 57 41 59 53 28 6e 3e 30 29 20 26 26 20   ALWAYS(n>0) && 
10210 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
10220 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d  [n-1]) ){ n--; }
10230 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e  .  sEnd.z = &z[n
10240 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  -1];.  sEnd.n = 
10250 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c  1;..  /* Use sql
10260 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74  ite3EndTable() t
10270 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74  o add the view t
10280 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  o the SQLITE_MAS
10290 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  TER table */.  s
102a0 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70  qlite3EndTable(p
102b0 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c  Parse, 0, &sEnd,
102c0 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e   0, 0);.  return
102d0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
102e0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
102f0 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
10300 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
10310 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
10320 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
10330 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68  LTABLE)./*.** Th
10340 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
10350 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c  e pTable is real
10360 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c  ly a VIEW.  Fill
10370 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66   in the names of
10380 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  .** the columns 
10390 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74  of the view in t
103a0 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74  he pTable struct
103b0 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ure.  Return the
103c0 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
103d0 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72  rors.  If an err
103e0 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65  or is seen leave
103f0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
10400 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
10410 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
10420 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
10430 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50  nNames(Parse *pP
10440 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
10450 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ble){.  Table *p
10460 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66  SelTab;   /* A f
10470 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77  ake table from w
10480 68 69 63 68 20 77 65 20 67 65 74 20 74 68 65 20  hich we get the 
10490 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
104a0 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20  Select *pSel;   
104b0 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65    /* Copy of the
104c0 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70   SELECT that imp
104d0 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77  lements the view
104e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d   */.  int nErr =
104f0 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   0;     /* Numbe
10500 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
10510 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74  untered */.  int
10520 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   n;            /
10530 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f  * Temporarily ho
10540 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  lds the number o
10550 66 20 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e  f cursors assign
10560 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ed */.  sqlite3 
10570 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
10580 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  ;  /* Database c
10590 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61  onnection for ma
105a0 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a 20  lloc errors */. 
105b0 20 69 6e 74 20 28 2a 78 41 75 74 68 29 28 76 6f   int (*xAuth)(vo
105c0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68  id*,int,const ch
105d0 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ar*,const char*,
105e0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
105f0 74 20 63 68 61 72 2a 29 3b 0a 0a 20 20 61 73 73  t char*);..  ass
10600 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a  ert( pTable );..
10610 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10620 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
10630 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 74  .  if( sqlite3Vt
10640 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50  abCallConnect(pP
10650 61 72 73 65 2c 20 70 54 61 62 6c 65 29 20 29 7b  arse, pTable) ){
10660 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10670 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
10680 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
10690 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30  able) ) return 0
106a0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ;.#endif..#ifnde
106b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
106c0 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69  EW.  /* A positi
106d0 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68  ve nCol means th
106e0 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20  e columns names 
106f0 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72  for this view ar
10700 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b  e.  ** already k
10710 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nown..  */.  if(
10720 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20   pTable->nCol>0 
10730 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
10740 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * A negative nCo
10750 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d  l is a special m
10760 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68  arker meaning th
10770 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e  at we are curren
10780 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20  tly.  ** trying 
10790 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63  to compute the c
107a0 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66  olumn names.  If
107b0 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72   we enter this r
107c0 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a  outine with.  **
107d0 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   a negative nCol
107e0 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f  , it means two o
107f0 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72  r more views for
10800 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74  m a loop, like t
10810 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  his:.  **.  **  
10820 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f     CREATE VIEW o
10830 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  ne AS SELECT * F
10840 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20  ROM two;.  **   
10850 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77    CREATE VIEW tw
10860 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  o AS SELECT * FR
10870 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a  OM one;.  **.  *
10880 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20  * Actually, the 
10890 65 72 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e  error above is n
108a0 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f 72 20  ow caught prior 
108b0 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69 73  to reaching this
108c0 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74   point..  ** But
108d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
108e0 65 73 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70  est is still imp
108f0 6f 72 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65  ortant as it doe
10900 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69  s come up.  ** i
10910 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  n the following:
10920 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20  .  ** .  **     
10930 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69  CREATE TABLE mai
10940 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20  n.ex1(a);.  **  
10950 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20 56     CREATE TEMP V
10960 49 45 57 20 65 78 31 20 41 53 20 53 45 4c 45 43  IEW ex1 AS SELEC
10970 54 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20  T a FROM ex1;.  
10980 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  **     SELECT * 
10990 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20  FROM temp.ex1;. 
109a0 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
109b0 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ->nCol<0 ){.    
109c0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
109d0 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73  pParse, "view %s
109e0 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64   is circularly d
109f0 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d  efined", pTable-
10a00 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
10a10 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 1;.  }.  ass
10a20 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  ert( pTable->nCo
10a30 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  l>=0 );..  /* If
10a40 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
10a50 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65  , it means we ne
10a60 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
10a70 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20  e table names.. 
10a80 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
10a90 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
10aa0 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
10ab0 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64  ct() will expand
10ac0 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c   any.  ** "*" el
10ad0 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65  ements in the re
10ae0 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65  sults set of the
10af0 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61   view and will a
10b00 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20  ssign cursors.  
10b10 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e  ** to the elemen
10b20 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ts of the FROM c
10b30 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65 20 64  lause.  But we d
10b40 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65  o not want these
10b50 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f   changes.  ** to
10b60 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20   be permanent.  
10b70 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  So the computati
10b80 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20  on is done on a 
10b90 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
10ba0 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  CT.  ** statemen
10bb0 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
10bc0 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20  he view..  */.  
10bd0 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
10be0 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65  pSelect );.  pSe
10bf0 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  l = sqlite3Selec
10c00 74 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d  tDup(db, pTable-
10c10 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
10c20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20  if( pSel ){.    
10c30 75 38 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69  u8 enableLookasi
10c40 64 65 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  de = db->lookasi
10c50 64 65 2e 62 45 6e 61 62 6c 65 64 3b 0a 20 20 20  de.bEnabled;.   
10c60 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61   n = pParse->nTa
10c70 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72  b;.    sqlite3Sr
10c80 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
10c90 72 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  rs(pParse, pSel-
10ca0 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62  >pSrc);.    pTab
10cb0 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20  le->nCol = -1;. 
10cc0 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
10cd0 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 23  .bEnabled = 0;.#
10ce0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10cf0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
10d00 0a 20 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d  .    xAuth = db-
10d10 3e 78 41 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e  >xAuth;.    db->
10d20 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 70  xAuth = 0;.    p
10d30 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
10d40 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
10d50 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b  t(pParse, pSel);
10d60 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d  .    db->xAuth =
10d70 20 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20   xAuth;.#else.  
10d80 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
10d90 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
10da0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
10db0 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64  l);.#endif.    d
10dc0 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
10dd0 61 62 6c 65 64 20 3d 20 65 6e 61 62 6c 65 4c 6f  abled = enableLo
10de0 6f 6b 61 73 69 64 65 3b 0a 20 20 20 20 70 50 61  okaside;.    pPa
10df0 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20  rse->nTab = n;. 
10e00 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 20 29     if( pSelTab )
10e10 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
10e20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20  pTable->aCol==0 
10e30 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  );.      pTable-
10e40 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
10e50 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61  >nCol;.      pTa
10e60 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c  ble->aCol = pSel
10e70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
10e80 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
10e90 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61   0;.      pSelTa
10ea0 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
10eb0 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
10ec0 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61  Table(db, pSelTa
10ed0 62 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  b);.      assert
10ee0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
10ef0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20  utexHeld(db, 0, 
10f00 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29  pTable->pSchema)
10f10 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65   );.      pTable
10f20 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73  ->pSchema->flags
10f30 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69   |= DB_UnresetVi
10f40 65 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ews;.    }else{.
10f50 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43        pTable->nC
10f60 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45  ol = 0;.      nE
10f70 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rr++;.    }.    
10f80 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
10f90 65 74 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20  ete(db, pSel);. 
10fa0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45   } else {.    nE
10fb0 72 72 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rr++;.  }.#endif
10fc0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
10fd0 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e  VIEW */.  return
10fe0 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69   nErr;  .}.#endi
10ff0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
11000 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
11010 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
11020 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
11030 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65  ABLE) */..#ifnde
11040 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
11050 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  EW./*.** Clear t
11060 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
11070 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20  from every VIEW 
11080 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e  in database idx.
11090 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
110a0 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
110b0 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ll(sqlite3 *db, 
110c0 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68  int idx){.  Hash
110d0 45 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72  Elem *i;.  asser
110e0 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
110f0 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 64  MutexHeld(db, id
11100 78 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21  x, 0) );.  if( !
11110 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
11120 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
11130 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e  tViews) ) return
11140 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ;.  for(i=sqlite
11150 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
11160 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d  Db[idx].pSchema-
11170 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73  >tblHash); i;i=s
11180 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
11190 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
111a0 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
111b0 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20  ata(i);.    if( 
111c0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
111d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c  .      sqliteDel
111e0 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64  eteColumnNames(d
111f0 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
11200 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  pTab->aCol = 0;.
11210 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
11220 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
11230 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74    DbClearPropert
11240 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
11250 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23  resetViews);.}.#
11260 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71  else.# define sq
11270 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
11280 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20  (A,B).#endif /* 
11290 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
112a0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
112b0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
112c0 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20 74  ed by the VDBE t
112d0 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74  o adjust the int
112e0 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20  ernal schema.** 
112f0 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 77  used by SQLite w
11300 68 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61  hen the btree la
11310 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c  yer moves a tabl
11320 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65  e root page. The
11330 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  .** root-page of
11340 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
11350 78 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44  x in database iD
11360 62 20 68 61 73 20 63 68 61 6e 67 65 64 20 66 72  b has changed fr
11370 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69  om iFrom.** to i
11380 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74  To..**.** Ticket
11390 20 23 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d   #1728:  The sym
113a0 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20  bol table might 
113b0 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e  still contain in
113c0 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20  formation.** on 
113d0 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e  tables and/or in
113e0 64 69 63 65 73 20 74 68 61 74 20 61 72 65 20 74  dices that are t
113f0 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65  he process of be
11400 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20  ing deleted..** 
11410 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63  If you are unluc
11420 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  ky, one of those
11430 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73   deleted indices
11440 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74   or tables might
11450 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d  .** have the sam
11460 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65  e rootpage numbe
11470 72 20 61 73 20 74 68 65 20 72 65 61 6c 20 74 61  r as the real ta
11480 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61  ble or index tha
11490 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f  t is.** being mo
114a0 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e  ved.  So we cann
114b0 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e  ot stop searchin
114c0 67 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73  g after the firs
114d0 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61  t match .** beca
114e0 75 73 65 20 74 68 65 20 66 69 72 73 74 20 6d 61  use the first ma
114f0 74 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72  tch might be for
11500 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65   one of the dele
11510 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f  ted indices.** o
11520 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74  r tables and not
11530 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
11540 20 74 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c   that is actuall
11550 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a  y being moved..*
11560 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e  * We must contin
11570 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ue looping until
11580 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20   all tables and 
11590 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20  indices with.** 
115a0 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20  rootpage==iFrom 
115b0 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72  have been conver
115c0 74 65 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f  ted to have a ro
115d0 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a  otpage of iTo.**
115e0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   in order to be 
115f0 63 65 72 74 61 69 6e 20 74 68 61 74 20 77 65 20  certain that we 
11600 67 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e  got the right on
11610 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
11620 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
11630 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65  CUUM.void sqlite
11640 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73  3RootPageMoved(s
11650 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
11660 69 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  iDb, int iFrom, 
11670 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68  int iTo){.  Hash
11680 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48  Elem *pElem;.  H
11690 61 73 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62  ash *pHash;.  Db
116a0 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74   *pDb;..  assert
116b0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
116c0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
116d0 2c 20 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20  , 0) );.  pDb = 
116e0 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
116f0 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70   pHash = &pDb->p
11700 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b  Schema->tblHash;
11710 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
11720 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61  iteHashFirst(pHa
11730 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
11740 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
11750 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61  (pElem)){.    Ta
11760 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
11770 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
11780 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
11790 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a  >tnum==iFrom ){.
117a0 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d        pTab->tnum
117b0 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20   = iTo;.    }.  
117c0 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62  }.  pHash = &pDb
117d0 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
117e0 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  sh;.  for(pElem=
117f0 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
11800 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  pHash); pElem; p
11810 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
11820 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
11830 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73   Index *pIdx = s
11840 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
11850 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49  lem);.    if( pI
11860 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20  dx->tnum==iFrom 
11870 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74  ){.      pIdx->t
11880 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d  num = iTo;.    }
11890 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
118a0 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20  *.** Write code 
118b0 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61 62  to erase the tab
118c0 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
118d0 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61  e iTable from da
118e0 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41  tabase iDb..** A
118f0 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74  lso write code t
11900 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c  o modify the sql
11910 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
11920 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63   and internal sc
11930 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f  hema.** if a roo
11940 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65  t-page of anothe
11950 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64  r table is moved
11960 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61   by the btree-la
11970 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72  yer whilst.** er
11980 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68  asing iTable (th
11990 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69  is can happen wi
119a0 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  th an auto-vacuu
119b0 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20  m database)..*/ 
119c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73  .static void des
119d0 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72  troyRootPage(Par
119e0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
119f0 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29  iTable, int iDb)
11a00 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
11a10 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
11a20 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d  rse);.  int r1 =
11a30 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
11a40 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
11a50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
11a60 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69  v, OP_Destroy, i
11a70 54 61 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b  Table, r1, iDb);
11a80 0a 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f  .  sqlite3MayAbo
11a90 72 74 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e  rt(pParse);.#ifn
11aa0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11ab0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20  AUTOVACUUM.  /* 
11ac0 4f 50 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65  OP_Destroy store
11ad0 73 20 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20  s an in integer 
11ae0 72 31 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65  r1. If this inte
11af0 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d  ger.  ** is non-
11b00 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73  zero, then it is
11b10 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
11b20 75 6d 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65  umber of a table
11b30 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c   moved to.  ** l
11b40 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20  ocation iTable. 
11b50 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
11b60 64 65 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20  de modifies the 
11b70 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
11b80 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c  ble to.  ** refl
11b90 65 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20  ect this..  **. 
11ba0 20 2a 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69   ** The "#NNN" i
11bb0 6e 20 74 68 65 20 53 51 4c 20 69 73 20 61 20 73  n the SQL is a s
11bc0 70 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20  pecial constant 
11bd0 74 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65  that means whate
11be0 76 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69  ver value.  ** i
11bf0 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e  s in register NN
11c00 4e 2e 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20  N.  See grammar 
11c10 72 75 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64  rules associated
11c20 20 77 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47   with the TK_REG
11c30 49 53 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e  ISTER.  ** token
11c40 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
11c50 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a  information..  *
11c60 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65  /.  sqlite3Neste
11c70 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
11c80 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e       "UPDATE %Q.
11c90 25 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d  %s SET rootpage=
11ca0 25 64 20 57 48 45 52 45 20 23 25 64 20 41 4e 44  %d WHERE #%d AND
11cb0 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a   rootpage=#%d",.
11cc0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d       pParse->db-
11cd0 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
11ce0 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
11cf0 62 29 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20  b), iTable, r1, 
11d00 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  r1);.#endif.  sq
11d10 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
11d20 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
11d30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
11d40 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61  VDBE code to era
11d50 73 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e  se table pTab an
11d60 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64  d all associated
11d70 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b   indices on disk
11d80 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64  ..** Code to upd
11d90 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ate the sqlite_m
11da0 61 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64  aster tables and
11db0 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
11dc0 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20   definitions.** 
11dd0 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70  in case a root-p
11de0 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
11df0 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
11e00 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
11e10 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73  tree layer.** is
11e20 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69   also added (thi
11e30 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74  s can happen wit
11e40 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  h an auto-vacuum
11e50 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73   database)..*/.s
11e60 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
11e70 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  oyTable(Parse *p
11e80 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
11e90 61 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ab){.#ifdef SQLI
11ea0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
11eb0 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  UM.  Index *pIdx
11ec0 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71  ;.  int iDb = sq
11ed0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
11ee0 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
11ef0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
11f00 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
11f10 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74  (pParse, pTab->t
11f20 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72  num, iDb);.  for
11f30 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
11f40 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
11f50 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
11f60 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
11f70 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74  (pParse, pIdx->t
11f80 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23  num, iDb);.  }.#
11f90 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65  else.  /* If the
11fa0 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65   database may be
11fb0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70   auto-vacuum cap
11fc0 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f  able (if SQLITE_
11fd0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
11fe0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69    ** is not defi
11ff0 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73  ned), then it is
12000 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61   important to ca
12010 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e  ll OP_Destroy on
12020 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20   the.  ** table 
12030 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70  and index root-p
12040 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73  ages in order, s
12050 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65  tarting with the
12060 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20   numerically .  
12070 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  ** largest root-
12080 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69  page number. Thi
12090 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  s guarantees tha
120a0 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  t none of the ro
120b0 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f  ot-pages.  ** to
120c0 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73   be destroyed is
120d0 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e   relocated by an
120e0 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74   earlier OP_Dest
120f0 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65  roy. i.e. if the
12100 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  .  ** following 
12110 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a  were coded:.  **
12120 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  ** OP_Destroy
12130 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20   4 0.  ** ....  
12140 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20  ** OP_Destroy 5 
12150 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20  0.  **.  ** and 
12160 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70  root page 5 happ
12170 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c  ened to be the l
12180 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
12190 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20   number in the. 
121a0 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68   ** database, th
121b0 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77  en root page 5 w
121c0 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f  ould be moved to
121d0 20 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a   page 4 by the .
121e0 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79    ** "OP_Destroy
121f0 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68   4 0" opcode. Th
12200 65 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50  e subsequent "OP
12210 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f  _Destroy 5 0" wo
12220 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66  uld hit.  ** a f
12230 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20  ree-list page.. 
12240 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
12250 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69   pTab->tnum;.  i
12260 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20  nt iDestroyed = 
12270 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29  0;..  while( 1 )
12280 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
12290 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67  x;.    int iLarg
122a0 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  est = 0;..    if
122b0 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20  ( iDestroyed==0 
122c0 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79  || iTab<iDestroy
122d0 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72  ed ){.      iLar
122e0 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20  gest = iTab;.   
122f0 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d   }.    for(pIdx=
12300 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
12310 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
12320 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
12330 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e   iIdx = pIdx->tn
12340 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  um;.      assert
12350 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d  ( pIdx->pSchema=
12360 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
12370 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65  ;.      if( (iDe
12380 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69  stroyed==0 || (i
12390 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29  Idx<iDestroyed))
123a0 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73   && iIdx>iLarges
123b0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61  t ){.        iLa
123c0 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20  rgest = iIdx;.  
123d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
123e0 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20  if( iLargest==0 
123f0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  ){.      return;
12400 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12410 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
12420 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
12430 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
12440 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
12450 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d     assert( iDb>=
12460 30 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d  0 && iDb<pParse-
12470 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  >db->nDb );.    
12480 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
12490 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65  e(pParse, iLarge
124a0 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  st, iDb);.      
124b0 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61  iDestroyed = iLa
124c0 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  rgest;.    }.  }
124d0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
124e0 20 52 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20   Remove entries 
124f0 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f  from the sqlite_
12500 73 74 61 74 4e 20 74 61 62 6c 65 73 20 28 66 6f  statN tables (fo
12510 72 20 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a  r N in (1,2,3)).
12520 2a 2a 20 61 66 74 65 72 20 61 20 44 52 4f 50 20  ** after a DROP 
12530 49 4e 44 45 58 20 6f 72 20 44 52 4f 50 20 54 41  INDEX or DROP TA
12540 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  BLE command..*/.
12550 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
12560 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c  te3ClearStatTabl
12570 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
12580 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
12590 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
125a0 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ext */.  int iDb
125b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
125c0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
125d0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73  number */.  cons
125e0 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20  t char *zType,  
125f0 20 20 20 2f 2a 20 22 69 64 78 22 20 6f 72 20 22     /* "idx" or "
12600 74 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tbl" */.  const 
12610 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20  char *zName     
12620 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65   /* Name of inde
12630 78 20 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  x or table */.){
12640 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
12650 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20  t char *zDbName 
12660 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  = pParse->db->aD
12670 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
12680 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69  for(i=1; i<=4; i
12690 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 54  ++){.    char zT
126a0 61 62 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69  ab[24];.    sqli
126b0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
126c0 65 6f 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22  eof(zTab),zTab,"
126d0 73 71 6c 69 74 65 5f 73 74 61 74 25 64 22 2c 69  sqlite_stat%d",i
126e0 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
126f0 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
12700 73 65 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44  se->db, zTab, zD
12710 62 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  bName) ){.      
12720 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
12730 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
12740 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
12750 25 51 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25  %Q.%s WHERE %s=%
12760 51 22 2c 0a 20 20 20 20 20 20 20 20 7a 44 62 4e  Q",.        zDbN
12770 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65  ame, zTab, zType
12780 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b  , zName.      );
12790 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
127a0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
127b0 65 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c  e to drop a tabl
127c0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
127d0 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28  e3CodeDropTable(
127e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
127f0 61 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20  able *pTab, int 
12800 69 44 62 2c 20 69 6e 74 20 69 73 56 69 65 77 29  iDb, int isView)
12810 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  {.  Vdbe *v;.  s
12820 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
12830 72 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67  rse->db;.  Trigg
12840 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20  er *pTrigger;.  
12850 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
12860 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20  Db[iDb];..  v = 
12870 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
12880 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
12890 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ( v!=0 );.  sqli
128a0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
128b0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
128c0 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66  , iDb);..#ifndef
128d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
128e0 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
128f0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
12900 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
12910 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56  beAddOp0(v, OP_V
12920 42 65 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64  Begin);.  }.#end
12930 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c  if..  /* Drop al
12940 6c 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63  l triggers assoc
12950 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
12960 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
12970 65 64 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73  ed. Code.  ** is
12980 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65   generated to re
12990 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f  move entries fro
129a0 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  m sqlite_master 
129b0 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69  and/or.  ** sqli
129c0 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69  te_temp_master i
129d0 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  f required..  */
129e0 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71  .  pTrigger = sq
129f0 6c 69 74 65 33 54 72 69 67 67 65 72 4c 69 73 74  lite3TriggerList
12a00 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
12a10 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65    while( pTrigge
12a20 72 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  r ){.    assert(
12a30 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65   pTrigger->pSche
12a40 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
12a50 61 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 70 54  a || .        pT
12a60 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d  rigger->pSchema=
12a70 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68  =db->aDb[1].pSch
12a80 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ema );.    sqlit
12a90 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72  e3DropTriggerPtr
12aa0 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
12ab0 72 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72  r);.    pTrigger
12ac0 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65   = pTrigger->pNe
12ad0 78 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  xt;.  }..#ifndef
12ae0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
12af0 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20  OINCREMENT.  /* 
12b00 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69  Remove any entri
12b10 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  es of the sqlite
12b20 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
12b30 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
12b40 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62    ** the table b
12b50 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68  eing dropped. Th
12b60 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72  is is done befor
12b70 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64  e the table is d
12b80 72 6f 70 70 65 64 0a 20 20 2a 2a 20 61 74 20 74  ropped.  ** at t
12b90 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20  he btree level, 
12ba0 69 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69  in case the sqli
12bb0 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
12bc0 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20  e needs to.  ** 
12bd0 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74  move as a result
12be0 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61   of the drop (ca
12bf0 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f  n happen in auto
12c00 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20  -vacuum mode).. 
12c10 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e   */.  if( pTab->
12c20 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
12c30 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20  toincrement ){. 
12c40 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
12c50 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
12c60 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
12c70 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65   %Q.sqlite_seque
12c80 6e 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25  nce WHERE name=%
12c90 51 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a  Q",.      pDb->z
12ca0 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
12cb0 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e  e.    );.  }.#en
12cc0 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61  dif..  /* Drop a
12cd0 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ll SQLITE_MASTER
12ce0 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
12cf0 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65   entries that re
12d00 66 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  fer to the.  ** 
12d10 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72  table. The progr
12d20 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68  am name loops th
12d30 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72  rough the master
12d40 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74   table and delet
12d50 65 73 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f  es.  ** every ro
12d60 77 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  w that refers to
12d70 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20   a table of the 
12d80 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
12d90 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20   one being.  ** 
12da0 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72  dropped. Trigger
12db0 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  s are handled se
12dc0 70 61 72 61 74 65 6c 79 20 62 65 63 61 75 73 65  parately because
12dd0 20 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62   a trigger can b
12de0 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69  e.  ** created i
12df0 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  n the temp datab
12e00 61 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20  ase that refers 
12e10 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e  to a table in an
12e20 6f 74 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62  other.  ** datab
12e30 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ase..  */.  sqli
12e40 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
12e50 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44  Parse, .      "D
12e60 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
12e70 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d   WHERE tbl_name=
12e80 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72  %Q and type!='tr
12e90 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70  igger'",.      p
12ea0 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db->zName, SCHEM
12eb0 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54  A_TABLE(iDb), pT
12ec0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ab->zName);.  if
12ed0 28 20 21 69 73 56 69 65 77 20 26 26 20 21 49 73  ( !isView && !Is
12ee0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
12ef0 0a 20 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c  .    destroyTabl
12f00 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b  e(pParse, pTab);
12f10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  .  }..  /* Remov
12f20 65 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72  e the table entr
12f30 79 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20  y from SQLite's 
12f40 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
12f50 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20  and modify.  ** 
12f60 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
12f70 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73  e..  */.  if( Is
12f80 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
12f90 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12fa0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65  AddOp4(v, OP_VDe
12fb0 73 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30  stroy, iDb, 0, 0
12fc0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
12fd0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
12fe0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
12ff0 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c  _DropTable, iDb,
13000 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61   0, 0, pTab->zNa
13010 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  me, 0);.  sqlite
13020 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
13030 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71  arse, iDb);.  sq
13040 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
13050 28 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a  (db, iDb);.}../*
13060 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13070 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f   is called to do
13080 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44   the work of a D
13090 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ROP TABLE statem
130a0 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73  ent..** pName is
130b0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
130c0 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f   table to be dro
130d0 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  pped..*/.void sq
130e0 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50  lite3DropTable(P
130f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
13100 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e  cList *pName, in
13110 74 20 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f  t isView, int no
13120 45 72 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  Err){.  Table *p
13130 54 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  Tab;.  Vdbe *v;.
13140 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
13150 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
13160 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 64 62  t iDb;..  if( db
13170 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
13180 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
13190 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
131a0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
131b0 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61  ->nErr==0 );.  a
131c0 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
131d0 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 6e  rc==1 );.  if( n
131e0 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72  oErr ) db->suppr
131f0 65 73 73 45 72 72 2b 2b 3b 0a 20 20 70 54 61 62  essErr++;.  pTab
13200 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
13210 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65  TableItem(pParse
13220 2c 20 69 73 56 69 65 77 2c 20 26 70 4e 61 6d 65  , isView, &pName
13230 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e  ->a[0]);.  if( n
13240 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72  oErr ) db->suppr
13250 65 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28  essErr--;..  if(
13260 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
13270 69 66 28 20 6e 6f 45 72 72 20 29 20 73 71 6c 69  if( noErr ) sqli
13280 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d  te3CodeVerifyNam
13290 65 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  edSchema(pParse,
132a0 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
132b0 74 61 62 61 73 65 29 3b 0a 20 20 20 20 67 6f 74  tabase);.    got
132c0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
132d0 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  e;.  }.  iDb = s
132e0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
132f0 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
13300 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74  chema);.  assert
13310 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
13320 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a  db->nDb );..  /*
13330 20 49 66 20 70 54 61 62 20 69 73 20 61 20 76 69   If pTab is a vi
13340 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c  rtual table, cal
13350 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  l ViewGetColumnN
13360 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65  ames() to ensure
13370 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74  .  ** it is init
13380 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
13390 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
133a0 61 62 29 20 26 26 20 73 71 6c 69 74 65 33 56 69  ab) && sqlite3Vi
133b0 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
133c0 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
133d0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
133e0 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
133f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13400 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
13410 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  N.  {.    int co
13420 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  de;.    const ch
13430 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
13440 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20  A_TABLE(iDb);.  
13450 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
13460 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
13470 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  .zName;.    cons
13480 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20  t char *zArg2 = 
13490 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
134a0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
134b0 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
134c0 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
134d0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
134e0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
134f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56     }.    if( isV
13500 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28  iew ){.      if(
13510 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
13520 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
13530 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
13540 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b  _DROP_TEMP_VIEW;
13550 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13560 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
13570 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20  ITE_DROP_VIEW;. 
13580 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
13590 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
135a0 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73  ALTABLE.    }els
135b0 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28  e if( IsVirtual(
135c0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63  pTab) ){.      c
135d0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
135e0 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  P_VTABLE;.      
135f0 7a 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47  zArg2 = sqlite3G
13600 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61  etVTable(db, pTa
13610 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b  b)->pMod->zName;
13620 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
13630 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  e{.      if( !OM
13640 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
13650 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
13660 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
13670 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  P_TEMP_TABLE;.  
13680 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13690 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
136a0 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _DROP_TABLE;.   
136b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
136c0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
136d0 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
136e0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
136f0 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Arg2, zDb) ){.  
13700 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
13710 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
13720 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
13730 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
13740 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
13750 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20  pTab->zName, 0, 
13760 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
13770 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
13780 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  le;.    }.  }.#e
13790 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74  ndif.  if( sqlit
137a0 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
137b0 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
137c0 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26  ", 7)==0 .    &&
137d0 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
137e0 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73  (pTab->zName, "s
137f0 71 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29  qlite_stat", 11)
13800 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
13810 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13820 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
13830 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22   not be dropped"
13840 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
13850 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
13860 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23  op_table;.  }..#
13870 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13880 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73  IT_VIEW.  /* Ens
13890 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69  ure DROP TABLE i
138a0 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20  s not used on a 
138b0 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56  view, and DROP V
138c0 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a  IEW is not used.
138d0 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e    ** on a table.
138e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69  .  */.  if( isVi
138f0 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
13900 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
13910 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13920 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
13930 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20  TABLE to delete 
13940 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d  table %s", pTab-
13950 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
13960 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
13970 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73  e;.  }.  if( !is
13980 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
13990 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
139a0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
139b0 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56  rse, "use DROP V
139c0 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69  IEW to delete vi
139d0 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  ew %s", pTab->zN
139e0 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
139f0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
13a00 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
13a10 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
13a20 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62  o remove the tab
13a30 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  le from the mast
13a40 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e  er table.  ** on
13a50 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20   disk..  */.  v 
13a60 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
13a70 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
13a80 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
13a90 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
13aa0 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
13ab0 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
13ac0 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28  ClearStatTables(
13ad0 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74 62  pParse, iDb, "tb
13ae0 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  l", pTab->zName)
13af0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 6b 44  ;.    sqlite3FkD
13b00 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ropTable(pParse,
13b10 20 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a 20   pName, pTab);. 
13b20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72     sqlite3CodeDr
13b30 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  opTable(pParse, 
13b40 70 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65  pTab, iDb, isVie
13b50 77 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72  w);.  }..exit_dr
13b60 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69  op_table:.  sqli
13b70 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
13b80 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  (db, pName);.}..
13b90 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
13ba0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
13bb0 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72  create a new for
13bc0 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  eign key on the 
13bd0 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74  table.** current
13be0 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
13bf0 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c  ction.  pFromCol
13c00 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63   determines whic
13c10 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  h columns.** in 
13c20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
13c30 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  e point to the f
13c40 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20  oreign key.  If 
13c50 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e  pFromCol==0 then
13c60 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20  .** connect the 
13c70 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20  key to the last 
13c80 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e  column inserted.
13c90 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d    pTo is the nam
13ca0 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  e of.** the tabl
13cb0 65 20 72 65 66 65 72 72 65 64 20 74 6f 20 28 61  e referred to (a
13cc0 2e 6b 2e 61 20 74 68 65 20 22 70 61 72 65 6e 74  .k.a the "parent
13cd0 22 20 74 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f  " table).  pToCo
13ce0 6c 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f  l is a list.** o
13cf0 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  f tables in the 
13d00 70 61 72 65 6e 74 20 70 54 6f 20 74 61 62 6c 65  parent pTo table
13d10 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e  .  flags contain
13d20 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  s all.** informa
13d30 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
13d40 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
13d50 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70  on algorithms sp
13d60 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68  ecified.** in th
13d70 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20  e ON DELETE, ON 
13d80 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e  UPDATE and ON IN
13d90 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SERT clauses..**
13da0 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75  .** An FKey stru
13db0 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64  cture is created
13dc0 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68   and added to th
13dd0 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
13de0 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74  y.** under const
13df0 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ruction in the p
13e00 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
13e10 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   field..**.** Th
13e20 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73  e foreign key is
13e30 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41   set for IMMEDIA
13e40 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  TE processing.  
13e50 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  A subsequent cal
13e60 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44  l.** to sqlite3D
13e70 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29  eferForeignKey()
13e80 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
13e90 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a  is to DEFERRED..
13ea0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
13eb0 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28  reateForeignKey(
13ec0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
13ed0 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
13ee0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
13ef0 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43  ExprList *pFromC
13f00 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ol,  /* Columns 
13f10 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68  in this table th
13f20 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65  at point to othe
13f30 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b  r table */.  Tok
13f40 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20  en *pTo,        
13f50 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
13f60 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
13f70 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43    ExprList *pToC
13f80 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol,    /* Column
13f90 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74  s in the other t
13fa0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  able */.  int fl
13fb0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
13fc0 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  * Conflict resol
13fd0 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
13fe0 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  . */.){.  sqlite
13ff0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
14000 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
14010 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
14020 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  KEY.  FKey *pFKe
14030 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70  y = 0;.  FKey *p
14040 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20  NextTo;.  Table 
14050 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  *p = pParse->pNe
14060 77 54 61 62 6c 65 3b 0a 20 20 69 36 34 20 6e 42  wTable;.  i64 nB
14070 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  yte;.  int i;.  
14080 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72  int nCol;.  char
14090 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *z;..  assert( 
140a0 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  pTo!=0 );.  if( 
140b0 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41  p==0 || IN_DECLA
140c0 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66  RE_VTAB ) goto f
140d0 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72  k_end;.  if( pFr
140e0 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
140f0 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43  int iCol = p->nC
14100 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45  ol-1;.    if( NE
14110 56 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f  VER(iCol<0) ) go
14120 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69  to fk_end;.    i
14130 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
14140 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b  Col->nExpr!=1 ){
14150 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
14160 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
14170 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25  foreign key on %
14180 73 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68  s".         " sh
14190 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f  ould reference o
141a0 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f  nly one column o
141b0 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20  f table %T",.   
141c0 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43        p->aCol[iC
141d0 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b  ol].zName, pTo);
141e0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  .      goto fk_e
141f0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43  nd;.    }.    nC
14200 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ol = 1;.  }else 
14210 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54  if( pToCol && pT
14220 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72  oCol->nExpr!=pFr
14230 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a  omCol->nExpr ){.
14240 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14250 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
14260 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63      "number of c
14270 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67  olumns in foreig
14280 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d  n key does not m
14290 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20  atch the number 
142a0 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f  of ".        "co
142b0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66  lumns in the ref
142c0 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b  erenced table");
142d0 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  .    goto fk_end
142e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
142f0 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e  Col = pFromCol->
14300 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79  nExpr;.  }.  nBy
14310 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b  te = sizeof(*pFK
14320 65 79 29 20 2b 20 28 69 36 34 29 28 6e 43 6f 6c  ey) + (i64)(nCol
14330 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79  -1)*sizeof(pFKey
14340 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f  ->aCol[0]) + pTo
14350 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70  ->n + 1;.  if( p
14360 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72  ToCol ){.    for
14370 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e  (i=0; i<pToCol->
14380 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
14390 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69     nByte += sqli
143a0 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43  te3Strlen30(pToC
143b0 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20  ol->a[i].zName) 
143c0 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  + 1;.    }.  }. 
143d0 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   pFKey = sqlite3
143e0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
143f0 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
14400 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  pFKey==0 ){.    
14410 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d  goto fk_end;.  }
14420 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20  .  pFKey->pFrom 
14430 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e  = p;.  pFKey->pN
14440 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b  extFrom = p->pFK
14450 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a  ey;.  z = (char*
14460 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43  )&pFKey->aCol[nC
14470 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54  ol];.  pFKey->zT
14480 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28  o = z;.  memcpy(
14490 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e  z, pTo->z, pTo->
144a0 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20  n);.  z[pTo->n] 
144b0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  = 0;.  sqlite3De
144c0 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d  quote(z);.  z +=
144d0 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b   pTo->n+1;.  pFK
144e0 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b  ey->nCol = nCol;
144f0 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
14500 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d  =0 ){.    pFKey-
14510 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d  >aCol[0].iFrom =
14520 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65   p->nCol-1;.  }e
14530 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
14540 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
14550 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
14560 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
14570 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
14580 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
14590 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b  StrICmp(p->aCol[
145a0 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43  j].zName, pFromC
145b0 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  ol->a[i].zName)=
145c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
145d0 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  pFKey->aCol[i].i
145e0 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20  From = j;.      
145f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14600 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14610 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f     if( j>=p->nCo
14620 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
14630 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14640 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
14650 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20  "unknown column 
14660 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67  \"%s\" in foreig
14670 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
14680 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46  ", .          pF
14690 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
146a0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
146b0 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20  o fk_end;.      
146c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
146d0 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
146e0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
146f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
14700 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
14710 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  en30(pToCol->a[i
14720 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
14730 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  pFKey->aCol[i].z
14740 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d  Col = z;.      m
14750 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d  emcpy(z, pToCol-
14760 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b  >a[i].zName, n);
14770 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b  .      z[n] = 0;
14780 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b  .      z += n+1;
14790 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
147a0 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
147b0 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63   0;.  pFKey->aAc
147c0 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66  tion[0] = (u8)(f
147d0 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20 20 20  lags & 0xff);   
147e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44           /* ON D
147f0 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a  ELETE action */.
14800 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e    pFKey->aAction
14810 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c 61 67  [1] = (u8)((flag
14820 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 29  s >> 8 ) & 0xff)
14830 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54  ;    /* ON UPDAT
14840 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61  E action */..  a
14850 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
14860 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
14870 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  , 0, p->pSchema)
14880 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20   );.  pNextTo = 
14890 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65 33 48  (FKey *)sqlite3H
148a0 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53  ashInsert(&p->pS
148b0 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c  chema->fkeyHash,
148c0 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a   .      pFKey->z
148d0 54 6f 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  To, sqlite3Strle
148e0 6e 33 30 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2c  n30(pFKey->zTo),
148f0 20 28 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20   (void *)pFKey. 
14900 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 78 74 54   );.  if( pNextT
14910 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20 20  o==pFKey ){.    
14920 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
14930 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 66   = 1;.    goto f
14940 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  k_end;.  }.  if(
14950 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20 20 20   pNextTo ){.    
14960 61 73 73 65 72 74 28 20 70 4e 65 78 74 54 6f 2d  assert( pNextTo-
14970 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20  >pPrevTo==0 );. 
14980 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54     pFKey->pNextT
14990 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20  o = pNextTo;.   
149a0 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54   pNextTo->pPrevT
149b0 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a  o = pFKey;.  }..
149c0 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f    /* Link the fo
149d0 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65  reign key to the
149e0 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61   table as the la
149f0 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20  st step..  */.  
14a00 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79  p->pFKey = pFKey
14a10 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a  ;.  pFKey = 0;..
14a20 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  fk_end:.  sqlite
14a30 33 44 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65  3DbFree(db, pFKe
14a40 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  y);.#endif /* !d
14a50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
14a60 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20  IT_FOREIGN_KEY) 
14a70 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
14a80 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
14a90 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  FromCol);.  sqli
14aa0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
14ab0 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d  e(db, pToCol);.}
14ac0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
14ad0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
14ae0 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59  hen an INITIALLY
14af0 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e   IMMEDIATE or IN
14b00 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
14b10 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65  .** clause is se
14b20 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  en as part of a 
14b30 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
14b40 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44  nition.  The isD
14b50 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d  eferred.** param
14b60 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e  eter is 1 for IN
14b70 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
14b80 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49   and 0 for INITI
14b90 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a  ALLY IMMEDIATE..
14ba0 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20  ** The behavior 
14bb0 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
14bc0 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72  ntly created for
14bd0 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75  eign key is adju
14be0 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e  sted.** accordin
14bf0 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gly..*/.void sql
14c00 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
14c10 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  Key(Parse *pPars
14c20 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65  e, int isDeferre
14c30 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  d){.#ifndef SQLI
14c40 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
14c50 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  KEY.  Table *pTa
14c60 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  b;.  FKey *pFKey
14c70 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20  ;.  if( (pTab = 
14c80 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
14c90 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20  e)==0 || (pFKey 
14ca0 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d  = pTab->pFKey)==
14cb0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
14cc0 73 65 72 74 28 20 69 73 44 65 66 65 72 72 65 64  sert( isDeferred
14cd0 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65 72 72 65  ==0 || isDeferre
14ce0 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52  d==1 ); /* EV: R
14cf0 2d 33 30 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a  -30323-21917 */.
14d00 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
14d10 72 65 64 20 3d 20 28 75 38 29 69 73 44 65 66 65  red = (u8)isDefe
14d20 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rred;.#endif.}..
14d30 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
14d40 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72  ode that will er
14d50 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69  ase and refill i
14d60 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69  ndex *pIdx.  Thi
14d70 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  s is.** used to 
14d80 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  initialize a new
14d90 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 65 78  ly created index
14da0 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65   or to recompute
14db0 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
14dc0 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72  of an index in r
14dd0 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49  esponse to a REI
14de0 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
14df0 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61  .** if memRootPa
14e00 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69  ge is not negati
14e10 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ve, it means tha
14e20 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e  t the index is n
14e30 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e  ewly.** created.
14e40 20 20 54 68 65 20 72 65 67 69 73 74 65 72 20 73    The register s
14e50 70 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52  pecified by memR
14e60 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  ootPage contains
14e70 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
14e80 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
14e90 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f  index.  If memRo
14ea0 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  otPage is negati
14eb0 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ve, then.** the 
14ec0 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
14ed0 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65  ists and must be
14ee0 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20   cleared before 
14ef0 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61  being refilled a
14f00 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  nd.** the root p
14f10 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
14f20 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e  e index is taken
14f30 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e   from pIndex->tn
14f40 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  um..*/.static vo
14f50 69 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c  id sqlite3Refill
14f60 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
14f70 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  rse, Index *pInd
14f80 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50  ex, int memRootP
14f90 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  age){.  Table *p
14fa0 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54  Tab = pIndex->pT
14fb0 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61  able;  /* The ta
14fc0 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64 65  ble that is inde
14fd0 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  xed */.  int iTa
14fe0 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
14ff0 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65  ++;     /* Btree
15000 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   cursor used for
15010 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
15020 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
15030 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab++;     /* Btr
15040 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
15050 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69  or pIndex */.  i
15060 6e 74 20 69 53 6f 72 74 65 72 3b 20 20 20 20 20  nt iSorter;     
15070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15080 20 43 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 62   Cursor opened b
15090 79 20 4f 70 65 6e 53 6f 72 74 65 72 20 28 69 66  y OpenSorter (if
150a0 20 69 6e 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e   in use) */.  in
150b0 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20  t addr1;        
150c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
150d0 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f  Address of top o
150e0 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  f loop */.  int 
150f0 61 64 64 72 32 3b 20 20 20 20 20 20 20 20 20 20  addr2;          
15100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
15110 64 72 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f  dress to jump to
15120 20 66 6f 72 20 6e 65 78 74 20 69 74 65 72 61 74   for next iterat
15130 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75  ion */.  int tnu
15140 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
15150 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
15160 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  page of index */
15170 0a 20 20 69 6e 74 20 69 50 61 72 74 49 64 78 4c  .  int iPartIdxL
15180 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  abel;           
15190 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69    /* Jump to thi
151a0 73 20 6c 61 62 65 6c 20 74 6f 20 73 6b 69 70 20  s label to skip 
151b0 61 20 72 6f 77 20 2a 2f 0a 20 20 56 64 62 65 20  a row */.  Vdbe 
151c0 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
151d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
151e0 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
151f0 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
15200 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  hine */.  KeyInf
15210 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20  o *pKey;        
15220 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49           /* KeyI
15230 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f  nfo for index */
15240 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
15250 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15260 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
15270 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 69 65 64  lding assemblied
15280 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f   index record */
15290 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
152a0 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
152b0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
152c0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
152d0 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
152e0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
152f0 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  (db, pIndex->pSc
15300 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20  hema);..#ifndef 
15310 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
15320 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  ORIZATION.  if( 
15330 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
15340 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
15350 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d  REINDEX, pIndex-
15360 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20  >zName, 0,.     
15370 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
15380 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74  ame ) ){.    ret
15390 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
153a0 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20 61 20  .  /* Require a 
153b0 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
153c0 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72 66 6f  e table to perfo
153d0 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  rm this operatio
153e0 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61  n */.  sqlite3Ta
153f0 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
15400 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
15410 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   1, pTab->zName)
15420 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
15430 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
15440 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
15450 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52  turn;.  if( memR
15460 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20  ootPage>=0 ){.  
15470 20 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74    tnum = memRoot
15480 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Page;.  }else{. 
15490 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78     tnum = pIndex
154a0 2d 3e 74 6e 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b  ->tnum;.  }.  pK
154b0 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  ey = sqlite3KeyI
154c0 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73  nfoOfIndex(pPars
154d0 65 2c 20 70 49 6e 64 65 78 29 3b 0a 0a 20 20 2f  e, pIndex);..  /
154e0 2a 20 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65  * Open the sorte
154f0 72 20 63 75 72 73 6f 72 20 69 66 20 77 65 20 61  r cursor if we a
15500 72 65 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a  re to use one. *
15510 2f 0a 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50  /.  iSorter = pP
15520 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
15530 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15540 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70  4(v, OP_SorterOp
15550 65 6e 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20  en, iSorter, 0, 
15560 30 2c 20 28 63 68 61 72 2a 29 0a 20 20 20 20 20  0, (char*).     
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
15580 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66  qlite3KeyInfoRef
15590 28 70 4b 65 79 29 2c 20 50 34 5f 4b 45 59 49 4e  (pKey), P4_KEYIN
155a0 46 4f 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  FO);..  /* Open 
155b0 74 68 65 20 74 61 62 6c 65 2e 20 4c 6f 6f 70 20  the table. Loop 
155c0 74 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73  through all rows
155d0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2c 20 69   of the table, i
155e0 6e 73 65 72 74 69 6e 67 20 69 6e 64 65 78 0a 20  nserting index. 
155f0 20 2a 2a 20 72 65 63 6f 72 64 73 20 69 6e 74 6f   ** records into
15600 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a   the sorter. */.
15610 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
15620 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c  le(pParse, iTab,
15630 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
15640 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64 72  penRead);.  addr
15650 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
15660 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
15670 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 20 56 64  nd, iTab, 0); Vd
15680 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
15690 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
156a0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
156b0 50 61 72 73 65 29 3b 0a 0a 20 20 73 71 6c 69 74  Parse);..  sqlit
156c0 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b  e3GenerateIndexK
156d0 65 79 28 70 50 61 72 73 65 2c 70 49 6e 64 65 78  ey(pParse,pIndex
156e0 2c 69 54 61 62 2c 72 65 67 52 65 63 6f 72 64 2c  ,iTab,regRecord,
156f0 30 2c 26 69 50 61 72 74 49 64 78 4c 61 62 65 6c  0,&iPartIdxLabel
15700 2c 30 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ,0,0);.  sqlite3
15710 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15720 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 69  _SorterInsert, i
15730 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72  Sorter, regRecor
15740 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73  d);.  sqlite3Res
15750 6f 6c 76 65 50 61 72 74 49 64 78 4c 61 62 65 6c  olvePartIdxLabel
15760 28 70 50 61 72 73 65 2c 20 69 50 61 72 74 49 64  (pParse, iPartId
15770 78 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74  xLabel);.  sqlit
15780 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15790 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  OP_Next, iTab, a
157a0 64 64 72 31 2b 31 29 3b 20 56 64 62 65 43 6f 76  ddr1+1); VdbeCov
157b0 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
157c0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
157d0 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 69 66 28  v, addr1);.  if(
157e0 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3c 30 20 29   memRootPage<0 )
157f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15800 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20  p2(v, OP_Clear, 
15810 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 73 71  tnum, iDb);.  sq
15820 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
15830 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
15840 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62   iIdx, tnum, iDb
15850 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
15860 20 20 20 20 20 20 20 28 63 68 61 72 20 2a 29 70         (char *)p
15870 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  Key, P4_KEYINFO)
15880 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
15890 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
158a0 47 5f 42 55 4c 4b 43 53 52 7c 28 28 6d 65 6d 52  G_BULKCSR|((memR
158b0 6f 6f 74 50 61 67 65 3e 3d 30 29 3f 4f 50 46 4c  ootPage>=0)?OPFL
158c0 41 47 5f 50 32 49 53 52 45 47 3a 30 29 29 3b 0a  AG_P2ISREG:0));.
158d0 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
158e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
158f0 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69  OP_SorterSort, i
15900 53 6f 72 74 65 72 2c 20 30 29 3b 20 56 64 62 65  Sorter, 0); Vdbe
15910 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 61  Coverage(v);.  a
15920 73 73 65 72 74 28 20 70 4b 65 79 21 3d 30 20 7c  ssert( pKey!=0 |
15930 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
15940 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
15950 72 72 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  rr );.  if( pInd
15960 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  ex->onError!=OE_
15970 4e 6f 6e 65 20 26 26 20 70 4b 65 79 21 3d 30 20  None && pKey!=0 
15980 29 7b 0a 20 20 20 20 69 6e 74 20 6a 32 20 3d 20  ){.    int j2 = 
15990 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
159a0 6e 74 41 64 64 72 28 76 29 20 2b 20 33 3b 0a 20  ntAddr(v) + 3;. 
159b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
159c0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
159d0 20 30 2c 20 6a 32 29 3b 0a 20 20 20 20 61 64 64   0, j2);.    add
159e0 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
159f0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
15a00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15a10 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53  ddOp4Int(v, OP_S
15a20 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c 20 69 53  orterCompare, iS
15a30 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65 67 52 65  orter, j2, regRe
15a40 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20  cord,.          
15a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
15a60 4b 65 79 2d 3e 6e 46 69 65 6c 64 20 2d 20 70 49  Key->nField - pI
15a70 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20  ndex->nKeyCol); 
15a80 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
15a90 0a 20 20 20 20 73 71 6c 69 74 65 33 55 6e 69 71  .    sqlite3Uniq
15aa0 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ueConstraint(pPa
15ab0 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 70  rse, OE_Abort, p
15ac0 49 6e 64 65 78 29 3b 0a 20 20 7d 65 6c 73 65 7b  Index);.  }else{
15ad0 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
15ae0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
15af0 64 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71  ddr(v);.  }.  sq
15b00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15b10 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61  v, OP_SorterData
15b20 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65  , iSorter, regRe
15b30 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
15b40 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
15b50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78  _IdxInsert, iIdx
15b60 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 31 29 3b  , regRecord, 1);
15b70 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
15b80 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
15b90 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b  _USESEEKRESULT);
15ba0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
15bb0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
15bc0 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
15bd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15be0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78  (v, OP_SorterNex
15bf0 74 2c 20 69 53 6f 72 74 65 72 2c 20 61 64 64 72  t, iSorter, addr
15c00 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  2); VdbeCoverage
15c10 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
15c20 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
15c30 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  dr1);..  sqlite3
15c40 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
15c50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20  _Close, iTab);. 
15c60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15c70 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
15c80 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  iIdx);.  sqlite3
15c90 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
15ca0 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72 29  _Close, iSorter)
15cb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
15cc0 61 74 65 20 68 65 61 70 20 73 70 61 63 65 20 74  ate heap space t
15cd0 6f 20 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78 20  o hold an Index 
15ce0 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 43 6f 6c  object with nCol
15cf0 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20   columns..**.** 
15d00 49 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c  Increase the all
15d10 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f 20  ocation size to 
15d20 70 72 6f 76 69 64 65 20 61 6e 20 65 78 74 72 61  provide an extra
15d30 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a   nExtra bytes.**
15d40 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   of 8-byte align
15d50 65 64 20 73 70 61 63 65 20 61 66 74 65 72 20 74  ed space after t
15d60 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  he Index object 
15d70 61 6e 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20  and return a.** 
15d80 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
15d90 65 78 74 72 61 20 73 70 61 63 65 20 69 6e 20 2a  extra space in *
15da0 70 70 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65  ppExtra..*/.Inde
15db0 78 20 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61  x *sqlite3Alloca
15dc0 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a 20  teIndexObject(. 
15dd0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
15de0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
15df0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
15e00 20 20 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20 20    i16 nCol,     
15e10 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
15e20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
15e30 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a  s in the index *
15e40 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
15e50 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
15e60 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 65  er of bytes of e
15e70 78 74 72 61 20 73 70 61 63 65 20 74 6f 20 61 6c  xtra space to al
15e80 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  loc */.  char **
15e90 70 70 45 78 74 72 61 20 20 20 20 20 20 20 2f 2a  ppExtra       /*
15ea0 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
15eb0 22 65 78 74 72 61 22 20 73 70 61 63 65 20 2a 2f  "extra" space */
15ec0 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 20  .){.  Index *p; 
15ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
15ee0 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20 6f 62  located index ob
15ef0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ject */.  int nB
15f00 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  yte;           /
15f10 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65  * Bytes of space
15f20 20 66 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65 63   for Index objec
15f30 74 20 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a 20  t + arrays */.. 
15f40 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
15f50 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 20 2b  sizeof(Index)) +
15f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15f70 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
15f80 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52    */.          R
15f90 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61  OUND8(sizeof(cha
15fa0 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20 20  r*)*nCol) +     
15fb0 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43      /* Index.azC
15fc0 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  oll     */.     
15fd0 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65       ROUND8(size
15fe0 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c  of(LogEst)*(nCol
15ff0 2b 31 29 20 2b 20 20 20 20 20 2f 2a 20 49 6e 64  +1) +     /* Ind
16000 65 78 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20 20  ex.aiRowLogEst  
16010 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
16020 20 20 20 20 20 73 69 7a 65 6f 66 28 69 31 36 29       sizeof(i16)
16030 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20  *nCol +         
16040 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f     /* Index.aiCo
16050 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20  lumn   */.      
16060 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
16070 66 28 75 38 29 2a 6e 43 6f 6c 29 3b 20 20 20 20  f(u8)*nCol);    
16080 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
16090 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a  x.aSortOrder */.
160a0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d    p = sqlite3DbM
160b0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
160c0 79 74 65 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20  yte + nExtra);. 
160d0 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63 68   if( p ){.    ch
160e0 61 72 20 2a 70 45 78 74 72 61 20 3d 20 28 28 63  ar *pExtra = ((c
160f0 68 61 72 2a 29 70 29 2b 52 4f 55 4e 44 38 28 73  har*)p)+ROUND8(s
16100 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20  izeof(Index));. 
16110 20 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28     p->azColl = (
16120 63 68 61 72 2a 2a 29 70 45 78 74 72 61 3b 20 20  char**)pExtra;  
16130 20 20 20 20 20 70 45 78 74 72 61 20 2b 3d 20 52       pExtra += R
16140 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61  OUND8(sizeof(cha
16150 72 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 70  r*)*nCol);.    p
16160 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20  ->aiRowLogEst = 
16170 28 4c 6f 67 45 73 74 2a 29 70 45 78 74 72 61 3b  (LogEst*)pExtra;
16180 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f   pExtra += sizeo
16190 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b  f(LogEst)*(nCol+
161a0 31 29 3b 0a 20 20 20 20 70 2d 3e 61 69 43 6f 6c  1);.    p->aiCol
161b0 75 6d 6e 20 3d 20 28 69 31 36 2a 29 70 45 78 74  umn = (i16*)pExt
161c0 72 61 3b 20 20 20 20 20 20 20 70 45 78 74 72 61  ra;       pExtra
161d0 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a   += sizeof(i16)*
161e0 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 53 6f  nCol;.    p->aSo
161f0 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 70  rtOrder = (u8*)p
16200 45 78 74 72 61 3b 0a 20 20 20 20 70 2d 3e 6e 43  Extra;.    p->nC
16210 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20  olumn = nCol;.  
16220 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6e    p->nKeyCol = n
16230 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 2a 70 70  Col - 1;.    *pp
16240 45 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29  Extra = ((char*)
16250 70 29 20 2b 20 6e 42 79 74 65 3b 0a 20 20 7d 0a  p) + nByte;.  }.
16260 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
16270 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
16280 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53  w index for an S
16290 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65  QL table.  pName
162a0 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20  1.pName2 is the 
162b0 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
162c0 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69  x .** and pTblLi
162d0 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  st is the name o
162e0 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  f the table that
162f0 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
16300 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a  d.  Both will .*
16310 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20  * be NULL for a 
16320 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61  primary key or a
16330 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  n index that is 
16340 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69 73  created to satis
16350 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63  fy a.** UNIQUE c
16360 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70  onstraint.  If p
16370 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78  Table and pIndex
16380 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70   are NULL, use p
16390 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
163a0 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65  .** as the table
163b0 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
163c0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
163d0 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74 68  le is a table th
163e0 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74  at is.** current
163f0 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
16400 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54 45  cted by a CREATE
16410 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
16420 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73  ..**.** pList is
16430 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   a list of colum
16440 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
16450 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65  .  pList will be
16460 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a   NULL if this.**
16470 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65   is a primary ke
16480 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73  y or unique-cons
16490 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f  traint on the mo
164a0 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e  st recent column
164b0 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65   added.** to the
164c0 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
164d0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
164e0 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ion.  .**.** If 
164f0 74 68 65 20 69 6e 64 65 78 20 69 73 20 63 72 65  the index is cre
16500 61 74 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ated successfull
16510 79 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  y, return a poin
16520 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 49  ter to the new I
16530 6e 64 65 78 0a 2a 2a 20 73 74 72 75 63 74 75 72  ndex.** structur
16540 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  e. This is used 
16550 62 79 20 73 71 6c 69 74 65 33 41 64 64 50 72 69  by sqlite3AddPri
16560 6d 61 72 79 4b 65 79 28 29 20 74 6f 20 6d 61 72  maryKey() to mar
16570 6b 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61  k the index.** a
16580 73 20 74 68 65 20 74 61 62 6c 65 73 20 70 72 69  s the tables pri
16590 6d 61 72 79 20 6b 65 79 20 28 49 6e 64 65 78 2e  mary key (Index.
165a0 61 75 74 6f 49 6e 64 65 78 3d 3d 32 29 2e 0a 2a  autoIndex==2)..*
165b0 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
165c0 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50  CreateIndex(.  P
165d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
165e0 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61    /* All informa
165f0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20  tion about this 
16600 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  parse */.  Token
16610 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
16620 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69   First part of i
16630 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62  ndex name. May b
16640 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  e NULL */.  Toke
16650 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
16660 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
16670 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
16680 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72   be NULL */.  Sr
16690 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c  cList *pTblName,
166a0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64   /* Table to ind
166b0 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e  ex. Use pParse->
166c0 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a  pNewTable if 0 *
166d0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
166e0 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74  ist,   /* A list
166f0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
16700 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
16710 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
16720 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f    /* OE_Abort, O
16730 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70  E_Ignore, OE_Rep
16740 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65  lace, or OE_None
16750 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74   */.  Token *pSt
16760 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  art,     /* The 
16770 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
16780 74 20 62 65 67 69 6e 73 20 74 68 69 73 20 73 74  t begins this st
16790 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70  atement */.  Exp
167a0 72 20 2a 70 50 49 57 68 65 72 65 2c 20 20 20 20  r *pPIWhere,    
167b0 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
167c0 66 6f 72 20 70 61 72 74 69 61 6c 20 69 6e 64 69  for partial indi
167d0 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ces */.  int sor
167e0 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53  tOrder,     /* S
167f0 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69  ort order of pri
16800 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c  mary key when pL
16810 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69  ist==NULL */.  i
16820 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 20 20 20  nt ifNotExist   
16830 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20    /* Omit error 
16840 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  if index already
16850 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20   exists */.){.  
16860 49 6e 64 65 78 20 2a 70 52 65 74 20 3d 20 30 3b  Index *pRet = 0;
16870 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
16880 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 54  to return */.  T
16890 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
168a0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
168b0 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
168c0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
168d0 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  0;   /* The inde
168e0 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  x to be created 
168f0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
16900 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d   = 0;     /* Nam
16910 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a  e of the index *
16920 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
16930 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16940 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
16950 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69   in zName */.  i
16960 6e 74 20 69 2c 20 6a 3b 0a 20 20 44 62 46 69 78  nt i, j;.  DbFix
16970 65 72 20 73 46 69 78 3b 20 20 20 20 20 20 20 20  er sFix;        
16980 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67  /* For assigning
16990 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20   database names 
169a0 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69  to pTable */.  i
169b0 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b  nt sortOrderMask
169c0 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f  ;   /* 1 to hono
169d0 72 20 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e  r DESC in index.
169e0 20 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a    0 to ignore. *
169f0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
16a00 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
16a10 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
16a20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63       /* The spec
16a30 69 66 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61  ific table conta
16a40 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65  ining the indexe
16a50 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  d database */.  
16a60 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
16a70 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
16a80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
16a90 61 74 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  at is being writ
16aa0 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ten */.  Token *
16ab0 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a  pName = 0;    /*
16ac0 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   Unqualified nam
16ad0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74  e of the index t
16ae0 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74  o create */.  st
16af0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
16b00 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f  em *pListItem; /
16b10 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
16b20 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20 63 6f  er pList */.  co
16b30 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62  nst Column *pTab
16b40 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Col;           /
16b50 2a 20 41 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  * A column in th
16b60 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
16b70 20 6e 45 78 74 72 61 20 3d 20 30 3b 20 20 20 20   nExtra = 0;    
16b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16b90 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   Space allocated
16ba0 20 66 6f 72 20 7a 45 78 74 72 61 5b 5d 20 2a 2f   for zExtra[] */
16bb0 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 43 6f 6c  .  int nExtraCol
16bc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16bd0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
16be0 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 6e   extra columns n
16bf0 65 65 64 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  eeded */.  char 
16c00 2a 7a 45 78 74 72 61 20 3d 20 30 3b 20 20 20 20  *zExtra = 0;    
16c10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
16c20 78 74 72 61 20 73 70 61 63 65 20 61 66 74 65 72  xtra space after
16c30 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63   the Index objec
16c40 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  t */.  Index *pP
16c50 6b 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 50  k = 0;      /* P
16c60 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
16c70 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57   for WITHOUT ROW
16c80 49 44 20 74 61 62 6c 65 73 20 2a 2f 0a 0a 20 20  ID tables */..  
16c90 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
16ca0 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 20 20 20  nErr==0 );      
16cb0 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20  /* Never called 
16cc0 77 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72  with prior error
16cd0 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d  s */.  if( db->m
16ce0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49  allocFailed || I
16cf0 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
16d00 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
16d10 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
16d20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  }.  if( SQLITE_O
16d30 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
16d40 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
16d50 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
16d60 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
16d70 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
16d80 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
16d90 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
16da0 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69    Return early i
16db0 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a  f not found..  *
16dc0 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65  /.  if( pTblName
16dd0 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55  !=0 ){..    /* U
16de0 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20  se the two-part 
16df0 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65  index name to de
16e00 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61  termine the data
16e10 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20  base .    ** to 
16e20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74  search for the t
16e30 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20  able. 'Fix' the 
16e40 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
16e50 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66  is db.    ** bef
16e60 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74  ore looking up t
16e70 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  he table..    */
16e80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
16e90 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b  me1 && pName2 );
16ea0 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
16eb0 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
16ec0 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
16ed0 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
16ee0 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67     if( iDb<0 ) g
16ef0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
16f00 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72  index;.    asser
16f10 74 28 20 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d  t( pName && pNam
16f20 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66  e->z );..#ifndef
16f30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d   SQLITE_OMIT_TEM
16f40 50 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  PDB.    /* If th
16f50 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73  e index name was
16f60 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68   unqualified, ch
16f70 65 63 6b 20 69 66 20 74 68 65 20 74 61 62 6c 65  eck if the table
16f80 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d  .    ** is a tem
16f90 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20  p table. If so, 
16fa0 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  set the database
16fb0 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f   to 1. Do not do
16fc0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 66 20   this.    ** if 
16fd0 69 6e 69 74 69 61 6c 69 73 69 6e 67 20 61 20 64  initialising a d
16fe0 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a  atabase schema..
16ff0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
17000 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
17010 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71  .      pTab = sq
17020 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b  lite3SrcListLook
17030 75 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e  up(pParse, pTblN
17040 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
17050 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20  pName2->n==0 && 
17060 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53  pTab && pTab->pS
17070 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31  chema==db->aDb[1
17080 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ].pSchema ){.   
17090 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20       iDb = 1;.  
170a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
170b0 69 66 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46  if..    sqlite3F
170c0 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50  ixInit(&sFix, pP
170d0 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65  arse, iDb, "inde
170e0 78 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  x", pName);.    
170f0 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 72  if( sqlite3FixSr
17100 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54 62  cList(&sFix, pTb
17110 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  lName) ){.      
17120 2f 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 70  /* Because the p
17130 61 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73  arser constructs
17140 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61   pTblName from a
17150 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69   single identifi
17160 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  er,.      ** sql
17170 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 20 63  ite3FixSrcList c
17180 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a  an never fail. *
17190 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30  /.      assert(0
171a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  );.    }.    pTa
171b0 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
171c0 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73  eTableItem(pPars
171d0 65 2c 20 30 2c 20 26 70 54 62 6c 4e 61 6d 65 2d  e, 0, &pTblName-
171e0 3e 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73 65  >a[0]);.    asse
171f0 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
17200 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 54 61 62 3d  iled==0 || pTab=
17210 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  =0 );.    if( pT
17220 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  ab==0 ) goto exi
17230 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
17240 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 26      if( iDb==1 &
17250 26 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  & db->aDb[iDb].p
17260 53 63 68 65 6d 61 21 3d 70 54 61 62 2d 3e 70 53  Schema!=pTab->pS
17270 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 73  chema ){.      s
17280 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
17290 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
172a0 20 20 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74     "cannot creat
172b0 65 20 61 20 54 45 4d 50 20 69 6e 64 65 78 20 6f  e a TEMP index o
172c0 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65  n non-TEMP table
172d0 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20   \"%s\"",.      
172e0 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
172f0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  );.      goto ex
17300 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
17310 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
17320 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
17330 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72   pPk = sqlite3Pr
17340 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
17350 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ab);.  }else{.  
17360 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d    assert( pName=
17370 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
17380 28 20 70 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20  ( pStart==0 );. 
17390 20 20 20 70 54 61 62 20 3d 20 70 50 61 72 73 65     pTab = pParse
173a0 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20  ->pNewTable;.   
173b0 20 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74   if( !pTab ) got
173c0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
173d0 64 65 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  dex;.    iDb = s
173e0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
173f0 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
17400 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44  chema);.  }.  pD
17410 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
17420 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  ];..  assert( pT
17430 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ab!=0 );.  asser
17440 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
17450 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  =0 );.  if( sqli
17460 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62  te3StrNICmp(pTab
17470 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  ->zName, "sqlite
17480 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 20  _", 7)==0 .     
17490 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e    && sqlite3StrN
174a0 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d  ICmp(&pTab->zNam
174b0 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22  e[7],"altertab_"
174c0 2c 39 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  ,9)!=0 ){.    sq
174d0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
174e0 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
174f0 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
17500 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
17510 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
17520 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
17530 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
17540 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66  E_OMIT_VIEW.  if
17550 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
17560 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
17570 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
17580 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65  views may not be
17590 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20   indexed");.    
175a0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
175b0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64  _index;.  }.#end
175c0 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
175d0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
175e0 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74  BLE.  if( IsVirt
175f0 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
17600 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
17610 28 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61  (pParse, "virtua
17620 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  l tables may not
17630 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
17640 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
17650 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
17660 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  endif..  /*.  **
17670 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f   Find the name o
17680 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61  f the index.  Ma
17690 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
176a0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f   not already ano
176b0 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ther.  ** index 
176c0 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  or table with th
176d0 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20  e same name.  . 
176e0 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69   **.  ** Excepti
176f0 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72  on:  If we are r
17700 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73  eading the names
17710 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e   of permanent in
17720 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20  dices from the. 
17730 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   ** sqlite_maste
17740 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65  r table (because
17750 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
17760 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20  ess changed the 
17770 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a  schema) and.  **
17780 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65   one of the inde
17790 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73  x names collides
177a0 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f   with the name o
177b0 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  f a temporary ta
177c0 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65  ble or.  ** inde
177d0 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  x, then we will 
177e0 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63  continue to proc
177f0 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a  ess this index..
17800 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61    **.  ** If pNa
17810 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
17820 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20  hat we are.  ** 
17830 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70  dealing with a p
17840 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e  rimary key or UN
17850 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
17860 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76    We have to inv
17870 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e  ent our.  ** own
17880 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   name..  */.  if
17890 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
178a0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
178b0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
178c0 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
178d0 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
178e0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
178f0 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  x;.    assert( p
17900 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  Name->z!=0 );.  
17910 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
17920 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
17930 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
17940 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
17950 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
17960 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
17970 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
17980 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66  busy ){.      if
17990 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
179a0 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  le(db, zName, 0)
179b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
179c0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
179d0 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73  Parse, "there is
179e0 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65   already a table
179f0 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d   named %s", zNam
17a00 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
17a10 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
17a20 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
17a30 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
17a40 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
17a50 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65  Name, pDb->zName
17a60 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
17a70 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29 7b  ( !ifNotExist ){
17a80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17a90 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
17aa0 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61   "index %s alrea
17ab0 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d  dy exists", zNam
17ac0 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
17ad0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17ae0 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
17af0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17b00 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
17b10 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
17b20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
17b30 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
17b40 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
17b50 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  else{.    int n;
17b60 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f  .    Index *pLoo
17b70 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  p;.    for(pLoop
17b80 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e  =pTab->pIndex, n
17b90 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =1; pLoop; pLoop
17ba0 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e  =pLoop->pNext, n
17bb0 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20  ++){}.    zName 
17bc0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
17bd0 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 61 75 74  (db, "sqlite_aut
17be0 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c 20 70  oindex_%s_%d", p
17bf0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a  Tab->zName, n);.
17c00 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
17c10 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
17c20 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
17c30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
17c40 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68  * Check for auth
17c50 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65  orization to cre
17c60 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20  ate an index..  
17c70 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
17c80 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
17c90 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e  TION.  {.    con
17ca0 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70  st char *zDb = p
17cb0 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  Db->zName;.    i
17cc0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
17cd0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
17ce0 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
17cf0 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c  A_TABLE(iDb), 0,
17d00 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
17d10 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
17d20 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
17d30 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
17d40 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  TE_INDEX;.    if
17d50 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
17d60 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53  & iDb==1 ) i = S
17d70 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
17d80 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
17d90 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
17da0 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61  k(pParse, i, zNa
17db0 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
17dc0 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
17dd0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
17de0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
17df0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
17e00 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65   pList==0, it me
17e10 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ans this routine
17e20 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d   was called to m
17e30 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20  ake a primary.  
17e40 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68  ** key out of th
17e50 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64  e last column ad
17e60 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
17e70 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
17e80 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65  ion..  ** So cre
17e90 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20  ate a fake list 
17ea0 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73  to simulate this
17eb0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69  ..  */.  if( pLi
17ec0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
17ed0 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
17ee0 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
17ef0 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  e, 0, 0);.    if
17f00 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74  ( pList==0 ) got
17f10 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
17f20 64 65 78 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  dex;.    pList->
17f30 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  a[0].zName = sql
17f40 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61  ite3DbStrDup(pPa
17f50 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
17f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f80 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62   pTab->aCol[pTab
17f90 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 29  ->nCol-1].zName)
17fa0 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30  ;.    pList->a[0
17fb0 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  ].sortOrder = (u
17fc0 38 29 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  8)sortOrder;.  }
17fd0 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
17fe0 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73  t how many bytes
17ff0 20 6f 66 20 73 70 61 63 65 20 61 72 65 20 72 65   of space are re
18000 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
18010 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20  explicitly.  ** 
18020 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74  specified collat
18030 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
18040 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
18050 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
18060 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
18070 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73  pr *pExpr = pLis
18080 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
18090 20 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a     if( pExpr ){.
180a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
180b0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c  xpr->op==TK_COLL
180c0 41 54 45 20 29 3b 0a 20 20 20 20 20 20 6e 45 78  ATE );.      nEx
180d0 74 72 61 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69  tra += (1 + sqli
180e0 74 65 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70  te3Strlen30(pExp
180f0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 29 3b 0a 20  r->u.zToken));. 
18100 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a     }.  }..  /* .
18110 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    ** Allocate th
18120 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
18130 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65  e. .  */.  nName
18140 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
18150 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 45 78  30(zName);.  nEx
18160 74 72 61 43 6f 6c 20 3d 20 70 50 6b 20 3f 20 70  traCol = pPk ? p
18170 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3a 20 31 3b  Pk->nKeyCol : 1;
18180 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
18190 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78  te3AllocateIndex
181a0 4f 62 6a 65 63 74 28 64 62 2c 20 70 4c 69 73 74  Object(db, pList
181b0 2d 3e 6e 45 78 70 72 20 2b 20 6e 45 78 74 72 61  ->nExpr + nExtra
181c0 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
181d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181e0 20 20 20 20 20 20 20 20 20 20 20 6e 4e 61 6d 65             nName
181f0 20 2b 20 6e 45 78 74 72 61 20 2b 20 31 2c 20 26   + nExtra + 1, &
18200 7a 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 64  zExtra);.  if( d
18210 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18220 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
18230 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
18240 20 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49 47   }.  assert( EIG
18250 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
18260 54 28 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c  T(pIndex->aiRowL
18270 6f 67 45 73 74 29 20 29 3b 0a 20 20 61 73 73 65  ogEst) );.  asse
18280 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
18290 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d  LIGNMENT(pIndex-
182a0 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20 20 70 49  >azColl) );.  pI
182b0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 45  ndex->zName = zE
182c0 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b  xtra;.  zExtra +
182d0 3d 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 6d  = nName + 1;.  m
182e0 65 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e  emcpy(pIndex->zN
182f0 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  ame, zName, nNam
18300 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  e+1);.  pIndex->
18310 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20  pTable = pTab;. 
18320 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
18330 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a   = (u8)onError;.
18340 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f    pIndex->uniqNo
18350 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 21  tNull = onError!
18360 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 70 49 6e 64  =OE_None;.  pInd
18370 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20  ex->autoIndex = 
18380 28 75 38 29 28 70 4e 61 6d 65 3d 3d 30 29 3b 0a  (u8)(pName==0);.
18390 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d    pIndex->pSchem
183a0 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
183b0 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 49 6e 64  .pSchema;.  pInd
183c0 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c  ex->nKeyCol = pL
183d0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66  ist->nExpr;.  if
183e0 28 20 70 50 49 57 68 65 72 65 20 29 7b 0a 20 20  ( pPIWhere ){.  
183f0 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
18400 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50  SelfReference(pP
18410 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 50  arse, pTab, NC_P
18420 61 72 74 49 64 78 2c 20 70 50 49 57 68 65 72 65  artIdx, pPIWhere
18430 2c 20 30 29 3b 0a 20 20 20 20 70 49 6e 64 65 78  , 0);.    pIndex
18440 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 20  ->pPartIdxWhere 
18450 3d 20 70 50 49 57 68 65 72 65 3b 0a 20 20 20 20  = pPIWhere;.    
18460 70 50 49 57 68 65 72 65 20 3d 20 30 3b 0a 20 20  pPIWhere = 0;.  
18470 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  }.  assert( sqli
18480 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
18490 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
184a0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
184b0 20 73 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c   see if we shoul
184c0 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71  d honor DESC req
184d0 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63  uests on index c
184e0 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66  olumns.  */.  if
184f0 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
18500 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29  file_format>=4 )
18510 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d  {.    sortOrderM
18520 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48  ask = -1;   /* H
18530 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d  onor DESC */.  }
18540 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72  else{.    sortOr
18550 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  derMask = 0;    
18560 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a  /* Ignore DESC *
18570 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e  /.  }..  /* Scan
18580 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   the names of th
18590 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
185a0 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
185b0 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f  exed and.  ** lo
185c0 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  ad the column in
185d0 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49  dices into the I
185e0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
185f0 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
18600 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c  .  ** if any col
18610 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  umn is not found
18620 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f  ..  **.  ** TODO
18630 3a 20 20 41 64 64 20 61 20 74 65 73 74 20 74 6f  :  Add a test to
18640 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
18650 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20  the same column 
18660 69 73 20 6e 6f 74 20 6e 61 6d 65 64 0a 20 20 2a  is not named.  *
18670 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  * more than once
18680 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65   within the same
18690 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68   index.  Only th
186a0 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65  e first instance
186b0 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6c   of.  ** the col
186c0 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72 20 62 65  umn will ever be
186d0 20 75 73 65 64 20 62 79 20 74 68 65 20 6f 70 74   used by the opt
186e0 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65 20 74 68  imizer.  Note th
186f0 61 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  at using the.  *
18700 2a 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 6d 6f  * same column mo
18710 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 63 61 6e  re than once can
18720 6e 6f 74 20 62 65 20 61 6e 20 65 72 72 6f 72 20  not be an error 
18730 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75  because that wou
18740 6c 64 20 0a 20 20 2a 2a 20 62 72 65 61 6b 20 62  ld .  ** break b
18750 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
18760 62 69 6c 69 74 79 20 2d 20 69 74 20 6e 65 65 64  bility - it need
18770 73 20 74 6f 20 62 65 20 61 20 77 61 72 6e 69 6e  s to be a warnin
18780 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  g..  */.  for(i=
18790 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69  0, pListItem=pLi
187a0 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e  st->a; i<pList->
187b0 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73  nExpr; i++, pLis
187c0 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63 6f  tItem++){.    co
187d0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e 61  nst char *zColNa
187e0 6d 65 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e  me = pListItem->
187f0 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 72  zName;.    int r
18800 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
18810 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  r;.    char *zCo
18820 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
18830 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
18840 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
18850 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30   */..    for(j=0
18860 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e  , pTabCol=pTab->
18870 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  aCol; j<pTab->nC
18880 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62 43 6f 6c  ol; j++, pTabCol
18890 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
188a0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43  qlite3StrICmp(zC
188b0 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43 6f 6c 2d  olName, pTabCol-
188c0 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  >zName)==0 ) bre
188d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
188e0 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  ( j>=pTab->nCol 
188f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18900 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
18910 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20 6e   "table %s has n
18920 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25  o column named %
18930 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  s",.        pTab
18940 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61 6d  ->zName, zColNam
18950 65 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  e);.      pParse
18960 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
18970 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  1;.      goto ex
18980 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18990 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
189a0 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 3d 30  t( pTab->nCol<=0
189b0 78 37 66 66 66 20 26 26 20 6a 3c 3d 30 78 37 66  x7fff && j<=0x7f
189c0 66 66 20 29 3b 0a 20 20 20 20 70 49 6e 64 65 78  ff );.    pIndex
189d0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
189e0 28 69 31 36 29 6a 3b 0a 20 20 20 20 69 66 28 20  (i16)j;.    if( 
189f0 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
18a00 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43   ){.      int nC
18a10 6f 6c 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72  oll;.      asser
18a20 74 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45  t( pListItem->pE
18a30 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c  xpr->op==TK_COLL
18a40 41 54 45 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f  ATE );.      zCo
18a50 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e  ll = pListItem->
18a60 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
18a70 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73  .      nColl = s
18a80 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
18a90 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20  Coll) + 1;.     
18aa0 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e   assert( nExtra>
18ab0 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20  =nColl );.      
18ac0 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 7a  memcpy(zExtra, z
18ad0 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20  Coll, nColl);.  
18ae0 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74      zColl = zExt
18af0 72 61 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61  ra;.      zExtra
18b00 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20   += nColl;.     
18b10 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c   nExtra -= nColl
18b20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18b30 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d     zColl = pTab-
18b40 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a  >aCol[j].zColl;.
18b50 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c        if( !zColl
18b60 20 29 20 7a 43 6f 6c 6c 20 3d 20 22 42 49 4e 41   ) zColl = "BINA
18b70 52 59 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  RY";.    }.    i
18b80 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
18b90 79 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63  y && !sqlite3Loc
18ba0 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
18bb0 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
18bc0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18bd0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
18be0 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43  .    pIndex->azC
18bf0 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a  oll[i] = zColl;.
18c00 20 20 20 20 72 65 71 75 65 73 74 65 64 53 6f 72      requestedSor
18c10 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74  tOrder = pListIt
18c20 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20  em->sortOrder & 
18c30 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20  sortOrderMask;. 
18c40 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74     pIndex->aSort
18c50 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75 38 29 72  Order[i] = (u8)r
18c60 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
18c70 72 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  r;.    if( pTab-
18c80 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c  >aCol[j].notNull
18c90 3d 3d 30 20 29 20 70 49 6e 64 65 78 2d 3e 75 6e  ==0 ) pIndex->un
18ca0 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20  iqNotNull = 0;. 
18cb0 20 7d 0a 20 20 69 66 28 20 70 50 6b 20 29 7b 0a   }.  if( pPk ){.
18cc0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
18cd0 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b  Pk->nKeyCol; j++
18ce0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d  ){.      int x =
18cf0 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a   pPk->aiColumn[j
18d00 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73  ];.      if( has
18d10 43 6f 6c 75 6d 6e 28 70 49 6e 64 65 78 2d 3e 61  Column(pIndex->a
18d20 69 43 6f 6c 75 6d 6e 2c 20 70 49 6e 64 65 78 2d  iColumn, pIndex-
18d30 3e 6e 4b 65 79 43 6f 6c 2c 20 78 29 20 29 7b 0a  >nKeyCol, x) ){.
18d40 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
18d50 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20 20 20  nColumn--; .    
18d60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18d70 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
18d80 6e 5b 69 5d 20 3d 20 78 3b 0a 20 20 20 20 20 20  n[i] = x;.      
18d90 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c    pIndex->azColl
18da0 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c  [i] = pPk->azCol
18db0 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 49  l[j];.        pI
18dc0 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
18dd0 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 53 6f 72 74  [i] = pPk->aSort
18de0 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20  Order[j];.      
18df0 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    i++;.      }. 
18e00 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
18e10 20 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c   i==pIndex->nCol
18e20 75 6d 6e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  umn );.  }else{.
18e30 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
18e40 6c 75 6d 6e 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  lumn[i] = -1;.  
18e50 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c    pIndex->azColl
18e60 5b 69 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a  [i] = "BINARY";.
18e70 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66    }.  sqlite3Def
18e80 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65  aultRowEst(pInde
18e90 78 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  x);.  if( pParse
18ea0 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29  ->pNewTable==0 )
18eb0 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69   estimateIndexWi
18ec0 64 74 68 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20  dth(pIndex);..  
18ed0 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65  if( pTab==pParse
18ee0 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20  ->pNewTable ){. 
18ef0 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69     /* This routi
18f00 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  ne has been call
18f10 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
18f20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
18f30 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75  as a.    ** resu
18f40 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20  lt of a PRIMARY 
18f50 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c  KEY or UNIQUE cl
18f60 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  ause on a column
18f70 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a   definition, or.
18f80 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59      ** a PRIMARY
18f90 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
18fa0 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  lause following 
18fb0 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  the column defin
18fc0 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69  itions..    ** i
18fd0 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20  .e. one of:.    
18fe0 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45  **.    ** CREATE
18ff0 20 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41   TABLE t(x PRIMA
19000 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20  RY KEY, y);.    
19010 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
19020 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78  t(x, y, UNIQUE(x
19030 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  , y));.    **.  
19040 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c    ** Either way,
19050 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
19060 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   the table alrea
19070 64 79 20 68 61 73 20 73 75 63 68 20 61 6e 20 69  dy has such an i
19080 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20  ndex. If.    ** 
19090 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72  so, don't bother
190a0 20 63 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f   creating this o
190b0 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70  ne. This only ap
190c0 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20  plies to.    ** 
190d0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72  automatically cr
190e0 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55  eated indices. U
190f0 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74  sers can do as t
19100 68 65 79 20 77 69 73 68 20 77 69 74 68 0a 20 20  hey wish with.  
19110 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e    ** explicit in
19120 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20  dices..    **.  
19130 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45 20    ** Two UNIQUE 
19140 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
19150 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63  onstraints are c
19160 6f 6e 73 69 64 65 72 65 64 20 65 71 75 69 76 61  onsidered equiva
19170 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64  lent.    ** (and
19180 20 74 68 75 73 20 73 75 70 70 72 65 73 73 69 6e   thus suppressin
19190 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65  g the second one
191a0 29 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 68  ) even if they h
191b0 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20  ave different.  
191c0 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 73    ** sort orders
191d0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
191e0 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66  If there are dif
191f0 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67  ferent collating
19200 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20 69 66   sequences or if
19210 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a   the columns of.
19220 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74      ** the const
19230 72 61 69 6e 74 20 6f 63 63 75 72 20 69 6e 20 64  raint occur in d
19240 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 73 2c  ifferent orders,
19250 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72   then the constr
19260 61 69 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a  aints are.    **
19270 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69 73 74   considered dist
19280 69 6e 63 74 20 61 6e 64 20 62 6f 74 68 20 72 65  inct and both re
19290 73 75 6c 74 20 69 6e 20 73 65 70 61 72 61 74 65  sult in separate
192a0 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f   indices..    */
192b0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
192c0 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
192d0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
192e0 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
192f0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
19300 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  k;.      assert(
19310 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
19320 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20  OE_None );.     
19330 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
19340 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20 20 20  utoIndex );.    
19350 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
19360 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
19370 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  ne );..      if(
19380 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d   pIdx->nKeyCol!=
19390 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20  pIndex->nKeyCol 
193a0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
193b0 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64    for(k=0; k<pId
193c0 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29  x->nKeyCol; k++)
193d0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
193e0 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20  char *z1;.      
193f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32    const char *z2
19400 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
19410 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21  dx->aiColumn[k]!
19420 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  =pIndex->aiColum
19430 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  n[k] ) break;.  
19440 20 20 20 20 20 20 7a 31 20 3d 20 70 49 64 78 2d        z1 = pIdx-
19450 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20  >azColl[k];.    
19460 20 20 20 20 7a 32 20 3d 20 70 49 6e 64 65 78 2d      z2 = pIndex-
19470 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20  >azColl[k];.    
19480 20 20 20 20 69 66 28 20 7a 31 21 3d 7a 32 20 26      if( z1!=z2 &
19490 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
194a0 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65 61 6b  (z1, z2) ) break
194b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
194c0 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 4b 65  if( k==pIdx->nKe
194d0 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  yCol ){.        
194e0 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
194f0 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  r!=pIndex->onErr
19500 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
19510 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69  /* This constrai
19520 6e 74 20 63 72 65 61 74 65 73 20 74 68 65 20 73  nt creates the s
19530 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61 20 70  ame index as a p
19540 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20  revious.        
19550 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20    ** constraint 
19560 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68  specified somewh
19570 65 72 65 20 69 6e 20 74 68 65 20 43 52 45 41 54  ere in the CREAT
19580 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
19590 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  t..          ** 
195a0 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43  However the ON C
195b0 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
195c0 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49  are different. I
195d0 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20  f both this .   
195e0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72         ** constr
195f0 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65  aint and the pre
19600 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74  vious equivalent
19610 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65   constraint have
19620 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20   explicit.      
19630 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49      ** ON CONFLI
19640 43 54 20 63 6c 61 75 73 65 73 20 74 68 69 73 20  CT clauses this 
19650 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68  is an error. Oth
19660 65 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a  erwise, use the.
19670 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70            ** exp
19680 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65  licitly specifie
19690 64 20 62 65 68 61 76 69 6f 72 20 66 6f 72 20 74  d behavior for t
196a0 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  he index..      
196b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
196c0 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45   if( !(pIdx->onE
196d0 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
196e0 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72   || pIndex->onEr
196f0 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29  ror==OE_Default)
19700 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
19710 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
19720 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
19730 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69           "confli
19740 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43  cting ON CONFLIC
19750 54 20 63 6c 61 75 73 65 73 20 73 70 65 63 69 66  T clauses specif
19760 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ied", 0);.      
19770 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
19780 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
19790 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b  r==OE_Default ){
197a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64  .            pId
197b0 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e  x->onError = pIn
197c0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20  dex->onError;.  
197d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
197e0 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f    }.        goto
197f0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19800 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
19810 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b  }.  }..  /* Link
19820 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73   the new Index s
19830 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20  tructure to its 
19840 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65  table and to the
19850 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d   other.  ** in-m
19860 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73  emory database s
19870 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f  tructures. .  */
19880 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
19890 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65  busy ){.    Inde
198a0 78 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74  x *p;.    assert
198b0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
198c0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20  utexHeld(db, 0, 
198d0 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
198e0 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69   );.    p = sqli
198f0 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
19900 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e  Index->pSchema->
19910 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20  idxHash, .      
19920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19930 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
19940 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
19950 33 30 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  30(pIndex->zName
19960 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
19970 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
19980 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20  dex);.    if( p 
19990 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
199a0 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f   p==pIndex );  /
199b0 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
199c0 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  ve failed */.   
199d0 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
199e0 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 67  led = 1;.      g
199f0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19a00 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
19a10 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
19a20 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
19a30 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c  es;.    if( pTbl
19a40 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
19a50 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
19a60 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
19a70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
19a80 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
19a90 20 69 6e 69 74 69 61 6c 20 43 52 45 41 54 45 20   initial CREATE 
19aa0 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
19ab0 28 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c 45  (or CREATE TABLE
19ac0 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64   if the.  ** ind
19ad0 65 78 20 69 73 20 61 6e 20 69 6d 70 6c 69 65 64  ex is an implied
19ae0 20 69 6e 64 65 78 20 66 6f 72 20 61 20 55 4e 49   index for a UNI
19af0 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b  QUE or PRIMARY K
19b00 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 74  EY constraint) t
19b10 68 65 6e 0a 20 20 2a 2a 20 65 6d 69 74 20 63 6f  hen.  ** emit co
19b20 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74  de to allocate t
19b30 68 65 20 69 6e 64 65 78 20 72 6f 6f 74 70 61 67  he index rootpag
19b40 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64 20 6d 61  e on disk and ma
19b50 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 0a  ke an entry for.
19b60 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69    ** the index i
19b70 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
19b80 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 70 6f  ter table and po
19b90 70 75 6c 61 74 65 20 74 68 65 20 69 6e 64 65 78  pulate the index
19ba0 20 77 69 74 68 0a 20 20 2a 2a 20 63 6f 6e 74 65   with.  ** conte
19bb0 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20 6e 6f 74  nt.  But, do not
19bc0 20 64 6f 20 74 68 69 73 20 69 66 20 77 65 20 61   do this if we a
19bd0 72 65 20 73 69 6d 70 6c 79 20 72 65 61 64 69 6e  re simply readin
19be0 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
19bf0 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20 74  ter.  ** table t
19c00 6f 20 70 61 72 73 65 20 74 68 65 20 73 63 68 65  o parse the sche
19c10 6d 61 2c 20 6f 72 20 69 66 20 74 68 69 73 20 69  ma, or if this i
19c20 6e 64 65 78 20 69 73 20 74 68 65 20 50 52 49 4d  ndex is the PRIM
19c30 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20  ARY KEY index.  
19c40 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20  ** of a WITHOUT 
19c50 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a 20 20 2a  ROWID table..  *
19c60 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61  *.  ** If pTblNa
19c70 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
19c80 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e  his index is gen
19c90 65 72 61 74 65 64 20 61 73 20 61 6e 20 69 6d 70  erated as an imp
19ca0 6c 69 65 64 20 50 52 49 4d 41 52 59 20 4b 45 59  lied PRIMARY KEY
19cb0 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20  .  ** or UNIQUE 
19cc0 69 6e 64 65 78 20 69 6e 20 61 20 43 52 45 41 54  index in a CREAT
19cd0 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
19ce0 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74 61  t.  Since the ta
19cf0 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73  ble.  ** has jus
19d00 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  t been created, 
19d10 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64  it contains no d
19d20 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ata and the inde
19d30 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  x initialization
19d40 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62  .  ** step can b
19d50 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  e skipped..  */.
19d60 20 20 65 6c 73 65 20 69 66 28 20 70 50 61 72 73    else if( pPars
19d70 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 28 48  e->nErr==0 && (H
19d80 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c  asRowid(pTab) ||
19d90 20 70 54 62 6c 4e 61 6d 65 21 3d 30 29 20 29 7b   pTblName!=0) ){
19da0 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
19db0 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
19dc0 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b     int iMem = ++
19dd0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20  pParse->nMem;.. 
19de0 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
19df0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
19e00 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f     if( v==0 ) go
19e10 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
19e20 6e 64 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43  ndex;...    /* C
19e30 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61  reate the rootpa
19e40 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ge for the index
19e50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
19e60 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
19e70 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
19e80 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
19e90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19ea0 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c   OP_CreateIndex,
19eb0 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20   iDb, iMem);..  
19ec0 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20    /* Gather the 
19ed0 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
19ee0 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
19ef0 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f  X statement into
19f00 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d  .    ** the zStm
19f10 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  t variable.    *
19f20 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  /.    if( pStart
19f30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   ){.      int n 
19f40 3d 20 28 69 6e 74 29 28 70 50 61 72 73 65 2d 3e  = (int)(pParse->
19f50 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70  sLastToken.z - p
19f60 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73  Name->z) + pPars
19f70 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b  e->sLastToken.n;
19f80 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65  .      if( pName
19f90 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20  ->z[n-1]==';' ) 
19fa0 6e 2d 2d 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20  n--;.      /* A 
19fb0 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68  named index with
19fc0 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45   an explicit CRE
19fd0 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
19fe0 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74  ent */.      zSt
19ff0 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
1a000 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54 45 25  ntf(db, "CREATE%
1a010 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20  s INDEX %.*s",. 
1a020 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d         onError==
1a030 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22  OE_None ? "" : "
1a040 20 55 4e 49 51 55 45 22 2c 20 6e 2c 20 70 4e 61   UNIQUE", n, pNa
1a050 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73  me->z);.    }els
1a060 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61  e{.      /* An a
1a070 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63  utomatic index c
1a080 72 65 61 74 65 64 20 62 79 20 61 20 50 52 49 4d  reated by a PRIM
1a090 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
1a0a0 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  E constraint */.
1a0b0 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d        /* zStmt =
1a0c0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1a0d0 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53  ""); */.      zS
1a0e0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  tmt = 0;.    }..
1a0f0 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e      /* Add an en
1a100 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61  try in sqlite_ma
1a110 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e  ster for this in
1a120 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  dex.    */.    s
1a130 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
1a140 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
1a150 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
1a160 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e  %Q.%s VALUES('in
1a170 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25  dex',%Q,%Q,#%d,%
1a180 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62  Q);",.        db
1a190 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
1a1a0 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
1a1b0 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e  Db),.        pIn
1a1c0 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  dex->zName,.    
1a1d0 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
1a1e0 0a 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20  .        iMem,. 
1a1f0 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20         zStmt.   
1a200 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
1a210 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29  bFree(db, zStmt)
1a220 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74  ;..    /* Fill t
1a230 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64 61  he index with da
1a240 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20 74  ta and reparse t
1a250 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20  he schema. Code 
1a260 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20  an OP_Expire.   
1a270 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74   ** to invalidat
1a280 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c  e all pre-compil
1a290 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
1a2a0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
1a2b0 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  blName ){.      
1a2c0 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
1a2d0 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
1a2e0 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  x, iMem);.      
1a2f0 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
1a300 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
1a310 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1a320 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d  dbeAddParseSchem
1a330 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20  aOp(v, iDb,.    
1a340 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
1a350 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25  ntf(db, "name='%
1a360 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64  q' AND type='ind
1a370 65 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  ex'", pIndex->zN
1a380 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ame));.      sql
1a390 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
1a3a0 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 29 3b  , OP_Expire, 0);
1a3b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1a3c0 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20   When adding an 
1a3d0 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73  index to the lis
1a3e0 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72  t of indices for
1a3f0 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20   a table, make. 
1a400 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64   ** sure all ind
1a410 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f  ices labeled OE_
1a420 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74  Replace come aft
1a430 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62  er all those lab
1a440 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e  eled.  ** OE_Ign
1a450 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ore.  This is ne
1a460 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20  cessary for the 
1a470 63 6f 72 72 65 63 74 20 63 6f 6e 73 74 72 61 69  correct constrai
1a480 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a 20 70 72  nt check.  ** pr
1a490 6f 63 65 73 73 69 6e 67 20 28 69 6e 20 73 71 6c  ocessing (in sql
1a4a0 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73  ite3GenerateCons
1a4b0 74 72 61 69 6e 74 43 68 65 63 6b 73 28 29 29 20  traintChecks()) 
1a4c0 61 73 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20  as part of.  ** 
1a4d0 55 50 44 41 54 45 20 61 6e 64 20 49 4e 53 45 52  UPDATE and INSER
1a4e0 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 0a  T statements.  .
1a4f0 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
1a500 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c  nit.busy || pTbl
1a510 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Name==0 ){.    i
1a520 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  f( onError!=OE_R
1a530 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e  eplace || pTab->
1a540 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20  pIndex==0.      
1a550 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64     || pTab->pInd
1a560 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
1a570 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20  Replace){.      
1a580 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
1a590 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
1a5a0 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78      pTab->pIndex
1a5b0 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d   = pIndex;.    }
1a5c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
1a5d0 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62  x *pOther = pTab
1a5e0 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
1a5f0 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70  while( pOther->p
1a600 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e  Next && pOther->
1a610 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d  pNext->onError!=
1a620 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20  OE_Replace ){.  
1a630 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70        pOther = p
1a640 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
1a650 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64      }.      pInd
1a660 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68  ex->pNext = pOth
1a670 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
1a680 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d   pOther->pNext =
1a690 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20   pIndex;.    }. 
1a6a0 20 20 20 70 52 65 74 20 3d 20 70 49 6e 64 65 78     pRet = pIndex
1a6b0 3b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30  ;.    pIndex = 0
1a6c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61  ;.  }..  /* Clea
1a6d0 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74  n up before exit
1a6e0 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61  ing */.exit_crea
1a6f0 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20  te_index:.  if( 
1a700 70 49 6e 64 65 78 20 29 20 66 72 65 65 49 6e 64  pIndex ) freeInd
1a710 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
1a720 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1a730 65 74 65 28 64 62 2c 20 70 50 49 57 68 65 72 65  ete(db, pPIWhere
1a740 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1a750 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1a760 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
1a770 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
1a780 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73  , pTblName);.  s
1a790 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1a7a0 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
1a7b0 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
1a7c0 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e   Fill the Index.
1a7d0 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79  aiRowEst[] array
1a7e0 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e   with default in
1a7f0 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f  formation - info
1a800 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65  rmation.** to be
1a810 20 75 73 65 64 20 77 68 65 6e 20 77 65 20 68 61   used when we ha
1a820 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41  ve not run the A
1a830 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a  NALYZE command..
1a840 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30  **.** aiRowEst[0
1a850 5d 20 69 73 20 73 75 70 70 6f 73 65 20 74 6f 20  ] is suppose to 
1a860 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62  contain the numb
1a870 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
1a880 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20  n the index..** 
1a890 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20  Since we do not 
1a8a0 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69  know, guess 1 mi
1a8b0 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74  llion.  aiRowEst
1a8c0 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61  [1] is an estima
1a8d0 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d  te of the.** num
1a8e0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1a8f0 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61  he table that ma
1a900 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c  tch any particul
1a910 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a  ar value of the.
1a920 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20  ** first column 
1a930 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61  of the index.  a
1a940 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e  iRowEst[2] is an
1a950 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
1a960 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f   number.** of ro
1a970 77 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e  ws that match an
1a980 79 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d  y particular com
1a990 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  bination of the 
1a9a0 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a  first 2 columns.
1a9b0 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  ** of the index.
1a9c0 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20    And so forth. 
1a9d0 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20   It must always 
1a9e0 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
1a9f0 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .*.**           
1aa00 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52  aiRowEst[N]<=aiR
1aa10 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20  owEst[N-1].**   
1aa20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74          aiRowEst
1aa30 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61  [N]>=1.**.** Apa
1aa40 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65  rt from that, we
1aa50 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20   have little to 
1aa60 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e  go on besides in
1aa70 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a  tuition as to.**
1aa80 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20   how aiRowEst[] 
1aa90 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61  should be initia
1aaa0 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62  lized.  The numb
1aab0 65 72 73 20 67 65 6e 65 72 61 74 65 64 20 68 65  ers generated he
1aac0 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20  re.** are based 
1aad0 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65  on typical value
1aae0 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61  s found in actua
1aaf0 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f  l indices..*/.vo
1ab00 69 64 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c  id sqlite3Defaul
1ab10 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70  tRowEst(Index *p
1ab20 49 64 78 29 7b 0a 20 20 2f 2a 20 20 20 20 20 20  Idx){.  /*      
1ab30 20 20 20 20 20 20 20 20 20 20 31 30 2c 20 20 39            10,  9
1ab40 2c 20 20 38 2c 20 20 37 2c 20 20 36 20 2a 2f 0a  ,  8,  7,  6 */.
1ab50 20 20 4c 6f 67 45 73 74 20 61 56 61 6c 5b 5d 20    LogEst aVal[] 
1ab60 3d 20 7b 20 33 33 2c 20 33 32 2c 20 33 30 2c 20  = { 33, 32, 30, 
1ab70 32 38 2c 20 32 36 20 7d 3b 0a 20 20 4c 6f 67 45  28, 26 };.  LogE
1ab80 73 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69  st *a = pIdx->ai
1ab90 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 6e 74  RowLogEst;.  int
1aba0 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28 41 72 72   nCopy = MIN(Arr
1abb0 61 79 53 69 7a 65 28 61 56 61 6c 29 2c 20 70 49  aySize(aVal), pI
1abc0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20  dx->nKeyCol);.  
1abd0 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 65 74  int i;..  /* Set
1abe0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1abf0 20 28 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73   (number of rows
1ac00 20 69 6e 20 74 68 65 20 69 6e 64 65 78 29 20 74   in the index) t
1ac10 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  o the estimated 
1ac20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
1ac30 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
1ac40 65 2e 20 4f 72 20 31 30 2c 20 69 66 20 74 68 65  e. Or 10, if the
1ac50 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   estimated numbe
1ac60 72 20 6f 66 20 72 6f 77 73 20 0a 20 20 2a 2a 20  r of rows .  ** 
1ac70 69 6e 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  in the table is 
1ac80 6c 65 73 73 20 74 68 61 6e 20 74 68 61 74 2e 20  less than that. 
1ac90 20 2a 2f 0a 20 20 61 5b 30 5d 20 3d 20 70 49 64   */.  a[0] = pId
1aca0 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c  x->pTable->nRowL
1acb0 6f 67 45 73 74 3b 0a 20 20 69 66 28 20 61 5b 30  ogEst;.  if( a[0
1acc0 5d 3c 33 33 20 29 20 61 5b 30 5d 20 3d 20 33 33  ]<33 ) a[0] = 33
1acd0 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  ;        assert(
1ace0 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   33==sqlite3LogE
1acf0 73 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  st(10) );..  /* 
1ad00 45 73 74 69 6d 61 74 65 20 74 68 61 74 20 61 5b  Estimate that a[
1ad10 31 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d 20 69  1] is 10, a[2] i
1ad20 73 20 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20  s 9, a[3] is 8, 
1ad30 61 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20  a[4] is 7, a[5] 
1ad40 69 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65 61  is.  ** 6 and ea
1ad50 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 76 61  ch subsequent va
1ad60 6c 75 65 20 28 69 66 20 61 6e 79 29 20 69 73 20  lue (if any) is 
1ad70 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  5.  */.  memcpy(
1ad80 26 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f  &a[1], aVal, nCo
1ad90 70 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74  py*sizeof(LogEst
1ada0 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70  ));.  for(i=nCop
1adb0 79 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b  y+1; i<=pIdx->nK
1adc0 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  eyCol; i++){.   
1add0 20 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20 20   a[i] = 23;     
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1adf0 73 73 65 72 74 28 20 32 33 3d 3d 73 71 6c 69 74  ssert( 23==sqlit
1ae00 65 33 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a 20  e3LogEst(5) );. 
1ae10 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 30 3d   }..  assert( 0=
1ae20 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
1ae30 29 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 2d  ) );.  if( pIdx-
1ae40 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
1ae50 65 20 29 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79  e ) a[pIdx->nKey
1ae60 43 6f 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Col] = 0;.}../*.
1ae70 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1ae80 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69  will drop an exi
1ae90 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65  sting named inde
1aea0 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  x.  This routine
1aeb0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  .** implements t
1aec0 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74  he DROP INDEX st
1aed0 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
1aee0 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65   sqlite3DropInde
1aef0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
1af00 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
1af10 20 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a   int ifExists){.
1af20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
1af30 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
1af40 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1af50 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
1af60 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  b;..  assert( pP
1af70 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
1af80 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c     /* Never call
1af90 65 64 20 77 69 74 68 20 70 72 69 6f 72 20 65 72  ed with prior er
1afa0 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64 62  rors */.  if( db
1afb0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1afc0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
1afd0 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
1afe0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
1aff0 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66  >nSrc==1 );.  if
1b000 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
1b010 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
1b020 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f  Parse) ){.    go
1b030 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1b040 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  ex;.  }.  pIndex
1b050 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
1b060 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61  dex(db, pName->a
1b070 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65  [0].zName, pName
1b080 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
1b090 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d  );.  if( pIndex=
1b0a0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69  =0 ){.    if( !i
1b0b0 66 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20  fExists ){.     
1b0c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1b0d0 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
1b0e0 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e  h index: %S", pN
1b0f0 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  ame, 0);.    }el
1b100 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
1b110 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64  3CodeVerifyNamed
1b120 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70  Schema(pParse, p
1b130 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
1b140 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  base);.    }.   
1b150 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
1b160 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f  hema = 1;.    go
1b170 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1b180 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  ex;.  }.  if( pI
1b190 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20  ndex->autoIndex 
1b1a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1b1b0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1b1c0 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
1b1d0 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20   with UNIQUE ". 
1b1e0 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59       "or PRIMARY
1b1f0 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
1b200 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  cannot be droppe
1b210 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f  d", 0);.    goto
1b220 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1b230 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
1b240 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
1b250 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70  ex(db, pIndex->p
1b260 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66  Schema);.#ifndef
1b270 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1b280 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
1b290 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51     int code = SQ
1b2a0 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b  LITE_DROP_INDEX;
1b2b0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
1b2c0 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
1b2d0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
1b2e0 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
1b2f0 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
1b300 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
1b310 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
1b320 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73  (iDb);.    if( s
1b330 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1b340 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
1b350 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
1b360 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
1b370 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1b380 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
1b390 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
1b3a0 26 20 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53  & iDb ) code = S
1b3b0 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
1b3c0 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
1b3d0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1b3e0 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49  pParse, code, pI
1b3f0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61  ndex->zName, pTa
1b400 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
1b410 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
1b420 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1b430 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1b440 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1b450 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
1b460 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20   index and from 
1b470 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
1b480 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
1b490 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1b4a0 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
1b4b0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1b4c0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
1b4d0 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20  se, 1, iDb);.   
1b4e0 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
1b4f0 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
1b500 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
1b510 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65  %Q.%s WHERE name
1b520 3d 25 51 20 41 4e 44 20 74 79 70 65 3d 27 69 6e  =%Q AND type='in
1b530 64 65 78 27 22 2c 0a 20 20 20 20 20 20 20 64 62  dex'",.       db
1b540 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
1b550 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
1b560 44 62 29 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  Db), pIndex->zNa
1b570 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  me.    );.    sq
1b580 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61  lite3ClearStatTa
1b590 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44 62  bles(pParse, iDb
1b5a0 2c 20 22 69 64 78 22 2c 20 70 49 6e 64 65 78 2d  , "idx", pIndex-
1b5b0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
1b5c0 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
1b5d0 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
1b5e0 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61     destroyRootPa
1b5f0 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ge(pParse, pInde
1b600 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
1b610 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b620 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49  dOp4(v, OP_DropI
1b630 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c  ndex, iDb, 0, 0,
1b640 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
1b650 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72  0);.  }..exit_dr
1b660 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69  op_index:.  sqli
1b670 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1b680 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  (db, pName);.}..
1b690 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69 73 20  /*.** pArray is 
1b6a0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
1b6b0 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73  array of objects
1b6c0 2e 20 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e  . Each object in
1b6d0 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73   the.** array is
1b6e0 20 73 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69   szEntry bytes i
1b6f0 6e 20 73 69 7a 65 2e 20 54 68 69 73 20 72 6f 75  n size. This rou
1b700 74 69 6e 65 20 75 73 65 73 20 73 71 6c 69 74 65  tine uses sqlite
1b710 33 44 62 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20  3DbRealloc().** 
1b720 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 61 72  to extend the ar
1b730 72 61 79 20 73 6f 20 74 68 61 74 20 74 68 65 72  ray so that ther
1b740 65 20 69 73 20 73 70 61 63 65 20 66 6f 72 20 61  e is space for a
1b750 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 74 20 74   new object at t
1b760 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68  he end..**.** Wh
1b770 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1b780 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 45   is called, *pnE
1b790 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73 20 74 68  ntry contains th
1b7a0 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
1b7b0 66 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20 28  f.** the array (
1b7c0 69 6e 20 65 6e 74 72 69 65 73 20 2d 20 73 6f 20  in entries - so 
1b7d0 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  the allocation i
1b7e0 73 20 28 28 2a 70 6e 45 6e 74 72 79 29 20 2a 20  s ((*pnEntry) * 
1b7f0 73 7a 45 6e 74 72 79 29 20 62 79 74 65 73 0a 2a  szEntry) bytes.*
1b800 2a 20 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a  * in total)..**.
1b810 2a 2a 20 49 66 20 74 68 65 20 72 65 61 6c 6c 6f  ** If the reallo
1b820 63 28 29 20 69 73 20 73 75 63 63 65 73 73 66 75  c() is successfu
1b830 6c 20 28 69 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f  l (i.e. if no OO
1b840 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75  M condition occu
1b850 72 73 29 2c 20 74 68 65 0a 2a 2a 20 73 70 61 63  rs), the.** spac
1b860 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
1b870 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69  the new object i
1b880 73 20 7a 65 72 6f 65 64 2c 20 2a 70 6e 45 6e 74  s zeroed, *pnEnt
1b890 72 79 20 75 70 64 61 74 65 64 20 74 6f 0a 2a 2a  ry updated to.**
1b8a0 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77   reflect the new
1b8b0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
1b8c0 61 79 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72  ay and a pointer
1b8d0 20 74 6f 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f   to the new allo
1b8e0 63 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e  cation.** return
1b8f0 65 64 2e 20 2a 70 49 64 78 20 69 73 20 73 65 74  ed. *pIdx is set
1b900 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
1b910 20 74 68 65 20 6e 65 77 20 61 72 72 61 79 20 65   the new array e
1b920 6e 74 72 79 20 69 6e 20 74 68 69 73 20 63 61 73  ntry in this cas
1b930 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  e..**.** Otherwi
1b940 73 65 2c 20 69 66 20 74 68 65 20 72 65 61 6c 6c  se, if the reall
1b950 6f 63 28 29 20 66 61 69 6c 73 2c 20 2a 70 49 64  oc() fails, *pId
1b960 78 20 69 73 20 73 65 74 20 74 6f 20 2d 31 2c 20  x is set to -1, 
1b970 2a 70 6e 45 6e 74 72 79 20 72 65 6d 61 69 6e 73  *pnEntry remains
1b980 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  .** unchanged an
1b990 64 20 61 20 63 6f 70 79 20 6f 66 20 70 41 72 72  d a copy of pArr
1b9a0 61 79 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  ay returned..*/.
1b9b0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 41 72 72  void *sqlite3Arr
1b9c0 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71  ayAllocate(.  sq
1b9d0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1b9e0 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  /* Connection to
1b9f0 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f   notify of mallo
1ba00 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20  c failures */.  
1ba10 76 6f 69 64 20 2a 70 41 72 72 61 79 2c 20 20 20  void *pArray,   
1ba20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 62    /* Array of ob
1ba30 6a 65 63 74 73 2e 20 20 4d 69 67 68 74 20 62 65  jects.  Might be
1ba40 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a   reallocated */.
1ba50 20 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20    int szEntry,  
1ba60 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65      /* Size of e
1ba70 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  ach object in th
1ba80 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  e array */.  int
1ba90 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f   *pnEntry,     /
1baa0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65  * Number of obje
1bab0 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  cts currently in
1bac0 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   use */.  int *p
1bad0 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 57  Idx         /* W
1bae0 72 69 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f  rite the index o
1baf0 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65 72  f a new slot her
1bb00 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  e */.){.  char *
1bb10 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 2a 70 6e  z;.  int n = *pn
1bb20 45 6e 74 72 79 3b 0a 20 20 69 66 28 20 28 6e 20  Entry;.  if( (n 
1bb30 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a 20  & (n-1))==0 ){. 
1bb40 20 20 20 69 6e 74 20 73 7a 20 3d 20 28 6e 3d 3d     int sz = (n==
1bb50 30 29 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20 20  0) ? 1 : 2*n;.  
1bb60 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 73    void *pNew = s
1bb70 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
1bb80 64 62 2c 20 70 41 72 72 61 79 2c 20 73 7a 2a 28  db, pArray, sz*(
1bb90 69 36 34 29 73 7a 45 6e 74 72 79 29 3b 0a 20 20  i64)szEntry);.  
1bba0 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
1bbb0 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d  .      *pIdx = -
1bbc0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1bbd0 70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20  pArray;.    }.  
1bbe0 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b    pArray = pNew;
1bbf0 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72  .  }.  z = (char
1bc00 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73  *)pArray;.  mems
1bc10 65 74 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72  et(&z[n * szEntr
1bc20 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b  y], 0, szEntry);
1bc30 0a 20 20 2a 70 49 64 78 20 3d 20 6e 3b 0a 20 20  .  *pIdx = n;.  
1bc40 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65  ++*pnEntry;.  re
1bc50 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a  turn pArray;.}..
1bc60 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
1bc70 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
1bc80 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20  e given IdList. 
1bc90 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64   Create a new Id
1bca0 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
1bcb0 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  be..**.** A new 
1bcc0 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  IdList is return
1bcd0 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
1bce0 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
1bcf0 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  /.IdList *sqlite
1bd00 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 73 71  3IdListAppend(sq
1bd10 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
1bd20 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
1bd30 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20  *pToken){.  int 
1bd40 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1bd50 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
1bd60 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1bd70 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
1bd80 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  IdList) );.    i
1bd90 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1bda0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
1bdb0 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  ist->a = sqlite3
1bdc0 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
1bdd0 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 70       db,.      p
1bde0 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73  List->a,.      s
1bdf0 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
1be00 5d 29 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74  ]),.      &pList
1be10 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 69 0a  ->nId,.      &i.
1be20 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29    );.  if( i<0 )
1be30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  {.    sqlite3IdL
1be40 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
1be50 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ist);.    return
1be60 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d   0;.  }.  pList-
1be70 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  >a[i].zName = sq
1be80 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1be90 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a  en(db, pToken);.
1bea0 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
1beb0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
1bec0 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f  an IdList..*/.vo
1bed0 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  id sqlite3IdList
1bee0 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
1bef0 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73  db, IdList *pLis
1bf00 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
1bf10 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1bf20 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
1bf30 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
1bf40 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
1bf50 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
1bf60 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
1bf70 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
1bf80 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29  ee(db, pList->a)
1bf90 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1bfa0 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  e(db, pList);.}.
1bfb0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1bfc0 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  e index in pList
1bfd0 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69   of the identifi
1bfe0 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52  er named zId.  R
1bff0 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e  eturn -1.** if n
1c000 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  ot found..*/.int
1c010 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
1c020 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  dex(IdList *pLis
1c030 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
1c040 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
1c050 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1c060 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f   return -1;.  fo
1c070 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1c080 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nId; i++){.    i
1c090 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1c0a0 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
1c0b0 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
1c0c0 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
1c0d0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
1c0e0 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65 20  *.** Expand the 
1c0f0 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
1c100 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 72  for the given Sr
1c110 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79 0a  cList object by.
1c120 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78 74  ** creating nExt
1c130 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65 67  ra new slots beg
1c140 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72 74  inning at iStart
1c150 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a 65 72  .  iStart is zer
1c160 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20  o based..** New 
1c170 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65 64  slots are zeroed
1c180 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1c190 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20 53  ple, suppose a S
1c1a0 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79  rcList initially
1c1b0 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e   contains two en
1c1c0 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54  tries: A,B..** T
1c1d0 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20 65  o append 3 new e
1c1e0 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65 20  ntries onto the 
1c1f0 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a  end, do this:.**
1c200 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53 72  .**    sqlite3Sr
1c210 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c  cListEnlarge(db,
1c220 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32 29   pSrclist, 3, 2)
1c230 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ;.**.** After th
1c240 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74 20  e call above it 
1c250 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20  would contain:  
1c260 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20  A, B, nil, nil, 
1c270 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69  nil..** If the i
1c280 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20 68  Start argument h
1c290 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65 61  ad been 1 instea
1c2a0 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68 65  d of 2, then the
1c2b0 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64   result.** would
1c2c0 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c 20   have been:  A, 
1c2d0 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42  nil, nil, nil, B
1c2e0 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74 68  .  To prepend th
1c2f0 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20  e new slots,.** 
1c300 74 68 65 20 69 53 74 61 72 74 20 76 61 6c 75 65  the iStart value
1c310 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68   would be 0.  Th
1c320 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77 6f  e result then wo
1c330 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20  uld.** be: nil, 
1c340 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a  nil, nil, A, B..
1c350 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
1c360 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
1c370 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 69  ls the SrcList i
1c380 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 54 68  s unchanged.  Th
1c390 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  e.** db->mallocF
1c3a0 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c 20  ailed flag will 
1c3b0 62 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a  be set to true..
1c3c0 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
1c3d0 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
1c3e0 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
1c3f0 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ,       /* Datab
1c400 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  ase connection t
1c410 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20  o notify of OOM 
1c420 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c  errors */.  SrcL
1c430 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  ist *pSrc,     /
1c440 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f  * The SrcList to
1c450 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a   be enlarged */.
1c460 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
1c470 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1c480 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61  f new slots to a
1c490 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20  dd to pSrc->a[] 
1c4a0 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20  */.  int iStart 
1c4b0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1c4c0 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66   in pSrc->a[] of
1c4d0 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20   first new slot 
1c4e0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  */.){.  int i;..
1c4f0 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
1c500 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20  king on calling 
1c510 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
1c520 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d  assert( iStart>=
1c530 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
1c540 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73  Extra>=1 );.  as
1c550 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b  sert( pSrc!=0 );
1c560 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72  .  assert( iStar
1c570 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  t<=pSrc->nSrc );
1c580 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1c590 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65  additional space
1c5a0 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
1c5b0 69 66 28 20 28 75 33 32 29 70 53 72 63 2d 3e 6e  if( (u32)pSrc->n
1c5c0 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d  Src+nExtra>pSrc-
1c5d0 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53  >nAlloc ){.    S
1c5e0 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
1c5f0 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70    int nAlloc = p
1c600 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61  Src->nSrc+nExtra
1c610 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a  ;.    int nGot;.
1c620 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1c630 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
1c640 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20  pSrc,.          
1c650 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72       sizeof(*pSr
1c660 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a  c) + (nAlloc-1)*
1c670 28 69 36 34 29 73 69 7a 65 6f 66 28 70 53 72 63  (i64)sizeof(pSrc
1c680 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  ->a[0]) );.    i
1c690 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1c6a0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
1c6b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1c6c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 53 72        return pSr
1c6d0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  c;.    }.    pSr
1c6e0 63 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 6e 47  c = pNew;.    nG
1c6f0 6f 74 20 3d 20 28 73 71 6c 69 74 65 33 44 62 4d  ot = (sqlite3DbM
1c700 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e  allocSize(db, pN
1c710 65 77 29 20 2d 20 73 69 7a 65 6f 66 28 2a 70 53  ew) - sizeof(*pS
1c720 72 63 29 29 2f 73 69 7a 65 6f 66 28 70 53 72 63  rc))/sizeof(pSrc
1c730 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20 20 20 20 70  ->a[0])+1;.    p
1c740 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 47  Src->nAlloc = nG
1c750 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f  ot;.  }..  /* Mo
1c760 76 65 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74  ve existing slot
1c770 73 20 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65  s that come afte
1c780 72 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65  r the newly inse
1c790 72 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20  rted slots.  ** 
1c7a0 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a  out of the way *
1c7b0 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e  /.  for(i=pSrc->
1c7c0 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72  nSrc-1; i>=iStar
1c7d0 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72  t; i--){.    pSr
1c7e0 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d  c->a[i+nExtra] =
1c7f0 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d   pSrc->a[i];.  }
1c800 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d  .  pSrc->nSrc +=
1c810 20 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a   nExtra;..  /* Z
1c820 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20 61 6c  ero the newly al
1c830 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f  located slots */
1c840 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72 63 2d  .  memset(&pSrc-
1c850 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 73  >a[iStart], 0, s
1c860 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d  izeof(pSrc->a[0]
1c870 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f 72  )*nExtra);.  for
1c880 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69 53 74  (i=iStart; i<iSt
1c890 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29  art+nExtra; i++)
1c8a0 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d  {.    pSrc->a[i]
1c8b0 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  .iCursor = -1;. 
1c8c0 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20   }..  /* Return 
1c8d0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1c8e0 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c 69 73   enlarged SrcLis
1c8f0 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 53  t */.  return pS
1c900 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70  rc;.}.../*.** Ap
1c910 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65  pend a new table
1c920 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76   name to the giv
1c930 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65  en SrcList.  Cre
1c940 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73  ate a new SrcLis
1c950 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
1c960 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73    A new entry is
1c970 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
1c980 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20  SrcList even if 
1c990 70 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a  pTable is NULL..
1c9a0 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74 20  **.** A SrcList 
1c9b0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
1c9c0 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73  NULL if there is
1c9d0 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20   an OOM error.  
1c9e0 54 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  The returned.** 
1c9f0 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 62 65  SrcList might be
1ca00 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
1ca10 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 77 61   SrcList that wa
1ca20 73 20 69 6e 70 75 74 20 6f 72 20 69 74 20 6d 69  s input or it mi
1ca30 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e 65 77 20  ght be.** a new 
1ca40 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f 4f 4d 20  one.  If an OOM 
1ca50 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
1ca60 73 2c 20 74 68 65 6e 20 74 68 65 20 70 72 69 6f  s, then the prio
1ca70 72 20 76 61 6c 75 65 20 6f 66 20 70 4c 69 73 74  r value of pList
1ca80 0a 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 70 75  .** that is inpu
1ca90 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  t to this routin
1caa0 65 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  e is automatical
1cab0 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ly freed..**.** 
1cac0 49 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20  If pDatabase is 
1cad0 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61  not null, it mea
1cae0 6e 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  ns that the tabl
1caf0 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61  e has an optiona
1cb00 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61  l.** database na
1cb10 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65  me prefix.  Like
1cb20 20 74 68 69 73 3a 20 20 22 64 61 74 61 62 61 73   this:  "databas
1cb30 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70  e.table".  The p
1cb40 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e  Database.** poin
1cb50 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ts to the table 
1cb60 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61  name and the pTa
1cb70 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ble points to th
1cb80 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  e database name.
1cb90 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e  .** The SrcList.
1cba0 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20  a[].zName field 
1cbb0 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  is filled with t
1cbc0 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68  he table name wh
1cbd0 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d  ich might.** com
1cbe0 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69  e from pTable (i
1cbf0 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e  f pDatabase is N
1cc00 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61  ULL) or from pDa
1cc10 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63  tabase.  .** Src
1cc20 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61  List.a[].zDataba
1cc30 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  se is filled wit
1cc40 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  h the database n
1cc50 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c  ame from pTable,
1cc60 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c  .** or with NULL
1cc70 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20   if no database 
1cc80 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  is specified..**
1cc90 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
1cca0 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65  ds, if call like
1ccb0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1ccc0 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
1ccd0 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c  istAppend(D,A,B,
1cce0 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42  0);.**.** Then B
1ccf0 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65   is a table name
1cd00 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
1cd10 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63  e name is unspec
1cd20 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65  ified.  If calle
1cd30 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a  d.** like this:.
1cd40 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
1cd50 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1cd60 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a  nd(D,A,B,C);.**.
1cd70 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68 65  ** Then C is the
1cd80 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
1cd90 42 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73  B is the databas
1cda0 65 20 6e 61 6d 65 2e 20 20 49 66 20 43 20 69 73  e name.  If C is
1cdb0 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74 68 65 6e   defined.** then
1cdc0 20 73 6f 20 69 73 20 42 2e 20 20 49 6e 20 6f 74   so is B.  In ot
1cdd0 68 65 72 20 77 6f 72 64 73 2c 20 77 65 20 6e 65  her words, we ne
1cde0 76 65 72 20 68 61 76 65 20 61 20 63 61 73 65 20  ver have a case 
1cdf0 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  where:.**.**    
1ce00 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
1ce10 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 30 2c  istAppend(D,A,0,
1ce20 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70  C);.**.** Both p
1ce30 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62  Table and pDatab
1ce40 61 73 65 20 61 72 65 20 61 73 73 75 6d 65 64 20  ase are assumed 
1ce50 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20 20 54  to be quoted.  T
1ce60 68 65 79 20 61 72 65 20 64 65 71 75 6f 74 65 64  hey are dequoted
1ce70 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65 69 6e 67  .** before being
1ce80 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 53 72   added to the Sr
1ce90 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73  cList..*/.SrcLis
1cea0 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
1ceb0 74 41 70 70 65 6e 64 28 0a 20 20 73 71 6c 69 74  tAppend(.  sqlit
1cec0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f  e3 *db,        /
1ced0 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  * Connection to 
1cee0 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63  notify of malloc
1cef0 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 53   failures */.  S
1cf00 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  rcList *pList,  
1cf10 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20     /* Append to 
1cf20 74 68 69 73 20 53 72 63 4c 69 73 74 2e 20 4e 55  this SrcList. NU
1cf30 4c 4c 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  LL creates a new
1cf40 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f   SrcList */.  To
1cf50 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20  ken *pTable,    
1cf60 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61 70    /* Table to ap
1cf70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  pend */.  Token 
1cf80 2a 70 44 61 74 61 62 61 73 65 20 20 20 20 2f 2a  *pDatabase    /*
1cf90 20 44 61 74 61 62 61 73 65 20 6f 66 20 74 68 65   Database of the
1cfa0 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73   table */.){.  s
1cfb0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1cfc0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73  em *pItem;.  ass
1cfd0 65 72 74 28 20 70 44 61 74 61 62 61 73 65 3d 3d  ert( pDatabase==
1cfe0 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20 29  0 || pTable!=0 )
1cff0 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 76  ;  /* Cannot hav
1d000 65 20 43 20 77 69 74 68 6f 75 74 20 42 20 2a 2f  e C without B */
1d010 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1d020 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
1d030 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1d040 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 72  ro(db, sizeof(Sr
1d050 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  cList) );.    if
1d060 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1d070 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
1d080 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20  ->nAlloc = 1;.  
1d090 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  }.  pList = sqli
1d0a0 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
1d0b0 65 28 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20  e(db, pList, 1, 
1d0c0 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20  pList->nSrc);.  
1d0d0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1d0e0 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
1d0f0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1d100 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
1d110 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1d120 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
1d130 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31  >a[pList->nSrc-1
1d140 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61  ];.  if( pDataba
1d150 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d  se && pDatabase-
1d160 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61  >z==0 ){.    pDa
1d170 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a  tabase = 0;.  }.
1d180 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
1d190 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  ){.    Token *pT
1d1a0 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b  emp = pDatabase;
1d1b0 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
1d1c0 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61   pTable;.    pTa
1d1d0 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d  ble = pTemp;.  }
1d1e0 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  .  pItem->zName 
1d1f0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1d200 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c  mToken(db, pTabl
1d210 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61  e);.  pItem->zDa
1d220 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33  tabase = sqlite3
1d230 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1d240 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20  , pDatabase);.  
1d250 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
1d260 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56 64  ./*.** Assign Vd
1d270 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78 20 6e  beCursor index n
1d280 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20 74 61  umbers to all ta
1d290 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73  bles in a SrcLis
1d2a0 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
1d2b0 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
1d2c0 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61  rsors(Parse *pPa
1d2d0 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  rse, SrcList *pL
1d2e0 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
1d2f0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1d300 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61  item *pItem;.  a
1d310 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 70  ssert(pList || p
1d320 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1d330 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
1d340 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
1d350 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(i=0, pItem=pLi
1d360 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e  st->a; i<pList->
1d370 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
1d380 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
1d390 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30  Item->iCursor>=0
1d3a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1d3b0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  pItem->iCursor =
1d3c0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
1d3d0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
1d3e0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
1d3f0 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
1d400 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
1d410 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
1d420 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a  pSelect->pSrc);.
1d430 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d440 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
1d450 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c  e an entire SrcL
1d460 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  ist including al
1d470 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75  l its substructu
1d480 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
1d490 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1d4a0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72  (sqlite3 *db, Sr
1d4b0 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
1d4c0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1d4d0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1d4e0 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
1d4f0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1d500 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
1d510 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
1d520 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
1d530 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
1d540 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1d550 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
1d560 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1d570 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ee(db, pItem->zN
1d580 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
1d590 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
1d5a0 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
1d5b0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1d5c0 2c 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29  , pItem->zIndex)
1d5d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  ;.    sqlite3Del
1d5e0 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 49 74  eteTable(db, pIt
1d5f0 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73  em->pTab);.    s
1d600 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
1d610 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53  te(db, pItem->pS
1d620 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69  elect);.    sqli
1d630 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1d640 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20  , pItem->pOn);. 
1d650 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
1d660 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
1d670 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20  ->pUsing);.  }. 
1d680 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1d690 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  b, pList);.}../*
1d6a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1d6b0 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
1d6c0 65 20 70 61 72 73 65 72 20 74 6f 20 61 64 64 20  e parser to add 
1d6d0 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68  a new term to th
1d6e0 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67 72  e.** end of a gr
1d6f0 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73  owing FROM claus
1d700 65 2e 20 20 54 68 65 20 22 70 22 20 70 61 72 61  e.  The "p" para
1d710 6d 65 74 65 72 20 69 73 20 74 68 65 20 70 61 72  meter is the par
1d720 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d  t of.** the FROM
1d730 20 63 6c 61 75 73 65 20 74 68 61 74 20 68 61 73   clause that has
1d740 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f   already been co
1d750 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70 22 20  nstructed.  "p" 
1d760 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68  is NULL.** if th
1d770 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
1d780 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d  term of the FROM
1d790 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62 6c 65   clause.  pTable
1d7a0 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 0a 2a   and pDatabase.*
1d7b0 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65 20 6f  * are the name o
1d7c0 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  f the table and 
1d7d0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20 69  database named i
1d7e0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1d7f0 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61  e term..** pData
1d800 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69 66 20  base is NULL if 
1d810 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1d820 65 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6d  e qualifier is m
1d830 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20  issing - the.** 
1d840 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49 66 20  usual case.  If 
1d850 74 68 65 20 74 65 72 6d 20 68 61 73 20 61 20 61  the term has a a
1d860 6c 69 61 73 2c 20 74 68 65 6e 20 70 41 6c 69 61  lias, then pAlia
1d870 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  s points to the.
1d880 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20  ** alias token. 
1d890 20 49 66 20 74 68 65 20 74 65 72 6d 20 69 73 20   If the term is 
1d8a0 61 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e  a subquery, then
1d8b0 20 70 53 75 62 71 75 65 72 79 20 69 73 20 74 68   pSubquery is th
1d8c0 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  e.** SELECT stat
1d8d0 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20 73  ement that the s
1d8e0 75 62 71 75 65 72 79 20 65 6e 63 6f 64 65 73 2e  ubquery encodes.
1d8f0 20 20 54 68 65 20 70 54 61 62 6c 65 20 61 6e 64    The pTable and
1d900 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 70 61  .** pDatabase pa
1d910 72 61 6d 65 74 65 72 73 20 61 72 65 20 4e 55 4c  rameters are NUL
1d920 4c 20 66 6f 72 20 73 75 62 71 75 65 72 69 65 73  L for subqueries
1d930 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e 64 20 70  .  The pOn and p
1d940 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74  Using.** paramet
1d950 65 72 73 20 61 72 65 20 74 68 65 20 63 6f 6e 74  ers are the cont
1d960 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e  ent of the ON an
1d970 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 2e  d USING clauses.
1d980 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  .**.** Return a 
1d990 6e 65 77 20 53 72 63 4c 69 73 74 20 77 68 69 63  new SrcList whic
1d9a0 68 20 65 6e 63 6f 64 65 73 20 69 73 20 74 68 65  h encodes is the
1d9b0 20 46 52 4f 4d 20 77 69 74 68 20 74 68 65 20 6e   FROM with the n
1d9c0 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65 64  ew.** term added
1d9d0 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
1d9e0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1d9f0 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61  ndFromTerm(.  Pa
1da00 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1da10 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
1da20 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
1da30 63 4c 69 73 74 20 2a 70 2c 20 20 20 20 20 20 20  cList *p,       
1da40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66        /* The lef
1da50 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 46 52  t part of the FR
1da60 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64  OM clause alread
1da70 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65  y seen */.  Toke
1da80 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20  n *pTable,      
1da90 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1daa0 68 65 20 74 61 62 6c 65 20 74 6f 20 61 64 64 20  he table to add 
1dab0 74 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  to the FROM clau
1dac0 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
1dad0 44 61 74 61 62 61 73 65 2c 20 20 20 20 20 20 20  Database,       
1dae0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
1daf0 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
1db00 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54  ng pTable */.  T
1db10 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20  oken *pAlias,   
1db20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
1db30 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
1db40 20 74 68 65 20 41 53 20 73 75 62 65 78 70 72 65   the AS subexpre
1db50 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ssion */.  Selec
1db60 74 20 2a 70 53 75 62 71 75 65 72 79 2c 20 20 20  t *pSubquery,   
1db70 20 20 20 2f 2a 20 41 20 73 75 62 71 75 65 72 79     /* A subquery
1db80 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f   used in place o
1db90 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a  f a table name *
1dba0 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20  /.  Expr *pOn,  
1dbb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1dbc0 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20  he ON clause of 
1dbd0 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69  a join */.  IdLi
1dbe0 73 74 20 2a 70 55 73 69 6e 67 20 20 20 20 20 20  st *pUsing      
1dbf0 20 20 20 20 2f 2a 20 54 68 65 20 55 53 49 4e 47      /* The USING
1dc00 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69   clause of a joi
1dc10 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  n */.){.  struct
1dc20 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1dc30 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  Item;.  sqlite3 
1dc40 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1dc50 3b 0a 20 20 69 66 28 20 21 70 20 26 26 20 28 70  ;.  if( !p && (p
1dc60 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b  On || pUsing) ){
1dc70 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1dc80 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
1dc90 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69 73 20 72  JOIN clause is r
1dca0 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 25  equired before %
1dcb0 73 22 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e 20  s", .      (pOn 
1dcc0 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22  ? "ON" : "USING"
1dcd0 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 67 6f 74  ).    );.    got
1dce0 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72  o append_from_er
1dcf0 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73  ror;.  }.  p = s
1dd00 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1dd10 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61 62 6c  end(db, p, pTabl
1dd20 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20  e, pDatabase);. 
1dd30 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56   if( p==0 || NEV
1dd40 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30 29 20 29  ER(p->nSrc==0) )
1dd50 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e  {.    goto appen
1dd60 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20  d_from_error;.  
1dd70 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e  }.  pItem = &p->
1dd80 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
1dd90 61 73 73 65 72 74 28 20 70 41 6c 69 61 73 21 3d  assert( pAlias!=
1dda0 30 20 29 3b 0a 20 20 69 66 28 20 70 41 6c 69 61  0 );.  if( pAlia
1ddb0 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65  s->n ){.    pIte
1ddc0 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
1ddd0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1dde0 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20  (db, pAlias);.  
1ddf0 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  }.  pItem->pSele
1de00 63 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a  ct = pSubquery;.
1de10 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70    pItem->pOn = p
1de20 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73  On;.  pItem->pUs
1de30 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20  ing = pUsing;.  
1de40 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65  return p;.. appe
1de50 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20  nd_from_error:. 
1de60 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b   assert( p==0 );
1de70 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
1de80 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20  lete(db, pOn);. 
1de90 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1dea0 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67 29  lete(db, pUsing)
1deb0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1dec0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
1ded0 71 75 65 72 79 29 3b 0a 20 20 72 65 74 75 72 6e  query);.  return
1dee0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   0;.}../*.** Add
1def0 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 6f   an INDEXED BY o
1df00 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c  r NOT INDEXED cl
1df10 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73 74  ause to the most
1df20 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
1df30 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  .** element of t
1df40 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 70  he source-list p
1df50 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
1df60 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
1df70 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
1df80 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 50 61  ListIndexedBy(Pa
1df90 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
1dfa0 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a  List *p, Token *
1dfb0 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20 61  pIndexedBy){.  a
1dfc0 73 73 65 72 74 28 20 70 49 6e 64 65 78 65 64 42  ssert( pIndexedB
1dfd0 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 20  y!=0 );.  if( p 
1dfe0 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e 53 72  && ALWAYS(p->nSr
1dff0 63 3e 30 29 20 29 7b 0a 20 20 20 20 73 74 72 75  c>0) ){.    stru
1e000 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1e010 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70  *pItem = &p->a[p
1e020 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61  ->nSrc-1];.    a
1e030 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 6e 6f  ssert( pItem->no
1e040 74 49 6e 64 65 78 65 64 3d 3d 30 20 26 26 20 70  tIndexed==0 && p
1e050 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 3d 3d 30 20  Item->zIndex==0 
1e060 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  );.    if( pInde
1e070 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21  xedBy->n==1 && !
1e080 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b  pIndexedBy->z ){
1e090 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54  .      /* A "NOT
1e0a0 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65   INDEXED" clause
1e0b0 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53   was supplied. S
1e0c0 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20  ee parse.y .    
1e0d0 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22    ** construct "
1e0e0 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72  indexed_opt" for
1e0f0 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20   details. */.   
1e100 20 20 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64     pItem->notInd
1e110 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65  exed = 1;.    }e
1e120 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65 6d  lse{.      pItem
1e130 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69 74  ->zIndex = sqlit
1e140 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1e150 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64  pParse->db, pInd
1e160 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20  exedBy);.    }. 
1e170 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e   }.}../*.** When
1e180 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61 20 46   building up a F
1e190 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68  ROM clause in th
1e1a0 65 20 70 61 72 73 65 72 2c 20 74 68 65 20 6a 6f  e parser, the jo
1e1b0 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69  in operator.** i
1e1c0 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74 74 61  s initially atta
1e1d0 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74  ched to the left
1e1e0 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74 20 74   operand.  But t
1e1f0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
1e200 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74 68 65  r.** expects the
1e210 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 74   join operator t
1e220 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69 67 68  o be on the righ
1e230 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  t operand.  This
1e240 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66   routine.** Shif
1e250 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72  ts all join oper
1e260 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74 20  ators from left 
1e270 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61 6e 20  to right for an 
1e280 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63  entire FROM.** c
1e290 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  lause..**.** Exa
1e2a0 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20 74 68  mple: Suppose th
1e2b0 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74  e join is like t
1e2c0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
1e2d0 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c 20 63       A natural c
1e2e0 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a  ross join B.**.*
1e2f0 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 69  * The operator i
1e300 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f 73 73  s "natural cross
1e310 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41 20 61   join".  The A a
1e320 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20 61 72  nd B operands ar
1e330 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70  e stored.** in p
1e340 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b  ->a[0] and p->a[
1e350 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  1], respectively
1e360 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
1e370 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73 20 74  itially stores t
1e380 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77  he.** operator w
1e390 69 74 68 20 41 2e 20 20 54 68 69 73 20 72 6f 75  ith A.  This rou
1e3a0 74 69 6e 65 20 73 68 69 66 74 73 20 74 68 61 74  tine shifts that
1e3b0 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72 20 74   operator over t
1e3c0 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  o B..*/.void sql
1e3d0 69 74 65 33 53 72 63 4c 69 73 74 53 68 69 66 74  ite3SrcListShift
1e3e0 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69 73 74  JoinType(SrcList
1e3f0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
1e400 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1e410 61 73 73 65 72 74 28 20 70 2d 3e 61 20 7c 7c 20  assert( p->a || 
1e420 70 2d 3e 6e 53 72 63 3d 3d 30 20 29 3b 0a 20 20  p->nSrc==0 );.  
1e430 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d    for(i=p->nSrc-
1e440 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
1e450 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e      p->a[i].join
1e460 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d  type = p->a[i-1]
1e470 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  .jointype;.    }
1e480 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 6a 6f 69  .    p->a[0].joi
1e490 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  ntype = 0;.  }.}
1e4a0 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
1e4b0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
1e4c0 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
1e4d0 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
1e4e0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74  e *pParse, int t
1e4f0 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ype){.  sqlite3 
1e500 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
1e510 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65    int i;..  asse
1e520 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
1e530 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
1e540 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  db;.  assert( db
1e550 21 3d 30 20 29 3b 0a 2f 2a 20 20 69 66 28 20 64  !=0 );./*  if( d
1e560 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
1e570 20 29 20 72 65 74 75 72 6e 3b 20 2a 2f 0a 20 20   ) return; */.  
1e580 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1e590 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1e5a0 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
1e5b0 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20   "BEGIN", 0, 0) 
1e5c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
1e5d0 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
1e5e0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1e5f0 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75  .  if( !v ) retu
1e600 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d  rn;.  if( type!=
1e610 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20  TK_DEFERRED ){. 
1e620 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
1e630 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
1e640 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e650 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73  dOp2(v, OP_Trans
1e660 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65  action, i, (type
1e670 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b  ==TK_EXCLUSIVE)+
1e680 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1e690 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
1e6a0 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
1e6b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e6c0 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  Op2(v, OP_AutoCo
1e6d0 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  mmit, 0, 0);.}..
1e6e0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74  /*.** Commit a t
1e6f0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
1e700 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74  id sqlite3Commit
1e710 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
1e720 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
1e730 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74  be *v;..  assert
1e740 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20  ( pParse!=0 );. 
1e750 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1e760 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  >db!=0 );.  if( 
1e770 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1e780 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1e790 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f  TRANSACTION, "CO
1e7a0 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 7b 0a  MMIT", 0, 0) ){.
1e7b0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1e7c0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
1e7d0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
1e7e0 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
1e7f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e800 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c  , OP_AutoCommit,
1e810 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   1, 0);.  }.}../
1e820 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20  *.** Rollback a 
1e830 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
1e840 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  oid sqlite3Rollb
1e850 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ackTransaction(P
1e860 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
1e870 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73   Vdbe *v;..  ass
1e880 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29  ert( pParse!=0 )
1e890 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
1e8a0 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69  se->db!=0 );.  i
1e8b0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1e8c0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1e8d0 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
1e8e0 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30  "ROLLBACK", 0, 0
1e8f0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
1e900 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74  .  }.  v = sqlit
1e910 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1e920 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
1e930 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e940 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  Op2(v, OP_AutoCo
1e950 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d  mmit, 1, 1);.  }
1e960 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1e970 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1e980 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
1e990 77 68 65 6e 20 69 74 20 70 61 72 73 65 73 20 61  when it parses a
1e9a0 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65 61   command to crea
1e9b0 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20 6f  te,.** release o
1e9c0 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53 51  r rollback an SQ
1e9d0 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f  L savepoint. .*/
1e9e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 61 76  .void sqlite3Sav
1e9f0 65 70 6f 69 6e 74 28 50 61 72 73 65 20 2a 70 50  epoint(Parse *pP
1ea00 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f  arse, int op, To
1ea10 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63  ken *pName){.  c
1ea20 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c  har *zName = sql
1ea30 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1ea40 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e  n(pParse->db, pN
1ea50 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
1ea60 65 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  e ){.    Vdbe *v
1ea70 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1ea80 65 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64  e(pParse);.#ifnd
1ea90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1eaa0 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
1eab0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
1eac0 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d 20  ar * const az[] 
1ead0 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20 22 52 45  = { "BEGIN", "RE
1eae0 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43  LEASE", "ROLLBAC
1eaf0 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74  K" };.    assert
1eb00 28 20 21 53 41 56 45 50 4f 49 4e 54 5f 42 45 47  ( !SAVEPOINT_BEG
1eb10 49 4e 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f  IN && SAVEPOINT_
1eb20 52 45 4c 45 41 53 45 3d 3d 31 20 26 26 20 53 41  RELEASE==1 && SA
1eb30 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1eb40 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ==2 );.#endif.  
1eb50 20 20 69 66 28 20 21 76 20 7c 7c 20 73 71 6c 69    if( !v || sqli
1eb60 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1eb70 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 41 56 45  rse, SQLITE_SAVE
1eb80 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a  POINT, az[op], z
1eb90 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  Name, 0) ){.    
1eba0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1ebb0 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d  pParse->db, zNam
1ebc0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
1ebd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1ebe0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1ebf0 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f   OP_Savepoint, o
1ec00 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20  p, 0, 0, zName, 
1ec10 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
1ec20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
1ec30 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74  ure the TEMP dat
1ec40 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e  abase is open an
1ec50 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  d available for 
1ec60 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  use.  Return.** 
1ec70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
1ec80 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79  rors.  Leave any
1ec90 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
1eca0 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
1ecb0 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
1ecc0 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
1ecd0 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70  atabase(Parse *p
1ece0 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
1ecf0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1ed00 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44  db;.  if( db->aD
1ed10 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21  b[1].pBt==0 && !
1ed20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
1ed30 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
1ed40 20 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20     Btree *pBt;. 
1ed50 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1ed60 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20 20 20  int flags = .   
1ed70 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1ed80 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20  EN_READWRITE |. 
1ed90 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1eda0 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
1edb0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1edc0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a  PEN_EXCLUSIVE |.
1edd0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1ede0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
1edf0 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  OSE |.          
1ee00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1ee10 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  _DB;..    rc = s
1ee20 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
1ee30 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c  db->pVfs, 0, db,
1ee40 20 26 70 42 74 2c 20 30 2c 20 66 6c 61 67 73 29   &pBt, 0, flags)
1ee50 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1ee60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ee70 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1ee80 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
1ee90 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
1eea0 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a  rary database ".
1eeb0 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f          "file fo
1eec0 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72  r storing tempor
1eed0 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20  ary tables");.  
1eee0 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
1eef0 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
1ef00 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  n 1;.    }.    d
1ef10 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20 3d 20  b->aDb[1].pBt = 
1ef20 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
1ef30 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
1ef40 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 53  ema );.    if( S
1ef50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c  QLITE_NOMEM==sql
1ef60 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
1ef70 53 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65  Size(pBt, db->ne
1ef80 78 74 50 61 67 65 73 69 7a 65 2c 20 2d 31 2c 20  xtPagesize, -1, 
1ef90 30 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  0) ){.      db->
1efa0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
1efb0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
1efc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1efd0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1efe0 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   Record the fact
1eff0 20 74 68 61 74 20 74 68 65 20 73 63 68 65 6d 61   that the schema
1f000 20 63 6f 6f 6b 69 65 20 77 69 6c 6c 20 6e 65 65   cookie will nee
1f010 64 20 74 6f 20 62 65 20 76 65 72 69 66 69 65 64  d to be verified
1f020 0a 2a 2a 20 66 6f 72 20 64 61 74 61 62 61 73 65  .** for database
1f030 20 69 44 62 2e 20 20 54 68 65 20 63 6f 64 65 20   iDb.  The code 
1f040 74 6f 20 61 63 74 75 61 6c 6c 79 20 76 65 72 69  to actually veri
1f050 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  fy the schema co
1f060 6f 6b 69 65 0a 2a 2a 20 77 69 6c 6c 20 6f 63 63  okie.** will occ
1f070 75 72 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ur at the end of
1f080 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 56   the top-level V
1f090 44 42 45 20 61 6e 64 20 77 69 6c 6c 20 62 65 20  DBE and will be 
1f0a0 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 6c 61 74  generated.** lat
1f0b0 65 72 2c 20 62 79 20 73 71 6c 69 74 65 33 46 69  er, by sqlite3Fi
1f0c0 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2f  nishCoding()..*/
1f0d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
1f0e0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61  eVerifySchema(Pa
1f0f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1f100 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a   iDb){.  Parse *
1f110 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
1f120 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
1f130 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
1f140 74 65 33 20 2a 64 62 20 3d 20 70 54 6f 70 6c 65  te3 *db = pTople
1f150 76 65 6c 2d 3e 64 62 3b 0a 20 20 79 44 62 4d 61  vel->db;.  yDbMa
1f160 73 6b 20 6d 61 73 6b 3b 0a 0a 20 20 61 73 73 65  sk mask;..  asse
1f170 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
1f180 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  b<db->nDb );.  a
1f190 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69  ssert( db->aDb[i
1f1a0 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44  Db].pBt!=0 || iD
1f1b0 62 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  b==1 );.  assert
1f1c0 28 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58  ( iDb<SQLITE_MAX
1f1d0 5f 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20  _ATTACHED+2 );. 
1f1e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1f1f0 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
1f200 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
1f210 20 6d 61 73 6b 20 3d 20 28 28 79 44 62 4d 61 73   mask = ((yDbMas
1f220 6b 29 31 29 3c 3c 69 44 62 3b 0a 20 20 69 66 28  k)1)<<iDb;.  if(
1f230 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f   (pToplevel->coo
1f240 6b 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d  kieMask & mask)=
1f250 3d 30 20 29 7b 0a 20 20 20 20 70 54 6f 70 6c 65  =0 ){.    pTople
1f260 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  vel->cookieMask 
1f270 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 70 54 6f  |= mask;.    pTo
1f280 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 56 61  plevel->cookieVa
1f290 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61  lue[iDb] = db->a
1f2a0 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
1f2b0 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a  >schema_cookie;.
1f2c0 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
1f2d0 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
1f2e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
1f2f0 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28  penTempDatabase(
1f300 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20  pToplevel);.    
1f310 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
1f320 66 20 61 72 67 75 6d 65 6e 74 20 7a 44 62 20 69  f argument zDb i
1f330 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c  s NULL, then cal
1f340 6c 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  l sqlite3CodeVer
1f350 69 66 79 53 63 68 65 6d 61 28 29 20 66 6f 72 20  ifySchema() for 
1f360 65 61 63 68 20 0a 2a 2a 20 61 74 74 61 63 68 65  each .** attache
1f370 64 20 64 61 74 61 62 61 73 65 2e 20 4f 74 68 65  d database. Othe
1f380 72 77 69 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74  rwise, invoke it
1f390 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
1f3a0 65 20 6e 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79  e named zDb only
1f3b0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1f3c0 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64  3CodeVerifyNamed
1f3d0 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50  Schema(Parse *pP
1f3e0 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
1f3f0 20 2a 7a 44 62 29 7b 0a 20 20 73 71 6c 69 74 65   *zDb){.  sqlite
1f400 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1f410 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  db;.  int i;.  f
1f420 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
1f430 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20  b; i++){.    Db 
1f440 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
1f450 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  i];.    if( pDb-
1f460 3e 70 42 74 20 26 26 20 28 21 7a 44 62 20 7c 7c  >pBt && (!zDb ||
1f470 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
1f480 6d 70 28 7a 44 62 2c 20 70 44 62 2d 3e 7a 4e 61  mp(zDb, pDb->zNa
1f490 6d 65 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71  me)) ){.      sq
1f4a0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
1f4b0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29  chema(pParse, i)
1f4c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1f4d0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
1f4e0 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65  BE code that pre
1f4f0 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20  pares for doing 
1f500 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61  an operation tha
1f510 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67  t.** might chang
1f520 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  e the database..
1f530 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1f540 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20  ne starts a new 
1f550 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77  transaction if w
1f560 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64  e are not alread
1f570 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72  y within.** a tr
1f580 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77  ansaction.  If w
1f590 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69  e are already wi
1f5a0 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
1f5b0 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b  on, then a check
1f5c0 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20  point.** is set 
1f5d0 69 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d  if the setStatem
1f5e0 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  ent parameter is
1f5f0 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70   true.  A checkp
1f600 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  oint should.** b
1f610 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74  e set for operat
1f620 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20  ions that might 
1f630 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63  fail (due to a c
1f640 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20  onstraint) part 
1f650 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68  of.** the way th
1f660 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20  rough and which 
1f670 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64  will need to und
1f680 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69  o some writes wi
1f690 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a  thout having to.
1f6a0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** rollback the 
1f6b0 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  whole transactio
1f6c0 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f  n.  For operatio
1f6d0 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e  ns where all con
1f6e0 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20  straints.** can 
1f6f0 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72  be checked befor
1f700 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72  e any changes ar
1f710 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  e made to the da
1f720 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65  tabase, it is ne
1f730 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79  ver.** necessary
1f740 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65   to undo a write
1f750 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f   and the checkpo
1f760 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  int should not b
1f770 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  e set..*/.void s
1f780 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
1f790 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20  Operation(Parse 
1f7a0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74  *pParse, int set
1f7b0 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69  Statement, int i
1f7c0 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54  Db){.  Parse *pT
1f7d0 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
1f7e0 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
1f7f0 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
1f800 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
1f810 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
1f820 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69    pToplevel->wri
1f830 74 65 4d 61 73 6b 20 7c 3d 20 28 28 79 44 62 4d  teMask |= ((yDbM
1f840 61 73 6b 29 31 29 3c 3c 69 44 62 3b 0a 20 20 70  ask)1)<<iDb;.  p
1f850 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74  Toplevel->isMult
1f860 69 57 72 69 74 65 20 7c 3d 20 73 65 74 53 74 61  iWrite |= setSta
1f870 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tement;.}../*.**
1f880 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   Indicate that t
1f890 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72  he statement cur
1f8a0 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
1f8b0 73 74 72 75 63 74 69 6f 6e 20 6d 69 67 68 74 20  struction might 
1f8c0 77 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68  write.** more th
1f8d0 61 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28 65 78  an one entry (ex
1f8e0 61 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20  ample: deleting 
1f8f0 6f 6e 65 20 72 6f 77 20 74 68 65 6e 20 69 6e 73  one row then ins
1f900 65 72 74 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a  erting another,.
1f910 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c  ** inserting mul
1f920 74 69 70 6c 65 20 72 6f 77 73 20 69 6e 20 61 20  tiple rows in a 
1f930 74 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74  table, or insert
1f940 69 6e 67 20 61 20 72 6f 77 20 61 6e 64 20 69 6e  ing a row and in
1f950 64 65 78 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a  dex entries.).**
1f960 20 49 66 20 61 6e 20 61 62 6f 72 74 20 6f 63 63   If an abort occ
1f970 75 72 73 20 61 66 74 65 72 20 73 6f 6d 65 20 6f  urs after some o
1f980 66 20 74 68 65 73 65 20 77 72 69 74 65 73 20 68  f these writes h
1f990 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74  ave completed, t
1f9a0 68 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62  hen it will.** b
1f9b0 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75  e necessary to u
1f9c0 6e 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ndo the complete
1f9d0 64 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69  d writes..*/.voi
1f9e0 64 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72  d sqlite3MultiWr
1f9f0 69 74 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ite(Parse *pPars
1fa00 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  e){.  Parse *pTo
1fa10 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
1fa20 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
1fa30 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76  arse);.  pToplev
1fa40 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  el->isMultiWrite
1fa50 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20   = 1;.}../* .** 
1fa60 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
1fa70 6f 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  or calls this ro
1fa80 75 74 69 6e 65 20 69 66 20 69 73 20 64 69 73 63  utine if is disc
1fa90 6f 76 65 72 73 20 74 68 61 74 20 69 74 20 69 73  overs that it is
1faa0 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  .** possible to 
1fab0 61 62 6f 72 74 20 61 20 73 74 61 74 65 6d 65 6e  abort a statemen
1fac0 74 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c  t prior to compl
1fad0 65 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72  etion.  In order
1fae0 20 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20   to .** perform 
1faf0 74 68 69 73 20 61 62 6f 72 74 20 77 69 74 68 6f  this abort witho
1fb00 75 74 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68  ut corrupting th
1fb10 65 20 64 61 74 61 62 61 73 65 2c 20 77 65 20 6e  e database, we n
1fb20 65 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73  eed to make.** s
1fb30 75 72 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ure that the sta
1fb40 74 65 6d 65 6e 74 20 69 73 20 70 72 6f 74 65 63  tement is protec
1fb50 74 65 64 20 62 79 20 61 20 73 74 61 74 65 6d 65  ted by a stateme
1fb60 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
1fb70 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c  **.** Technicall
1fb80 79 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20  y, we only need 
1fb90 74 6f 20 73 65 74 20 74 68 65 20 6d 61 79 41 62  to set the mayAb
1fba0 6f 72 74 20 66 6c 61 67 20 69 66 20 74 68 65 0a  ort flag if the.
1fbb0 2a 2a 20 69 73 4d 75 6c 74 69 57 72 69 74 65 20  ** isMultiWrite 
1fbc0 66 6c 61 67 20 77 61 73 20 70 72 65 76 69 6f 75  flag was previou
1fbd0 73 6c 79 20 73 65 74 2e 20 20 54 68 65 72 65 20  sly set.  There 
1fbe0 69 73 20 61 20 74 69 6d 65 20 64 65 70 65 6e 64  is a time depend
1fbf0 65 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74 68 61  ency.** such tha
1fc00 74 20 74 68 65 20 61 62 6f 72 74 20 6d 75 73 74  t the abort must
1fc10 20 6f 63 63 75 72 20 61 66 74 65 72 20 74 68 65   occur after the
1fc20 20 6d 75 6c 74 69 77 72 69 74 65 2e 20 20 54 68   multiwrite.  Th
1fc30 69 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65  is makes.** some
1fc40 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f   statements invo
1fc50 6c 76 69 6e 67 20 74 68 65 20 52 45 50 4c 41 43  lving the REPLAC
1fc60 45 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  E conflict resol
1fc70 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a  ution algorithm.
1fc80 2a 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65 20 66  ** go a little f
1fc90 61 73 74 65 72 2e 20 20 42 75 74 20 74 61 6b 69  aster.  But taki
1fca0 6e 67 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20  ng advantage of 
1fcb0 74 68 69 73 20 74 69 6d 65 20 64 65 70 65 6e 64  this time depend
1fcc0 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74  ency.** makes it
1fcd0 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c 74 20   more difficult 
1fce0 74 6f 20 70 72 6f 76 65 20 74 68 61 74 20 74 68  to prove that th
1fcf0 65 20 63 6f 64 65 20 69 73 20 63 6f 72 72 65 63  e code is correc
1fd00 74 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63  t (in .** partic
1fd10 75 6c 61 72 2c 20 69 74 20 70 72 65 76 65 6e 74  ular, it prevent
1fd20 73 20 75 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  s us from writin
1fd30 67 20 61 6e 20 65 66 66 65 63 74 69 76 65 0a 2a  g an effective.*
1fd40 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
1fd50 20 6f 66 20 73 71 6c 69 74 65 33 41 73 73 65 72   of sqlite3Asser
1fd60 74 4d 61 79 41 62 6f 72 74 28 29 29 20 61 6e 64  tMayAbort()) and
1fd70 20 73 6f 20 77 65 20 68 61 76 65 20 63 68 6f 73   so we have chos
1fd80 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68  en.** to take th
1fd90 65 20 73 61 66 65 20 72 6f 75 74 65 20 61 6e 64  e safe route and
1fda0 20 73 6b 69 70 20 74 68 65 20 6f 70 74 69 6d 69   skip the optimi
1fdb0 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  zation..*/.void 
1fdc0 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
1fdd0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
1fde0 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
1fdf0 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
1fe00 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
1fe10 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  );.  pToplevel->
1fe20 6d 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a  mayAbort = 1;.}.
1fe30 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
1fe40 50 5f 48 61 6c 74 20 74 68 61 74 20 63 61 75 73  P_Halt that caus
1fe50 65 73 20 74 68 65 20 76 64 62 65 20 74 6f 20 72  es the vdbe to r
1fe60 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
1fe70 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72  CONSTRAINT.** er
1fe80 72 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72  ror. The onError
1fe90 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72   parameter deter
1fea0 6d 69 6e 65 73 20 77 68 69 63 68 20 28 69 66 20  mines which (if 
1feb0 61 6e 79 29 20 6f 66 20 74 68 65 20 73 74 61 74  any) of the stat
1fec0 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20  ement.** and/or 
1fed0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
1fee0 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
1fef0 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ck..*/.void sqli
1ff00 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
1ff10 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
1ff20 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
1ff30 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
1ff40 6e 74 20 65 72 72 43 6f 64 65 2c 20 20 20 20 20  nt errCode,     
1ff50 20 2f 2a 20 65 78 74 65 6e 64 65 64 20 65 72 72   /* extended err
1ff60 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  or code */.  int
1ff70 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
1ff80 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70  * Constraint typ
1ff90 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c  e */.  char *p4,
1ffa0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
1ffb0 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 69  r message */.  i
1ffc0 38 20 70 34 74 79 70 65 2c 20 20 20 20 20 20 20  8 p4type,       
1ffd0 20 2f 2a 20 50 34 5f 53 54 41 54 49 43 20 6f 72   /* P4_STATIC or
1ffe0 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f   P4_TRANSIENT */
1fff0 0a 20 20 75 38 20 70 35 45 72 72 6d 73 67 20 20  .  u8 p5Errmsg  
20000 20 20 20 20 20 2f 2a 20 50 35 5f 45 72 72 4d 73       /* P5_ErrMs
20010 67 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 56  g type */.){.  V
20020 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
20030 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
20040 0a 20 20 61 73 73 65 72 74 28 20 28 65 72 72 43  .  assert( (errC
20050 6f 64 65 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  ode&0xff)==SQLIT
20060 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a  E_CONSTRAINT );.
20070 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f    if( onError==O
20080 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 73  E_Abort ){.    s
20090 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
200a0 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Parse);.  }.  sq
200b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
200c0 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 65 72 72 43  v, OP_Halt, errC
200d0 6f 64 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c  ode, onError, 0,
200e0 20 70 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20   p4, p4type);.  
200f0 69 66 28 20 70 35 45 72 72 6d 73 67 20 29 20 73  if( p5Errmsg ) s
20100 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
20110 50 35 28 76 2c 20 70 35 45 72 72 6d 73 67 29 3b  P5(v, p5Errmsg);
20120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  .}../*.** Code a
20130 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f  n OP_Halt due to
20140 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41   UNIQUE or PRIMA
20150 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
20160 74 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a  t violation..*/.
20170 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69 71  void sqlite3Uniq
20180 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ueConstraint(.  
20190 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
201a0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
201b0 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  text */.  int on
201c0 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43  Error,      /* C
201d0 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a  onstraint type *
201e0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
201f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
20200 65 78 20 74 68 61 74 20 74 72 69 67 67 65 72 73  ex that triggers
20210 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
20220 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  */.){.  char *zE
20230 72 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 53  rr;.  int j;.  S
20240 74 72 41 63 63 75 6d 20 65 72 72 4d 73 67 3b 0a  trAccum errMsg;.
20250 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
20260 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20  pIdx->pTable;.. 
20270 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
20280 49 6e 69 74 28 26 65 72 72 4d 73 67 2c 20 30 2c  Init(&errMsg, 0,
20290 20 30 2c 20 32 30 30 29 3b 0a 20 20 65 72 72 4d   0, 200);.  errM
202a0 73 67 2e 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  sg.db = pParse->
202b0 64 62 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  db;.  for(j=0; j
202c0 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
202d0 6a 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  j++){.    char *
202e0 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
202f0 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  l[pIdx->aiColumn
20300 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  [j]].zName;.    
20310 69 66 28 20 6a 20 29 20 73 71 6c 69 74 65 33 53  if( j ) sqlite3S
20320 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 65  trAccumAppend(&e
20330 72 72 4d 73 67 2c 20 22 2c 20 22 2c 20 32 29 3b  rrMsg, ", ", 2);
20340 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41  .    sqlite3StrA
20350 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 65  ccumAppendAll(&e
20360 72 72 4d 73 67 2c 20 70 54 61 62 2d 3e 7a 4e 61  rrMsg, pTab->zNa
20370 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
20380 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
20390 65 72 72 4d 73 67 2c 20 22 2e 22 2c 20 31 29 3b  errMsg, ".", 1);
203a0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41  .    sqlite3StrA
203b0 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 65  ccumAppendAll(&e
203c0 72 72 4d 73 67 2c 20 7a 43 6f 6c 29 3b 0a 20 20  rrMsg, zCol);.  
203d0 7d 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74  }.  zErr = sqlit
203e0 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
203f0 28 26 65 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c  (&errMsg);.  sql
20400 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69  ite3HaltConstrai
20410 6e 74 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  nt(pParse, .    
20420 28 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78  (pIdx->autoIndex
20430 3d 3d 32 29 3f 53 51 4c 49 54 45 5f 43 4f 4e 53  ==2)?SQLITE_CONS
20440 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45  TRAINT_PRIMARYKE
20450 59 3a 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  Y:SQLITE_CONSTRA
20460 49 4e 54 5f 55 4e 49 51 55 45 2c 0a 20 20 20 20  INT_UNIQUE,.    
20470 6f 6e 45 72 72 6f 72 2c 20 7a 45 72 72 2c 20 50  onError, zErr, P
20480 34 5f 44 59 4e 41 4d 49 43 2c 20 50 35 5f 43 6f  4_DYNAMIC, P5_Co
20490 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b  nstraintUnique);
204a0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  .}.../*.** Code 
204b0 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74  an OP_Halt due t
204c0 6f 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77  o non-unique row
204d0 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  id..*/.void sqli
204e0 74 65 33 52 6f 77 69 64 43 6f 6e 73 74 72 61 69  te3RowidConstrai
204f0 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
20500 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
20510 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
20520 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
20530 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
20540 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
20550 68 6d 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  hm */.  Table *p
20560 54 61 62 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Tab       /* The
20570 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
20580 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64  non-unique rowid
20590 20 2a 2f 20 0a 29 7b 0a 20 20 63 68 61 72 20 2a   */ .){.  char *
205a0 7a 4d 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  zMsg;.  int rc;.
205b0 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65    if( pTab->iPKe
205c0 79 3e 3d 30 20 29 7b 0a 20 20 20 20 7a 4d 73 67  y>=0 ){.    zMsg
205d0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
205e0 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25  f(pParse->db, "%
205f0 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  s.%s", pTab->zNa
20600 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
20610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
20620 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69  ab->aCol[pTab->i
20630 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  PKey].zName);.  
20640 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
20650 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59  NSTRAINT_PRIMARY
20660 4b 45 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  KEY;.  }else{.  
20670 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
20680 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
20690 64 62 2c 20 22 25 73 2e 72 6f 77 69 64 22 2c 20  db, "%s.rowid", 
206a0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
206b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
206c0 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3b 0a  NSTRAINT_ROWID;.
206d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 6c    }.  sqlite3Hal
206e0 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
206f0 73 65 2c 20 72 63 2c 20 6f 6e 45 72 72 6f 72 2c  se, rc, onError,
20700 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
20710 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  C,.             
20720 20 20 20 20 20 20 20 20 20 20 20 50 35 5f 43 6f             P5_Co
20730 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b  nstraintUnique);
20740 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
20750 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65 78  to see if pIndex
20760 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74   uses the collat
20770 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
20780 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  ll.  Return.** t
20790 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 20 61  rue if it does a
207a0 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74 20 64  nd false if it d
207b0 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e  oes not..*/.#ifn
207c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
207d0 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69  REINDEX.static i
207e0 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63  nt collationMatc
207f0 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43  h(const char *zC
20800 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  oll, Index *pInd
20810 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ex){.  int i;.  
20820 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30  assert( zColl!=0
20830 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
20840 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  <pIndex->nColumn
20850 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
20860 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64  t char *z = pInd
20870 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20  ex->azColl[i];. 
20880 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20     assert( z!=0 
20890 7c 7c 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  || pIndex->aiCol
208a0 75 6d 6e 5b 69 5d 3c 30 20 29 3b 0a 20 20 20 20  umn[i]<0 );.    
208b0 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  if( pIndex->aiCo
208c0 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20 30 3d  lumn[i]>=0 && 0=
208d0 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
208e0 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  z, zColl) ){.   
208f0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
20900 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
20910 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
20920 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c  ** Recompute all
20930 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62   indices of pTab
20940 20 74 68 61 74 20 75 73 65 20 74 68 65 20 63 6f   that use the co
20950 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
20960 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43   pColl..** If pC
20970 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
20980 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
20990 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69  s of pTab..*/.#i
209a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
209b0 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
209c0 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62   void reindexTab
209d0 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
209e0 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63  , Table *pTab, c
209f0 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
20a00 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
20a10 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
20a20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73   /* An index ass
20a30 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61  ociated with pTa
20a40 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64  b */..  for(pInd
20a50 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  ex=pTab->pIndex;
20a60 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d   pIndex; pIndex=
20a70 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a  pIndex->pNext){.
20a80 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30      if( zColl==0
20a90 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74   || collationMat
20aa0 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78  ch(zColl, pIndex
20ab0 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
20ac0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
20ad0 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
20ae0 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
20af0 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ema);.      sqli
20b00 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
20b10 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
20b20 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
20b30 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
20b40 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
20b50 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   -1);.    }.  }.
20b60 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
20b70 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
20b80 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62  dices of all tab
20b90 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62  les in all datab
20ba0 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a  ases where the.*
20bb0 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74 68  * indices use th
20bc0 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
20bd0 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20  ence pColl.  If 
20be0 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65  pColl==0 then re
20bf0 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69  compute.** all i
20c00 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65 72  ndices everywher
20c10 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
20c20 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
20c30 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  X.static void re
20c40 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 50  indexDatabases(P
20c50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68  arse *pParse, ch
20c60 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29  ar const *zColl)
20c70 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  {.  Db *pDb;    
20c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c90 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61  /* A single data
20ca0 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  base */.  int iD
20cb0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
20cc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
20cd0 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62  abase index numb
20ce0 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
20cf0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
20d00 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
20d10 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
20d20 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b  /.  HashElem *k;
20d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d40 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
20d50 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44  ver tables in pD
20d60 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  b */.  Table *pT
20d70 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
20d80 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e     /* A table in
20d90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
20da0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
20db0 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c  te3BtreeHoldsAll
20dc0 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 20 20  Mutexes(db) );  
20dd0 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20 73 63  /* Needed for sc
20de0 68 65 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a 20  hema access */. 
20df0 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d   for(iDb=0, pDb=
20e00 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d  db->aDb; iDb<db-
20e10 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62  >nDb; iDb++, pDb
20e20 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
20e30 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66   pDb!=0 );.    f
20e40 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46  or(k=sqliteHashF
20e50 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65  irst(&pDb->pSche
20e60 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b  ma->tblHash);  k
20e70 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; k=sqliteHashNe
20e80 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54  xt(k)){.      pT
20e90 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c  ab = (Table*)sql
20ea0 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a  iteHashData(k);.
20eb0 20 20 20 20 20 20 72 65 69 6e 64 65 78 54 61 62        reindexTab
20ec0 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  le(pParse, pTab,
20ed0 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20   zColl);.    }. 
20ee0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
20ef0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
20f00 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58   for the REINDEX
20f10 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
20f20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
20f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f40 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a            -- 1.*
20f50 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
20f60 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20    <collation>   
20f70 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32              -- 2
20f80 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
20f90 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e  EX  ?<database>.
20fa0 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d  ?<tablename>  --
20fb0 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   3.**        REI
20fc0 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65  NDEX  ?<database
20fd0 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20  >.?<indexname>  
20fe0 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20  -- 4.**.** Form 
20ff0 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64  1 causes all ind
21000 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61  ices in all atta
21010 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74  ched databases t
21020 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a  o be rebuilt..**
21030 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73   Form 2 rebuilds
21040 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20   all indices in 
21050 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74 68  all databases th
21060 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64  at use the named
21070 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  .** collating fu
21080 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33  nction.  Forms 3
21090 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74   and 4 rebuild t
210a0 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f  he named index o
210b0 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73  r all.** indices
210c0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
210d0 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
210e0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
210f0 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
21100 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69  .void sqlite3Rei
21110 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
21120 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
21130 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  1, Token *pName2
21140 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
21150 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
21160 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
21170 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69  quence to be rei
21180 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  ndexed, or NULL 
21190 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20  */.  char *z;   
211a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211b0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61   /* Name of a ta
211c0 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a  ble or index */.
211d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
211e0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b;            /*
211f0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
21200 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65  abase */.  Table
21210 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
21220 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c         /* A tabl
21230 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
21240 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
21250 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
21260 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61     /* An index a
21270 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
21280 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  Tab */.  int iDb
21290 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
212a0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
212b0 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65  base index numbe
212c0 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
212d0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
212e0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
212f0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
21300 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61  .  Token *pObjNa
21310 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
21320 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
21330 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20  ble or index to 
21340 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a  be reindexed */.
21350 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64  .  /* Read the d
21360 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
21370 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
21380 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  rs, leave an err
21390 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20  or message.  ** 
213a0 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72  and code in pPar
213b0 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  se and return NU
213c0 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  LL. */.  if( SQL
213d0 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
213e0 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
213f0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
21400 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d  .  }..  if( pNam
21410 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69  e1==0 ){.    rei
21420 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50  ndexDatabases(pP
21430 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65  arse, 0);.    re
21440 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  turn;.  }else if
21450 28 20 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d  ( NEVER(pName2==
21460 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d  0) || pName2->z=
21470 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =0 ){.    char *
21480 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72  zColl;.    asser
21490 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a  t( pName1->z );.
214a0 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69      zColl = sqli
214b0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
214c0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
214d0 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  me1);.    if( !z
214e0 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20  Coll ) return;. 
214f0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
21500 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
21510 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
21520 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , 0);.    if( pC
21530 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69  oll ){.      rei
21540 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50  ndexDatabases(pP
21550 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  arse, zColl);.  
21560 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
21570 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  e(db, zColl);.  
21580 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
21590 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
215a0 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  ree(db, zColl);.
215b0 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
215c0 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
215d0 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
215e0 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65  Name2, &pObjName
215f0 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29  );.  if( iDb<0 )
21600 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73   return;.  z = s
21610 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
21620 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65  ken(db, pObjName
21630 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  );.  if( z==0 ) 
21640 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20  return;.  zDb = 
21650 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
21660 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  me;.  pTab = sql
21670 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
21680 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28  , z, zDb);.  if(
21690 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69   pTab ){.    rei
216a0 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
216b0 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , pTab, 0);.    
216c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
216d0 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , z);.    return
216e0 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d  ;.  }.  pIndex =
216f0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
21700 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20  x(db, z, zDb);. 
21710 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
21720 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e  b, z);.  if( pIn
21730 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dex ){.    sqlit
21740 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
21750 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
21760 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
21770 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
21780 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31  arse, pIndex, -1
21790 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
217a0 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f   }.  sqlite3Erro
217b0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
217c0 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79  able to identify
217d0 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62   the object to b
217e0 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d  e reindexed");.}
217f0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
21800 65 74 75 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20  eturn a KeyInfo 
21810 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69  structure that i
21820 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
21830 72 20 74 68 65 20 67 69 76 65 6e 20 49 6e 64 65  r the given Inde
21840 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4b 65 79  x..**.** The Key
21850 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 66  Info structure f
21860 6f 72 20 61 6e 20 69 6e 64 65 78 20 69 73 20 63  or an index is c
21870 61 63 68 65 64 20 69 6e 20 74 68 65 20 49 6e 64  ached in the Ind
21880 65 78 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 53 6f  ex object..** So
21890 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   there might be 
218a0 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e  multiple referen
218b0 63 65 73 20 74 6f 20 74 68 65 20 72 65 74 75 72  ces to the retur
218c0 6e 65 64 20 70 6f 69 6e 74 65 72 2e 20 20 54 68  ned pointer.  Th
218d0 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75  e.** caller shou
218e0 6c 64 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d 6f  ld not try to mo
218f0 64 69 66 79 20 74 68 65 20 4b 65 79 49 6e 66 6f  dify the KeyInfo
21900 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
21910 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
21920 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 4b   invoke sqlite3K
21930 65 79 49 6e 66 6f 55 6e 72 65 66 28 29 20 6f 6e  eyInfoUnref() on
21940 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62   the returned ob
21950 6a 65 63 74 0a 2a 2a 20 77 68 65 6e 20 69 74 20  ject.** when it 
21960 68 61 73 20 66 69 6e 69 73 68 65 64 20 75 73 69  has finished usi
21970 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  ng it..*/.KeyInf
21980 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
21990 6f 4f 66 49 6e 64 65 78 28 50 61 72 73 65 20 2a  oOfIndex(Parse *
219a0 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
219b0 49 64 78 29 7b 0a 20 20 69 66 28 20 70 50 61 72  Idx){.  if( pPar
219c0 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
219d0 6e 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  n 0;.#ifndef SQL
219e0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
219f0 43 41 43 48 45 0a 20 20 69 66 28 20 70 49 64 78  CACHE.  if( pIdx
21a00 2d 3e 70 4b 65 79 49 6e 66 6f 20 26 26 20 70 49  ->pKeyInfo && pI
21a10 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  dx->pKeyInfo->db
21a20 21 3d 70 50 61 72 73 65 2d 3e 64 62 20 29 7b 0a  !=pParse->db ){.
21a30 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
21a40 66 6f 55 6e 72 65 66 28 70 49 64 78 2d 3e 70 4b  foUnref(pIdx->pK
21a50 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 70 49 64  eyInfo);.    pId
21a60 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b  x->pKeyInfo = 0;
21a70 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
21a80 28 20 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f  ( pIdx->pKeyInfo
21a90 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
21aa0 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d  ;.    int nCol =
21ab0 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a   pIdx->nColumn;.
21ac0 20 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70      int nKey = p
21ad0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  Idx->nKeyCol;.  
21ae0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b    KeyInfo *pKey;
21af0 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 75  .    if( pIdx->u
21b00 6e 69 71 4e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20  niqNotNull ){.  
21b10 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74      pKey = sqlit
21b20 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70  e3KeyInfoAlloc(p
21b30 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c  Parse->db, nKey,
21b40 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20 20 20   nCol-nKey);.   
21b50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4b   }else{.      pK
21b60 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  ey = sqlite3KeyI
21b70 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  nfoAlloc(pParse-
21b80 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20  >db, nCol, 0);. 
21b90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4b 65     }.    if( pKe
21ba0 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  y ){.      asser
21bb0 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
21bc0 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65  oIsWriteable(pKe
21bd0 79 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  y) );.      for(
21be0 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
21bf0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
21c00 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61  *zColl = pIdx->a
21c10 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  zColl[i];.      
21c20 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21    assert( zColl!
21c30 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4b  =0 );.        pK
21c40 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73  ey->aColl[i] = s
21c50 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c 22 42 49 4e  trcmp(zColl,"BIN
21c60 41 52 59 22 29 3d 3d 30 20 3f 20 30 20 3a 0a 20  ARY")==0 ? 0 :. 
21c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21c90 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
21ca0 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  arse, zColl);.  
21cb0 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72        pKey->aSor
21cc0 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 64 78  tOrder[i] = pIdx
21cd0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b  ->aSortOrder[i];
21ce0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
21cf0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
21d00 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
21d10 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
21d20 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Key);.      }els
21d30 65 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  e{.        pIdx-
21d40 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79  >pKeyInfo = pKey
21d50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21d60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c    }.  return sql
21d70 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
21d80 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a  Idx->pKeyInfo);.
21d90 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
21da0 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20 0a 2a  E_OMIT_CTE./* .*
21db0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
21dc0 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 70  s invoked once p
21dd0 65 72 20 43 54 45 20 62 79 20 74 68 65 20 70 61  er CTE by the pa
21de0 72 73 65 72 20 77 68 69 6c 65 20 70 61 72 73 69  rser while parsi
21df0 6e 67 20 61 20 0a 2a 2a 20 57 49 54 48 20 63 6c  ng a .** WITH cl
21e00 61 75 73 65 2e 20 0a 2a 2f 0a 57 69 74 68 20 2a  ause. .*/.With *
21e10 73 71 6c 69 74 65 33 57 69 74 68 41 64 64 28 0a  sqlite3WithAdd(.
21e20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
21e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
21e40 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
21e50 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20    With *pWith,  
21e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 69            /* Exi
21e70 73 74 69 6e 67 20 57 49 54 48 20 63 6c 61 75 73  sting WITH claus
21e80 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  e, or NULL */.  
21e90 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20  Token *pName,   
21ea0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
21eb0 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d 74 61  of the common-ta
21ec0 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
21ed0 74 20 2a 70 41 72 67 6c 69 73 74 2c 20 20 20 20  t *pArglist,    
21ee0 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 63 6f 6c   /* Optional col
21ef0 75 6d 6e 20 6e 61 6d 65 20 6c 69 73 74 20 66 6f  umn name list fo
21f00 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  r the table */. 
21f10 20 53 65 6c 65 63 74 20 2a 70 51 75 65 72 79 20   Select *pQuery 
21f20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72           /* Quer
21f30 79 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61  y used to initia
21f40 6c 69 7a 65 20 74 68 65 20 74 61 62 6c 65 20 2a  lize the table *
21f50 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
21f60 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
21f70 0a 20 20 57 69 74 68 20 2a 70 4e 65 77 3b 0a 20  .  With *pNew;. 
21f80 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20   char *zName;.. 
21f90 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
21fa0 68 65 20 43 54 45 20 6e 61 6d 65 20 69 73 20 75  he CTE name is u
21fb0 6e 69 71 75 65 20 77 69 74 68 69 6e 20 74 68 69  nique within thi
21fc0 73 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20 49  s WITH clause. I
21fd0 66 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73 74 6f 72  f.  ** not, stor
21fe0 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68  e an error in th
21ff0 65 20 50 61 72 73 65 20 73 74 72 75 63 74 75 72  e Parse structur
22000 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20  e. */.  zName = 
22010 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
22020 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
22030 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a   pName);.  if( z
22040 4e 61 6d 65 20 26 26 20 70 57 69 74 68 20 29 7b  Name && pWith ){
22050 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
22060 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74 68  for(i=0; i<pWith
22070 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCte; i++){.  
22080 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
22090 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 57  trICmp(zName, pW
220a0 69 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ith->a[i].zName)
220b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
220c0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
220d0 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74  Parse, "duplicat
220e0 65 20 57 49 54 48 20 74 61 62 6c 65 20 6e 61 6d  e WITH table nam
220f0 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
22100 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22110 7d 0a 0a 20 20 69 66 28 20 70 57 69 74 68 20 29  }..  if( pWith )
22120 7b 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65 20  {.    i64 nByte 
22130 3d 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29  = sizeof(*pWith)
22140 20 2b 20 28 73 69 7a 65 6f 66 28 70 57 69 74 68   + (sizeof(pWith
22150 2d 3e 61 5b 31 5d 29 2a 28 69 36 34 29 70 57 69  ->a[1])*(i64)pWi
22160 74 68 2d 3e 6e 43 74 65 29 3b 0a 20 20 20 20 70  th->nCte);.    p
22170 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
22180 65 61 6c 6c 6f 63 28 64 62 2c 20 70 57 69 74 68  ealloc(db, pWith
22190 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
221a0 65 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  e{.    pNew = sq
221b0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
221c0 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 57  o(db, sizeof(*pW
221d0 69 74 68 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ith));.  }.  ass
221e0 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20 7c 7c  ert( zName!=0 ||
221f0 20 70 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 61 73   pNew==0 );.  as
22200 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
22210 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 4e 65  Failed==0 || pNe
22220 77 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  w==0 );..  if( p
22230 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
22240 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
22250 65 74 65 28 64 62 2c 20 70 41 72 67 6c 69 73 74  ete(db, pArglist
22260 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
22270 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
22280 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69  Query);.    sqli
22290 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
222a0 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d  ame);.    pNew =
222b0 20 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73 65 7b   pWith;.  }else{
222c0 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65  .    pNew->a[pNe
222d0 77 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65 63 74  w->nCte].pSelect
222e0 20 3d 20 70 51 75 65 72 79 3b 0a 20 20 20 20 70   = pQuery;.    p
222f0 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74  New->a[pNew->nCt
22300 65 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72 67 6c  e].pCols = pArgl
22310 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ist;.    pNew->a
22320 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e 61  [pNew->nCte].zNa
22330 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
22340 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43  pNew->a[pNew->nC
22350 74 65 5d 2e 7a 45 72 72 20 3d 20 30 3b 0a 20 20  te].zErr = 0;.  
22360 20 20 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b 3b 0a    pNew->nCte++;.
22370 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4e    }..  return pN
22380 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  ew;.}../*.** Fre
22390 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
223a0 66 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63  f the With objec
223b0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
223c0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
223d0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
223e0 57 69 74 68 44 65 6c 65 74 65 28 73 71 6c 69 74  WithDelete(sqlit
223f0 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 57  e3 *db, With *pW
22400 69 74 68 29 7b 0a 20 20 69 66 28 20 70 57 69 74  ith){.  if( pWit
22410 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  h ){.    int i;.
22420 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
22430 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29  With->nCte; i++)
22440 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 43  {.      struct C
22450 74 65 20 2a 70 43 74 65 20 3d 20 26 70 57 69 74  te *pCte = &pWit
22460 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73  h->a[i];.      s
22470 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
22480 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70  lete(db, pCte->p
22490 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71 6c  Cols);.      sql
224a0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
224b0 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65  (db, pCte->pSele
224c0 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ct);.      sqlit
224d0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 74  e3DbFree(db, pCt
224e0 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e->zName);.    }
224f0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
22500 65 65 28 64 62 2c 20 70 57 69 74 68 29 3b 0a 20  ee(db, pWith);. 
22510 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
22520 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
22530 4d 49 54 5f 43 54 45 29 20 2a 2f 0a              MIT_CTE) */.