/ Hex Artifact Content
Login

Artifact 794cb0534e7d150b41708c14043f8a67c0a9bea6:


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 52  .#endif../*.** R
0d90: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
0da0: 65 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20  e given yDbMask 
0db0: 6f 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20  object is empty 
0dc0: 2d 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73  - if it contains
0dd0: 20 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20   no.** 1 bits.  
0de0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0df0: 75 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61  used by the DbMa
0e00: 73 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20  skAllZero() and 
0e10: 44 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a  DbMaskNotZero().
0e20: 2a 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53  ** macros when S
0e30: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
0e40: 45 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ED is greater th
0e50: 61 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51  an 30..*/.#if SQ
0e60: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0e70: 44 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33  D>30.int sqlite3
0e80: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44  DbMaskAllZero(yD
0e90: 62 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20  bMask m){.  int 
0ea0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
0eb0: 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b  sizeof(yDbMask);
0ec0: 20 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29   i++) if( m[i] )
0ed0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
0ee0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
0ef0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
0f00: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
0f10: 74 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c  ter a single SQL
0f20: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
0f30: 65 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e  een.** parsed an
0f40: 64 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d  d a VDBE program
0f50: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74   to execute that
0f60: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
0f70: 65 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e  een.** prepared.
0f80: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70    This routine p
0f90: 75 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e  uts the finishin
0fa0: 67 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65  g touches on the
0fb0: 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d  .** VDBE program
0fc0: 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20   and resets the 
0fd0: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
0fe0: 20 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a   for the next.**
0ff0: 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   parse..**.** No
1000: 74 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72  te that if an er
1010: 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74  ror occurred, it
1020: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
1030: 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44  se that.** no VD
1040: 42 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65  BE code was gene
1050: 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rated..*/.void s
1060: 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69  qlite3FinishCodi
1070: 6e 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ng(Parse *pParse
1080: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1090: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
10a0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
10b0: 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a  pToplevel==0 );.
10c0: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
10d0: 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  b;.  if( pParse-
10e0: 3e 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e  >nested ) return
10f0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
1100: 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
1110: 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
1120: 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d  if( pParse->rc==
1130: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72  SQLITE_OK ) pPar
1140: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
1150: 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72  ERROR;.    retur
1160: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67  n;.  }..  /* Beg
1170: 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67  in by generating
1180: 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f   some terminatio
1190: 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e  n code at the en
11a0: 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64  d of the.  ** vd
11b0: 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a  be program.  */.
11c0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
11d0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
11e0: 61 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d  assert( !pParse-
11f0: 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20  >isMultiWrite . 
1200: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
1210: 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f  VdbeAssertMayAbo
1220: 72 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61  rt(v, pParse->ma
1230: 79 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20  yAbort));.  if( 
1240: 76 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  v ){.    while( 
1250: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
1260: 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 76 2c 20  ePriorOpcode(v, 
1270: 4f 50 5f 43 6c 6f 73 65 29 20 29 7b 7d 0a 20 20  OP_Close) ){}.  
1280: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1290: 4f 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b  Op0(v, OP_Halt);
12a0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  ..#if SQLITE_USE
12b0: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
12c0: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
12d0: 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3e 30 20 26 26  >nTableLock>0 &&
12e0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
12f0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1300: 65 33 55 73 65 72 41 75 74 68 49 6e 69 74 28 64  e3UserAuthInit(d
1310: 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  b);.      if( db
1320: 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c  ->auth.authLevel
1330: 3c 55 41 55 54 48 5f 55 73 65 72 20 29 7b 0a 20  <UAUTH_User ){. 
1340: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72         pParse->r
1350: 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48 5f  c = SQLITE_AUTH_
1360: 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 73 71  USER;.        sq
1370: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1380: 61 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20  arse, "user not 
1390: 61 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b  authenticated");
13a0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
13b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
13c0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68  endif..    /* Th
13d0: 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63 6f  e cookie mask co
13e0: 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69 74 20 66  ntains one bit f
13f0: 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65  or each database
1400: 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20 20   file open..    
1410: 2a 2a 20 28 42 69 74 20 30 20 69 73 20 66 6f 72  ** (Bit 0 is for
1420: 20 6d 61 69 6e 2c 20 62 69 74 20 31 20 69 73 20   main, bit 1 is 
1430: 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64 20 73 6f  for temp, and so
1440: 20 66 6f 72 74 68 2e 29 20 20 42 69 74 73 20 61   forth.)  Bits a
1450: 72 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 66 6f  re.    ** set fo
1460: 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  r each database 
1470: 74 68 61 74 20 69 73 20 75 73 65 64 2e 20 20 47  that is used.  G
1480: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1490: 73 74 61 72 74 20 61 0a 20 20 20 20 2a 2a 20 74  start a.    ** t
14a0: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65 61  ransaction on ea
14b0: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
14c0: 20 61 6e 64 20 74 6f 20 76 65 72 69 66 79 20 74   and to verify t
14d0: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
14e0: 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68 20  .    ** on each 
14f0: 75 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20  used database.. 
1500: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62     */.    if( db
1510: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
1520: 30 20 0a 20 20 20 20 20 26 26 20 28 44 62 4d 61  0 .     && (DbMa
1530: 73 6b 4e 6f 6e 5a 65 72 6f 28 70 50 61 72 73 65  skNonZero(pParse
1540: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 20 7c 7c  ->cookieMask) ||
1550: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1560: 78 70 72 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  xpr).    ){.    
1570: 20 20 69 6e 74 20 69 44 62 2c 20 69 3b 0a 20 20    int iDb, i;.  
1580: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
1590: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
15a0: 30 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  0)->opcode==OP_I
15b0: 6e 69 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  nit );.      sql
15c0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
15d0: 28 76 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f  (v, 0);.      fo
15e0: 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d  r(iDb=0; iDb<db-
15f0: 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20  >nDb; iDb++){.  
1600: 20 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b        if( DbMask
1610: 54 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f  Test(pParse->coo
1620: 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30  kieMask, iDb)==0
1630: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1640: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1650: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
1660: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1670: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
1680: 76 2c 0a 20 20 20 20 20 20 20 20 20 20 4f 50 5f  v,.          OP_
1690: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20  Transaction,    
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  /* Opcode */.   
16c0: 20 20 20 20 20 20 20 69 44 62 2c 20 20 20 20 20         iDb,     
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20            /* P1 
16f0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 44 62 4d  */.          DbM
1700: 61 73 6b 54 65 73 74 28 70 50 61 72 73 65 2d 3e  askTest(pParse->
1710: 77 72 69 74 65 4d 61 73 6b 2c 69 44 62 29 2c 20  writeMask,iDb), 
1720: 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 20 20 20  /* P2 */.       
1730: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
1740: 65 56 61 6c 75 65 5b 69 44 62 5d 2c 20 20 20 20  eValue[iDb],    
1750: 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20        /* P3 */. 
1760: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62           db->aDb
1770: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69  [iDb].pSchema->i
1780: 47 65 6e 65 72 61 74 69 6f 6e 20 20 2f 2a 20 50  Generation  /* P
1790: 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 3b 0a  4 */.        );.
17a0: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
17b0: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 20 73  init.busy==0 ) s
17c0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
17d0: 50 35 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20  P5(v, 1);.      
17e0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
17f0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1800: 4c 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  LE.      for(i=0
1810: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61  ; i<pParse->nVta
1820: 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  bLock; i++){.   
1830: 20 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20       char *vtab 
1840: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
1850: 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
1860: 50 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63  Parse->apVtabLoc
1870: 6b 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73  k[i]);.        s
1880: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1890: 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30  (v, OP_VBegin, 0
18a0: 2c 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34  , 0, 0, vtab, P4
18b0: 5f 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a  _VTAB);.      }.
18c0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
18d0: 74 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e  tabLock = 0;.#en
18e0: 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  dif..      /* On
18f0: 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69  ce all the cooki
1900: 65 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72  es have been ver
1910: 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61  ified and transa
1920: 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a  ctions opened, .
1930: 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20        ** obtain 
1940: 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62  the required tab
1950: 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69  le-locks. This i
1960: 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
1970: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73   the .      ** s
1980: 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74  hared-cache feat
1990: 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  ure is enabled..
19a0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
19b0: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50  odeTableLocks(pP
19c0: 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  arse);..      /*
19d0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20   Initialize any 
19e0: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61  AUTOINCREMENT da
19f0: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65  ta structures re
1a00: 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  quired..      */
1a10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75  .      sqlite3Au
1a20: 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e  toincrementBegin
1a30: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20  (pParse);..     
1a40: 20 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e   /* Code constan
1a50: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  t expressions th
1a60: 61 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65  at where factore
1a70: 64 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c  d out of inner l
1a80: 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  oops */.      if
1a90: 28 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74  ( pParse->pConst
1aa0: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
1ab0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20  ExprList *pEL = 
1ac0: 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
1ad0: 70 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  pr;.        pPar
1ae0: 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
1af0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  r = 0;.        f
1b00: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e  or(i=0; i<pEL->n
1b10: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1b20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b30: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
1b40: 4c 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  L->a[i].pExpr, p
1b50: 45 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73  EL->a[i].u.iCons
1b60: 74 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20  tExprReg);.     
1b70: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
1b80: 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20      /* Finally, 
1b90: 6a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65  jump back to the
1ba0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
1bb0: 65 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64  e executable cod
1bc0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  e. */.      sqli
1bd0: 74 65 33 56 64 62 65 41 64 64 47 6f 74 6f 28 76  te3VdbeAddGoto(v
1be0: 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 1);.    }.  }.
1bf0: 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 56  ..  /* Get the V
1c00: 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65 61 64  DBE program read
1c10: 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 0a  y for execution.
1c20: 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26 20    */.  if( v && 
1c30: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
1c40: 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
1c50: 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65  iled ){.    asse
1c60: 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63  rt( pParse->iCac
1c70: 68 65 4c 65 76 65 6c 3d 3d 30 20 29 3b 20 20 2f  heLevel==0 );  /
1c80: 2a 20 44 69 73 61 62 6c 65 73 20 61 6e 64 20 72  * Disables and r
1c90: 65 2d 65 6e 61 62 6c 65 73 20 6d 61 74 63 68 20  e-enables match 
1ca0: 2a 2f 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e 69  */.    /* A mini
1cb0: 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73 6f  mum of one curso
1cc0: 72 20 69 73 20 72 65 71 75 69 72 65 64 20 69 66  r is required if
1cd0: 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 69   autoincrement i
1ce0: 73 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53 65  s used.    *  Se
1cf0: 65 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33 37  e ticket [a69637
1d00: 39 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20 20  9c1f08866] */.  
1d10: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 41    if( pParse->pA
1d20: 69 6e 63 21 3d 30 20 26 26 20 70 50 61 72 73 65  inc!=0 && pParse
1d30: 2d 3e 6e 54 61 62 3d 3d 30 20 29 20 70 50 61 72  ->nTab==0 ) pPar
1d40: 73 65 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20  se->nTab = 1;.  
1d50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b    sqlite3VdbeMak
1d60: 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73 65  eReady(v, pParse
1d70: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  );.    pParse->r
1d80: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
1d90: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c  .    pParse->col
1da0: 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20  NamesSet = 0;.  
1db0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73  }else{.    pPars
1dc0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
1dd0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72  RROR;.  }.  pPar
1de0: 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20  se->nTab = 0;.  
1df0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30  pParse->nMem = 0
1e00: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74  ;.  pParse->nSet
1e10: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
1e20: 6e 56 61 72 20 3d 20 30 3b 0a 20 20 44 62 4d 61  nVar = 0;.  DbMa
1e30: 73 6b 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 63  skZero(pParse->c
1e40: 6f 6f 6b 69 65 4d 61 73 6b 29 3b 0a 7d 0a 0a 2f  ookieMask);.}../
1e50: 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70 61 72  *.** Run the par
1e60: 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ser and code gen
1e70: 65 72 61 74 6f 72 20 72 65 63 75 72 73 69 76 65  erator recursive
1e80: 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ly in order to g
1e90: 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20  enerate.** code 
1ea0: 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74 61 74  for the SQL stat
1eb0: 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f  ement given onto
1ec0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1ed0: 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a  pParse context.*
1ee0: 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  * currently unde
1ef0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
1f00: 20 57 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   When the parser
1f10: 20 69 73 20 72 75 6e 20 72 65 63 75 72 73 69 76   is run recursiv
1f20: 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c  ely.** this way,
1f30: 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61   the final OP_Ha
1f40: 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65 6e 64  lt is not append
1f50: 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69 6e 69  ed and other ini
1f60: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61  tialization.** a
1f70: 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  nd finalization 
1f80: 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74 74 65  steps are omitte
1f90: 64 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20  d because those 
1fa0: 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62 79 20  are handling by 
1fb0: 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74  the.** outermost
1fc0: 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e   parser..**.** N
1fd0: 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  ot everything is
1fe0: 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68 69 73   nestable.  This
1ff0: 20 66 61 63 69 6c 69 74 79 20 69 73 20 64 65 73   facility is des
2000: 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69 74 0a  igned to permit.
2010: 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  ** INSERT, UPDAT
2020: 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 6f 70  E, and DELETE op
2030: 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e 73 74  erations against
2040: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20   SQLITE_MASTER. 
2050: 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69 66 20   Use.** care if 
2060: 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20 74 72  you decide to tr
2070: 79 20 74 6f 20 75 73 65 20 74 68 69 73 20 72 6f  y to use this ro
2080: 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f  utine for some o
2090: 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a  ther purposes..*
20a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4e 65  /.void sqlite3Ne
20b0: 73 74 65 64 50 61 72 73 65 28 50 61 72 73 65 20  stedParse(Parse 
20c0: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
20d0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
20e0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
20f0: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
2100: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
2110: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
2120: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2130: 0a 23 20 64 65 66 69 6e 65 20 53 41 56 45 5f 53  .# define SAVE_S
2140: 5a 20 20 28 73 69 7a 65 6f 66 28 50 61 72 73 65  Z  (sizeof(Parse
2150: 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 50 61 72  ) - offsetof(Par
2160: 73 65 2c 6e 56 61 72 29 29 0a 20 20 63 68 61 72  se,nVar)).  char
2170: 20 73 61 76 65 42 75 66 5b 53 41 56 45 5f 53 5a   saveBuf[SAVE_SZ
2180: 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  ];..  if( pParse
2190: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
21a0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
21b0: 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20  e->nested<10 ); 
21c0: 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75   /* Nesting shou
21d0: 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69  ld only be of li
21e0: 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20  mited depth */. 
21f0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
2200: 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d  ormat);.  zSql =
2210: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
2220: 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  (db, zFormat, ap
2230: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
2240: 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
2250: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20  {.    return;   
2260: 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74  /* A malloc must
2270: 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
2280: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65    }.  pParse->ne
2290: 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79  sted++;.  memcpy
22a0: 28 73 61 76 65 42 75 66 2c 20 26 70 50 61 72 73  (saveBuf, &pPars
22b0: 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f 53 5a  e->nVar, SAVE_SZ
22c0: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61  );.  memset(&pPa
22d0: 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20 53 41  rse->nVar, 0, SA
22e0: 56 45 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65  VE_SZ);.  sqlite
22f0: 33 52 75 6e 50 61 72 73 65 72 28 70 50 61 72 73  3RunParser(pPars
2300: 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72 4d 73  e, zSql, &zErrMs
2310: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
2320: 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
2330: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2340: 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d  e(db, zSql);.  m
2350: 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d 3e 6e  emcpy(&pParse->n
2360: 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20 53 41  Var, saveBuf, SA
2370: 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65  VE_SZ);.  pParse
2380: 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 23  ->nested--;.}..#
2390: 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
23a0: 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a  UTHENTICATION./*
23b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
23c0: 69 66 20 7a 54 61 62 6c 65 20 69 73 20 74 68 65  if zTable is the
23d0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73   name of the sys
23e0: 74 65 6d 20 74 61 62 6c 65 20 74 68 61 74 20 73  tem table that s
23f0: 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6c 69 73  tores the.** lis
2400: 74 20 6f 66 20 75 73 65 72 73 20 61 6e 64 20 74  t of users and t
2410: 68 65 69 72 20 61 63 63 65 73 73 20 63 72 65 64  heir access cred
2420: 65 6e 74 69 61 6c 73 2e 0a 2a 2f 0a 69 6e 74 20  entials..*/.int 
2430: 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54  sqlite3UserAuthT
2440: 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20  able(const char 
2450: 2a 7a 54 61 62 6c 65 29 7b 0a 20 20 72 65 74 75  *zTable){.  retu
2460: 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  rn sqlite3_stric
2470: 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69  mp(zTable, "sqli
2480: 74 65 5f 75 73 65 72 22 29 3d 3d 30 3b 0a 7d 0a  te_user")==0;.}.
2490: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  #endif../*.** Lo
24a0: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
24b0: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
24c0: 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61  t describes a pa
24d0: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
24e0: 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e  e.** table given
24f0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
2500: 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74  t table and (opt
2510: 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d  ionally) the nam
2520: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
2530: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
2540: 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
2550: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
2560: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
2570: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
2580: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
2590: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
25a0: 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a  e table and the.
25b0: 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  ** first matchin
25c0: 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72  g table is retur
25d0: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
25e0: 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  ng for duplicate
25f0: 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20   table.** names 
2600: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
2610: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20 54  earch order is T
2620: 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20  EMP first, then 
2630: 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a  MAIN, then any.*
2640: 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  * auxiliary data
2650: 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69 6e  bases added usin
2660: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d  g the ATTACH com
2670: 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  mand..**.** See 
2680: 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61  also sqlite3Loca
2690: 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61  teTable()..*/.Ta
26a0: 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  ble *sqlite3Find
26b0: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
26c0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
26d0: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
26e0: 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20   *zDatabase){.  
26f0: 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20  Table *p = 0;.  
2700: 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  int i;..  /* All
2710: 20 6d 75 74 65 78 65 73 20 61 72 65 20 72 65 71   mutexes are req
2720: 75 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61  uired for schema
2730: 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73   access.  Make s
2740: 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d  ure we hold them
2750: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a  . */.  assert( z
2760: 44 61 74 61 62 61 73 65 21 3d 30 20 7c 7c 20 73  Database!=0 || s
2770: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
2780: 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29  AllMutexes(db) )
2790: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  ;.#if SQLITE_USE
27a0: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
27b0: 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 61  .  /* Only the a
27c0: 64 6d 69 6e 20 75 73 65 72 20 69 73 20 61 6c 6c  dmin user is all
27d0: 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20 74 68 61  owed to know tha
27e0: 74 20 74 68 65 20 73 71 6c 69 74 65 5f 75 73 65  t the sqlite_use
27f0: 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 65 78 69  r table.  ** exi
2800: 73 74 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  sts */.  if( db-
2810: 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c 3c  >auth.authLevel<
2820: 55 41 55 54 48 5f 41 64 6d 69 6e 20 26 26 20 73  UAUTH_Admin && s
2830: 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54 61  qlite3UserAuthTa
2840: 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  ble(zName)!=0 ){
2850: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2860: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28   }.#endif.  for(
2870: 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69  i=OMIT_TEMPDB; i
2880: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
2890: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
28a0: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f  ) ? i^1 : i;   /
28b0: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
28c0: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
28d0: 20 69 66 28 20 7a 44 61 74 61 62 61 73 65 21 3d   if( zDatabase!=
28e0: 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  0 && sqlite3StrI
28f0: 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64  Cmp(zDatabase, d
2900: 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29  b->aDb[j].zName)
2910: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2920: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2930: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
2940: 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20  db, j, 0) );.   
2950: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
2960: 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d  Find(&db->aDb[j]
2970: 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  .pSchema->tblHas
2980: 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  h, zName);.    i
2990: 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20  f( p ) break;.  
29a0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
29b0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
29c0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
29d0: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
29e0: 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61  ibes a particula
29f0: 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61  r database.** ta
2a00: 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61  ble given the na
2a10: 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65  me of that table
2a20: 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79   and (optionally
2a30: 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  ) the name of th
2a40: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  e.** database co
2a50: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
2a60: 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  le.  Return NULL
2a70: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20   if not found.  
2a80: 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a  Also leave an.**
2a90: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
2aa0: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
2ab0: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  g..**.** The dif
2ac0: 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
2ad0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64  this routine and
2ae0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
2af0: 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73  e() is that this
2b00: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61 76  .** routine leav
2b10: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
2b20: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
2b30: 45 72 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20  ErrMsg where.** 
2b40: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
2b50: 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a  () does not..*/.
2b60: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f  Table *sqlite3Lo
2b70: 63 61 74 65 54 61 62 6c 65 28 0a 20 20 50 61 72  cateTable(.  Par
2b80: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2b90: 20 20 20 20 2f 2a 20 63 6f 6e 74 65 78 74 20 69      /* context i
2ba0: 6e 20 77 68 69 63 68 20 74 6f 20 72 65 70 6f 72  n which to repor
2bb0: 74 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  t errors */.  in
2bc0: 74 20 69 73 56 69 65 77 2c 20 20 20 20 20 20 20  t isView,       
2bd0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2be0: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 56 49  looking for a VI
2bf0: 45 57 20 72 61 74 68 65 72 20 74 68 61 6e 20 61  EW rather than a
2c00: 20 54 41 42 4c 45 20 2a 2f 0a 20 20 63 6f 6e 73   TABLE */.  cons
2c10: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
2c20: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2c30: 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 6c  e table we are l
2c40: 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  ooking for */.  
2c50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61  const char *zDba
2c60: 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  se     /* Name o
2c70: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
2c80: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
2c90: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
2ca0: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
2cb0: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
2cc0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2cd0: 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
2ce0: 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
2cf0: 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61   and code in pPa
2d00: 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  rse and return N
2d10: 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51  ULL. */.  if( SQ
2d20: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
2d30: 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
2d40: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
2d50: 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73   0;.  }..  p = s
2d60: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2d70: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d  pParse->db, zNam
2d80: 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 69 66  e, zDbase);.  if
2d90: 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f  ( p==0 ){.    co
2da0: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d  nst char *zMsg =
2db0: 20 69 73 56 69 65 77 20 3f 20 22 6e 6f 20 73 75   isView ? "no su
2dc0: 63 68 20 76 69 65 77 22 20 3a 20 22 6e 6f 20 73  ch view" : "no s
2dd0: 75 63 68 20 74 61 62 6c 65 22 3b 0a 23 69 66 6e  uch table";.#ifn
2de0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2df0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
2e00: 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20   /* If zName is 
2e10: 74 68 65 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65  the not the name
2e20: 20 6f 66 20 61 20 74 61 62 6c 65 20 69 6e 20 74   of a table in t
2e30: 68 65 20 73 63 68 65 6d 61 20 63 72 65 61 74 65  he schema create
2e40: 64 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 43  d using.    ** C
2e50: 52 45 41 54 45 2c 20 74 68 65 6e 20 63 68 65 63  REATE, then chec
2e60: 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 69  k to see if it i
2e70: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  s the name of an
2e80: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
2e90: 68 61 74 0a 20 20 20 20 2a 2a 20 63 61 6e 20 62  hat.    ** can b
2ea0: 65 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76  e an eponymous v
2eb0: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 2a 2f  irtual table. */
2ec0: 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f  .    Module *pMo
2ed0: 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29 73 71 6c  d = (Module*)sql
2ee0: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 50  ite3HashFind(&pP
2ef0: 61 72 73 65 2d 3e 64 62 2d 3e 61 4d 6f 64 75 6c  arse->db->aModul
2f00: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  e, zName);.    i
2f10: 66 28 20 70 4d 6f 64 20 26 26 20 73 71 6c 69 74  f( pMod && sqlit
2f20: 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54  e3VtabEponymousT
2f30: 61 62 6c 65 49 6e 69 74 28 70 50 61 72 73 65 2c  ableInit(pParse,
2f40: 20 70 4d 6f 64 29 20 29 7b 0a 20 20 20 20 20 20   pMod) ){.      
2f50: 72 65 74 75 72 6e 20 70 4d 6f 64 2d 3e 70 45 70  return pMod->pEp
2f60: 6f 54 61 62 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  oTab;.    }.#end
2f70: 69 66 0a 20 20 20 20 69 66 28 20 7a 44 62 61 73  if.    if( zDbas
2f80: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
2f90: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2fa0: 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c 20  e, "%s: %s.%s", 
2fb0: 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e  zMsg, zDbase, zN
2fc0: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
2fd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
2fe0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2ff0: 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20 7a  %s: %s", zMsg, z
3000: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
3010: 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
3020: 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 23 69  hema = 1;.  }.#i
3030: 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55  f SQLITE_USER_AU
3040: 54 48 45 4e 49 43 41 54 49 4f 4e 0a 20 20 65 6c  THENICATION.  el
3050: 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  se if( pParse->d
3060: 62 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65  b->auth.authLeve
3070: 6c 3c 55 41 55 54 48 5f 55 73 65 72 20 29 7b 0a  l<UAUTH_User ){.
3080: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
3090: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65  Msg(pParse, "use
30a0: 72 20 6e 6f 74 20 61 75 74 68 65 6e 74 69 63 61  r not authentica
30b0: 74 65 64 22 29 3b 0a 20 20 20 20 70 20 3d 20 30  ted");.    p = 0
30c0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
30d0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
30e0: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62  * Locate the tab
30f0: 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  le identified by
3100: 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   *p..**.** This 
3110: 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
3120: 75 6e 64 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  und sqlite3Locat
3130: 65 54 61 62 6c 65 28 29 2e 20 54 68 65 20 64 69  eTable(). The di
3140: 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
3150: 0a 2a 2a 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  .** sqlite3Locat
3160: 65 54 61 62 6c 65 28 29 20 61 6e 64 20 74 68 69  eTable() and thi
3170: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68  s function is th
3180: 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  at this function
3190: 20 72 65 73 74 72 69 63 74 73 0a 2a 2a 20 74 68   restricts.** th
31a0: 65 20 73 65 61 72 63 68 20 74 6f 20 73 63 68 65  e search to sche
31b0: 6d 61 20 28 70 2d 3e 70 53 63 68 65 6d 61 29 20  ma (p->pSchema) 
31c0: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  if it is not NUL
31d0: 4c 2e 20 70 2d 3e 70 53 63 68 65 6d 61 20 6d 61  L. p->pSchema ma
31e0: 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c  y be.** non-NULL
31f0: 20 69 66 20 69 74 20 69 73 20 70 61 72 74 20 6f   if it is part o
3200: 66 20 61 20 76 69 65 77 20 6f 72 20 74 72 69 67  f a view or trig
3210: 67 65 72 20 70 72 6f 67 72 61 6d 20 64 65 66 69  ger program defi
3220: 6e 69 74 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73  nition. See.** s
3230: 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
3240: 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  () for details..
3250: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
3260: 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d  3LocateTableItem
3270: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
3280: 65 2c 20 0a 20 20 69 6e 74 20 69 73 56 69 65 77  e, .  int isView
3290: 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  , .  struct SrcL
32a0: 69 73 74 5f 69 74 65 6d 20 2a 70 0a 29 7b 0a 20  ist_item *p.){. 
32b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
32c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
32d0: 53 63 68 65 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e  Schema==0 || p->
32e0: 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 29 3b 0a  zDatabase==0 );.
32f0: 20 20 69 66 28 20 70 2d 3e 70 53 63 68 65 6d 61    if( p->pSchema
3300: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 20   ){.    int iDb 
3310: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
3320: 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
3330: 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  b, p->pSchema);.
3340: 20 20 20 20 7a 44 62 20 3d 20 70 50 61 72 73 65      zDb = pParse
3350: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
3360: 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Name;.  }else{. 
3370: 20 20 20 7a 44 62 20 3d 20 70 2d 3e 7a 44 61 74     zDb = p->zDat
3380: 61 62 61 73 65 3b 0a 20 20 7d 0a 20 20 72 65 74  abase;.  }.  ret
3390: 75 72 6e 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  urn sqlite3Locat
33a0: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  eTable(pParse, i
33b0: 73 56 69 65 77 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  sView, p->zName,
33c0: 20 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   zDb);.}../*.** 
33d0: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
33e0: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
33f0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a  hat describes .*
3400: 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  * a particular i
3410: 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e  ndex given the n
3420: 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65  ame of that inde
3430: 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d  x.** and the nam
3440: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
3450: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
3460: 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65  the index..** Re
3470: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
3480: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
3490: 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c   zDatabase is 0,
34a0: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61   all databases a
34b0: 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  re searched for 
34c0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64  the.** table and
34d0: 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
34e0: 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65 74  ing index is ret
34f0: 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63  urned.  (No chec
3500: 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c  king.** for dupl
3510: 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65  icate index name
3520: 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65  s is done.)  The
3530: 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73   search order is
3540: 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20  .** TEMP first, 
3550: 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20  then MAIN, then 
3560: 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61  any auxiliary da
3570: 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a  tabases added.**
3580: 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43   using the ATTAC
3590: 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e  H command..*/.In
35a0: 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  dex *sqlite3Find
35b0: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
35c0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
35d0: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
35e0: 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20   *zDb){.  Index 
35f0: 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  *p = 0;.  int i;
3600: 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78 65  .  /* All mutexe
3610: 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20 66  s are required f
3620: 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65 73 73  or schema access
3630: 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  .  Make sure we 
3640: 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20 20  hold them. */.  
3650: 61 73 73 65 72 74 28 20 7a 44 62 21 3d 30 20 7c  assert( zDb!=0 |
3660: 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  | sqlite3BtreeHo
3670: 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62  ldsAllMutexes(db
3680: 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49  ) );.  for(i=OMI
3690: 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e  T_TEMPDB; i<db->
36a0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
36b0: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
36c0: 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72  ^1 : i;  /* Sear
36d0: 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d  ch TEMP before M
36e0: 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d  AIN */.    Schem
36f0: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  a *pSchema = db-
3700: 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b  >aDb[j].pSchema;
3710: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 63  .    assert( pSc
3720: 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20  hema );.    if( 
3730: 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33 53 74  zDb && sqlite3St
3740: 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61  rICmp(zDb, db->a
3750: 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63  Db[j].zName) ) c
3760: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
3770: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
3780: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
3790: 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20 3d  j, 0) );.    p =
37a0: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
37b0: 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  (&pSchema->idxHa
37c0: 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  sh, zName);.    
37d0: 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20  if( p ) break;. 
37e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
37f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20  ../*.** Reclaim 
3800: 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  the memory used 
3810: 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73  by an index.*/.s
3820: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 49  tatic void freeI
3830: 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62  ndex(sqlite3 *db
3840: 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 23 69 66  , Index *p){.#if
3850: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3860: 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71 6c 69 74  _ANALYZE.  sqlit
3870: 65 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61 6d  e3DeleteIndexSam
3880: 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a 23 65 6e  ples(db, p);.#en
3890: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45 78 70  dif.  sqlite3Exp
38a0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
38b0: 50 61 72 74 49 64 78 57 68 65 72 65 29 3b 0a 20  PartIdxWhere);. 
38c0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
38d0: 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  b, p->zColAff);.
38e0: 20 20 69 66 28 20 70 2d 3e 69 73 52 65 73 69 7a    if( p->isResiz
38f0: 65 64 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ed ) sqlite3DbFr
3900: 65 65 28 64 62 2c 20 70 2d 3e 61 7a 43 6f 6c 6c  ee(db, p->azColl
3910: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
3920: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
3930: 5f 53 54 41 54 34 0a 20 20 73 71 6c 69 74 65 33  _STAT4.  sqlite3
3940: 5f 66 72 65 65 28 70 2d 3e 61 69 52 6f 77 45 73  _free(p->aiRowEs
3950: 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  t);.#endif.  sql
3960: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3970: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  );.}../*.** For 
3980: 74 68 65 20 69 6e 64 65 78 20 63 61 6c 6c 65 64  the index called
3990: 20 7a 49 64 78 4e 61 6d 65 20 77 68 69 63 68 20   zIdxName which 
39a0: 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  is found in the 
39b0: 64 61 74 61 62 61 73 65 20 69 44 62 2c 0a 2a 2a  database iDb,.**
39c0: 20 75 6e 6c 69 6b 65 20 74 68 61 74 20 69 6e 64   unlike that ind
39d0: 65 78 20 66 72 6f 6d 20 69 74 73 20 54 61 62 6c  ex from its Tabl
39e0: 65 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68  e then remove th
39f0: 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a 20  e index from.** 
3a00: 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74  the index hash t
3a10: 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20 61 6c  able and free al
3a20: 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  l memory structu
3a30: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  res associated.*
3a40: 2a 20 77 69 74 68 20 74 68 65 20 69 6e 64 65 78  * with the index
3a50: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3a60: 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
3a70: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
3a80: 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73  b, int iDb, cons
3a90: 74 20 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65  t char *zIdxName
3aa0: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
3ab0: 65 78 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73  ex;.  Hash *pHas
3ac0: 68 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  h;..  assert( sq
3ad0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
3ae0: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
3af0: 20 29 3b 0a 20 20 70 48 61 73 68 20 3d 20 26 64   );.  pHash = &d
3b00: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
3b10: 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20  ema->idxHash;.  
3b20: 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
3b30: 48 61 73 68 49 6e 73 65 72 74 28 70 48 61 73 68  HashInsert(pHash
3b40: 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 30 29 3b 0a  , zIdxName, 0);.
3b50: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e    if( ALWAYS(pIn
3b60: 64 65 78 29 20 29 7b 0a 20 20 20 20 69 66 28 20  dex) ){.    if( 
3b70: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
3b80: 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29  pIndex==pIndex )
3b90: 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
3ba0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
3bb0: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
3bc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3bd0: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20   Index *p;.     
3be0: 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f   /* Justificatio
3bf0: 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3b 20 20  n of ALWAYS();  
3c00: 54 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62  The index must b
3c10: 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  e on the list of
3c20: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 65  .      ** indice
3c30: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 20 3d 20  s. */.      p = 
3c40: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
3c50: 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68  pIndex;.      wh
3c60: 69 6c 65 28 20 41 4c 57 41 59 53 28 70 29 20 26  ile( ALWAYS(p) &
3c70: 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64  & p->pNext!=pInd
3c80: 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  ex ){ p = p->pNe
3c90: 78 74 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  xt; }.      if( 
3ca0: 41 4c 57 41 59 53 28 70 20 26 26 20 70 2d 3e 70  ALWAYS(p && p->p
3cb0: 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29 20 29 7b  Next==pIndex) ){
3cc0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  .        p->pNex
3cd0: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
3ce0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
3cf0: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64  .    freeIndex(d
3d00: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
3d10: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
3d20: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
3d30: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  ges;.}../*.** Lo
3d40: 6f 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c  ok through the l
3d50: 69 73 74 20 6f 66 20 6f 70 65 6e 20 64 61 74 61  ist of open data
3d60: 62 61 73 65 20 66 69 6c 65 73 20 69 6e 20 64 62  base files in db
3d70: 2d 3e 61 44 62 5b 5d 20 61 6e 64 20 69 66 0a 2a  ->aDb[] and if.*
3d80: 2a 20 61 6e 79 20 68 61 76 65 20 62 65 65 6e 20  * any have been 
3d90: 63 6c 6f 73 65 64 2c 20 72 65 6d 6f 76 65 20 74  closed, remove t
3da0: 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 6c 69 73  hem from the lis
3db0: 74 2e 20 20 52 65 61 6c 6c 6f 63 61 74 65 20 74  t.  Reallocate t
3dc0: 68 65 0a 2a 2a 20 64 62 2d 3e 61 44 62 5b 5d 20  he.** db->aDb[] 
3dd0: 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 20 73  structure to a s
3de0: 6d 61 6c 6c 65 72 20 73 69 7a 65 2c 20 69 66 20  maller size, if 
3df0: 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  possible..**.** 
3e00: 45 6e 74 72 79 20 30 20 28 74 68 65 20 22 6d 61  Entry 0 (the "ma
3e10: 69 6e 22 20 64 61 74 61 62 61 73 65 29 20 61 6e  in" database) an
3e20: 64 20 65 6e 74 72 79 20 31 20 28 74 68 65 20 22  d entry 1 (the "
3e30: 74 65 6d 70 22 20 64 61 74 61 62 61 73 65 29 0a  temp" database).
3e40: 2a 2a 20 61 72 65 20 6e 65 76 65 72 20 63 61 6e  ** are never can
3e50: 64 69 64 61 74 65 73 20 66 6f 72 20 62 65 69 6e  didates for bein
3e60: 67 20 63 6f 6c 6c 61 70 73 65 64 2e 0a 2a 2f 0a  g collapsed..*/.
3e70: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 6c  void sqlite3Coll
3e80: 61 70 73 65 44 61 74 61 62 61 73 65 41 72 72 61  apseDatabaseArra
3e90: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  y(sqlite3 *db){.
3ea0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f    int i, j;.  fo
3eb0: 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e  r(i=j=2; i<db->n
3ec0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  Db; i++){.    st
3ed0: 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26  ruct Db *pDb = &
3ee0: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
3ef0: 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20  if( pDb->pBt==0 
3f00: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3f10: 44 62 46 72 65 65 28 64 62 2c 20 70 44 62 2d 3e  DbFree(db, pDb->
3f20: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44  zName);.      pD
3f30: 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  b->zName = 0;.  
3f40: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
3f50: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20    }.    if( j<i 
3f60: 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ){.      db->aDb
3f70: 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  [j] = db->aDb[i]
3f80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b  ;.    }.    j++;
3f90: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64  .  }.  memset(&d
3fa0: 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64  b->aDb[j], 0, (d
3fb0: 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66  b->nDb-j)*sizeof
3fc0: 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20  (db->aDb[j]));. 
3fd0: 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20   db->nDb = j;.  
3fe0: 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26  if( db->nDb<=2 &
3ff0: 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61  & db->aDb!=db->a
4000: 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20  DbStatic ){.    
4010: 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74  memcpy(db->aDbSt
4020: 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32  atic, db->aDb, 2
4030: 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b  *sizeof(db->aDb[
4040: 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  0]));.    sqlite
4050: 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e  3DbFree(db, db->
4060: 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44  aDb);.    db->aD
4070: 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69  b = db->aDbStati
4080: 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c;.  }.}../*.** 
4090: 52 65 73 65 74 20 74 68 65 20 73 63 68 65 6d 61  Reset the schema
40a0: 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
40b0: 65 20 61 74 20 69 6e 64 65 78 20 69 44 62 2e 20  e at index iDb. 
40c0: 20 41 6c 73 6f 20 72 65 73 65 74 20 74 68 65 0a   Also reset the.
40d0: 2a 2a 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 0a  ** TEMP schema..
40e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
40f0: 65 73 65 74 4f 6e 65 53 63 68 65 6d 61 28 73 71  esetOneSchema(sq
4100: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
4110: 44 62 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 0a  Db){.  Db *pDb;.
4120: 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62    assert( iDb<db
4130: 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 43  ->nDb );..  /* C
4140: 61 73 65 20 31 3a 20 20 52 65 73 65 74 20 74 68  ase 1:  Reset th
4150: 65 20 73 69 6e 67 6c 65 20 73 63 68 65 6d 61 20  e single schema 
4160: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 69 44  identified by iD
4170: 62 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62  b */.  pDb = &db
4180: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 61 73  ->aDb[iDb];.  as
4190: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
41a0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
41b0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 61 73   iDb, 0) );.  as
41c0: 73 65 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65  sert( pDb->pSche
41d0: 6d 61 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  ma!=0 );.  sqlit
41e0: 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44  e3SchemaClear(pD
41f0: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 20 20  b->pSchema);..  
4200: 2f 2a 20 49 66 20 61 6e 79 20 64 61 74 61 62 61  /* If any databa
4210: 73 65 20 6f 74 68 65 72 20 74 68 61 6e 20 54 45  se other than TE
4220: 4d 50 20 69 73 20 72 65 73 65 74 2c 20 74 68 65  MP is reset, the
4230: 6e 20 61 6c 73 6f 20 72 65 73 65 74 20 54 45 4d  n also reset TEM
4240: 50 0a 20 20 2a 2a 20 73 69 6e 63 65 20 54 45 4d  P.  ** since TEM
4250: 50 20 6d 69 67 68 74 20 62 65 20 68 6f 6c 64 69  P might be holdi
4260: 6e 67 20 74 72 69 67 67 65 72 73 20 74 68 61 74  ng triggers that
4270: 20 72 65 66 65 72 65 6e 63 65 20 74 61 62 6c 65   reference table
4280: 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74  s in the.  ** ot
4290: 68 65 72 20 64 61 74 61 62 61 73 65 2e 0a 20 20  her database..  
42a0: 2a 2f 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20  */.  if( iDb!=1 
42b0: 29 7b 0a 20 20 20 20 70 44 62 20 3d 20 26 64 62  ){.    pDb = &db
42c0: 2d 3e 61 44 62 5b 31 5d 3b 0a 20 20 20 20 61 73  ->aDb[1];.    as
42d0: 73 65 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65  sert( pDb->pSche
42e0: 6d 61 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  ma!=0 );.    sql
42f0: 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28  ite3SchemaClear(
4300: 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pDb->pSchema);. 
4310: 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a   }.  return;.}..
4320: 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20  /*.** Erase all 
4330: 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69  schema informati
4340: 6f 6e 20 66 72 6f 6d 20 61 6c 6c 20 61 74 74 61  on from all atta
4350: 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 28  ched databases (
4360: 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 22 6d 61  including.** "ma
4370: 69 6e 22 20 61 6e 64 20 22 74 65 6d 70 22 29 20  in" and "temp") 
4380: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
4390: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
43a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
43b0: 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73  3ResetAllSchemas
43c0: 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 73 71 6c  OfConnection(sql
43d0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
43e0: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   i;.  sqlite3Btr
43f0: 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
4400: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
4410: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
4420: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
4430: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
4440: 44 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Db->pSchema ){. 
4450: 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65       sqlite3Sche
4460: 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63  maClear(pDb->pSc
4470: 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  hema);.    }.  }
4480: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
4490: 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  ~SQLITE_InternCh
44a0: 61 6e 67 65 73 3b 0a 20 20 73 71 6c 69 74 65 33  anges;.  sqlite3
44b0: 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64  VtabUnlockList(d
44c0: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  b);.  sqlite3Btr
44d0: 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
44e0: 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73    sqlite3Collaps
44f0: 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28 64  eDatabaseArray(d
4500: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  b);.}../*.** Thi
4510: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
4520: 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69  led when a commi
4530: 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69  t occurs..*/.voi
4540: 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49  d sqlite3CommitI
4550: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73  nternalChanges(s
4560: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64  qlite3 *db){.  d
4570: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
4580: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
4590: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  s;.}../*.** Dele
45a0: 74 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  te memory alloca
45b0: 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ted for the colu
45c0: 6d 6e 20 6e 61 6d 65 73 20 6f 66 20 61 20 74 61  mn names of a ta
45d0: 62 6c 65 20 6f 72 20 76 69 65 77 20 28 74 68 65  ble or view (the
45e0: 0a 2a 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d  .** Table.aCol[]
45f0: 20 61 72 72 61 79 29 2e 0a 2a 2f 0a 76 6f 69 64   array)..*/.void
4600: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f   sqlite3DeleteCo
4610: 6c 75 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74 65  lumnNames(sqlite
4620: 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54  3 *db, Table *pT
4630: 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  able){.  int i;.
4640: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
4650: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
4660: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43  !=0 );.  if( (pC
4670: 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f  ol = pTable->aCo
4680: 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  l)!=0 ){.    for
4690: 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e  (i=0; i<pTable->
46a0: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
46b0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
46c0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
46d0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
46e0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
46f0: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c  e(db, pCol->pDfl
4700: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
4710: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
4720: 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->zDflt);.      
4730: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4740: 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a  , pCol->zType);.
4750: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4760: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43  ree(db, pCol->zC
4770: 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  oll);.    }.    
4780: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4790: 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b  , pTable->aCol);
47a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
47b0: 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  move the memory 
47c0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
47d0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
47e0: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62  the given.** Tab
47f0: 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20  le.  No changes 
4800: 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b  are made to disk
4810: 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
4820: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
4830: 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65  tine just delete
4840: 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63  s the data struc
4850: 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e  ture.  It does n
4860: 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65  ot unlink.** the
4870: 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72 75   table data stru
4880: 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68  cture from the h
4890: 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20  ash table.  But 
48a0: 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a  it does destroy.
48b0: 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ** memory struct
48c0: 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69  ures of the indi
48d0: 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20  ces and foreign 
48e0: 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  keys associated 
48f0: 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62  with .** the tab
4900: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 62  le..**.** The db
4910: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f 70   parameter is op
4920: 74 69 6f 6e 61 6c 2e 20 20 49 74 20 69 73 20 6e  tional.  It is n
4930: 65 65 64 65 64 20 69 66 20 74 68 65 20 54 61 62  eeded if the Tab
4940: 6c 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f  le object .** co
4950: 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61 73 69 64 65  ntains lookaside
4960: 20 6d 65 6d 6f 72 79 2e 20 20 28 54 61 62 6c 65   memory.  (Table
4970: 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20   objects in the 
4980: 73 63 68 65 6d 61 20 64 6f 20 6e 6f 74 20 75 73  schema do not us
4990: 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 20 6d  e.** lookaside m
49a0: 65 6d 6f 72 79 2c 20 62 75 74 20 73 6f 6d 65 20  emory, but some 
49b0: 65 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20  ephemeral Table 
49c0: 6f 62 6a 65 63 74 73 20 64 6f 2e 29 20 20 4f 72  objects do.)  Or
49d0: 20 74 68 65 0a 2a 2a 20 64 62 20 70 61 72 61 6d   the.** db param
49e0: 65 74 65 72 20 63 61 6e 20 62 65 20 75 73 65 64  eter can be used
49f0: 20 77 69 74 68 20 64 62 2d 3e 70 6e 42 79 74 65   with db->pnByte
4a00: 73 46 72 65 65 64 20 74 6f 20 6d 65 61 73 75 72  sFreed to measur
4a10: 65 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  e the memory.** 
4a20: 75 73 65 64 20 62 79 20 74 68 65 20 54 61 62 6c  used by the Tabl
4a30: 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69  e object..*/.voi
4a40: 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54  d sqlite3DeleteT
4a50: 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62  able(sqlite3 *db
4a60: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
4a70: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
4a80: 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 54 45 53  x, *pNext;.  TES
4a90: 54 4f 4e 4c 59 28 20 69 6e 74 20 6e 4c 6f 6f 6b  TONLY( int nLook
4aa0: 61 73 69 64 65 3b 20 29 20 2f 2a 20 55 73 65 64  aside; ) /* Used
4ab0: 20 74 6f 20 76 65 72 69 66 79 20 6c 6f 6f 6b 61   to verify looka
4ac0: 73 69 64 65 20 6e 6f 74 20 75 73 65 64 20 66 6f  side not used fo
4ad0: 72 20 73 63 68 65 6d 61 20 2a 2f 0a 0a 20 20 61  r schema */..  a
4ae0: 73 73 65 72 74 28 20 21 70 54 61 62 6c 65 20 7c  ssert( !pTable |
4af0: 7c 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3e 30  | pTable->nRef>0
4b00: 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   );..  /* Do not
4b10: 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c   delete the tabl
4b20: 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65  e until the refe
4b30: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
4b40: 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69  hes zero. */.  i
4b50: 66 28 20 21 70 54 61 62 6c 65 20 29 20 72 65 74  f( !pTable ) ret
4b60: 75 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64 62  urn;.  if( ((!db
4b70: 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46   || db->pnBytesF
4b80: 72 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70  reed==0) && (--p
4b90: 54 61 62 6c 65 2d 3e 6e 52 65 66 29 3e 30 29 20  Table->nRef)>0) 
4ba0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
4bb0: 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  Record the numbe
4bc0: 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  r of outstanding
4bd0: 20 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c 6f 63   lookaside alloc
4be0: 61 74 69 6f 6e 73 20 69 6e 20 73 63 68 65 6d 61  ations in schema
4bf0: 20 54 61 62 6c 65 73 0a 20 20 2a 2a 20 70 72 69   Tables.  ** pri
4c00: 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20  or to doing any 
4c10: 66 72 65 65 28 29 20 6f 70 65 72 61 74 69 6f 6e  free() operation
4c20: 73 2e 20 20 53 69 6e 63 65 20 73 63 68 65 6d 61  s.  Since schema
4c30: 20 54 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 75   Tables do not u
4c40: 73 65 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64  se.  ** lookasid
4c50: 65 2c 20 74 68 69 73 20 6e 75 6d 62 65 72 20 73  e, this number s
4c60: 68 6f 75 6c 64 20 6e 6f 74 20 63 68 61 6e 67 65  hould not change
4c70: 2e 20 2a 2f 0a 20 20 54 45 53 54 4f 4e 4c 59 28  . */.  TESTONLY(
4c80: 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 28 64   nLookaside = (d
4c90: 62 20 26 26 20 28 70 54 61 62 6c 65 2d 3e 74 61  b && (pTable->ta
4ca0: 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
4cb0: 6d 65 72 61 6c 29 3d 3d 30 29 20 3f 0a 20 20 20  meral)==0) ?.   
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cd0: 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73        db->lookas
4ce0: 69 64 65 2e 6e 4f 75 74 20 3a 20 30 20 29 3b 0a  ide.nOut : 0 );.
4cf0: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c  .  /* Delete all
4d00: 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
4d10: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61  ted with this ta
4d20: 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49  ble. */.  for(pI
4d30: 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70  ndex = pTable->p
4d40: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
4d50: 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20  Index=pNext){.  
4d60: 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78    pNext = pIndex
4d70: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73  ->pNext;.    ass
4d80: 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53 63  ert( pIndex->pSc
4d90: 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53  hema==pTable->pS
4da0: 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28  chema );.    if(
4db0: 20 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79   !db || db->pnBy
4dc0: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20  tesFreed==0 ){. 
4dd0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
4de0: 20 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65   = pIndex->zName
4df0: 3b 20 0a 20 20 20 20 20 20 54 45 53 54 4f 4e 4c  ; .      TESTONL
4e00: 59 20 28 20 49 6e 64 65 78 20 2a 70 4f 6c 64 20  Y ( Index *pOld 
4e10: 3d 20 29 20 73 71 6c 69 74 65 33 48 61 73 68 49  = ) sqlite3HashI
4e20: 6e 73 65 72 74 28 0a 20 20 20 20 20 20 20 20 20  nsert(.         
4e30: 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61  &pIndex->pSchema
4e40: 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65  ->idxHash, zName
4e50: 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 0.      );.   
4e60: 20 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d 30     assert( db==0
4e70: 20 7c 7c 20 73 71 6c 69 74 65 33 53 63 68 65 6d   || sqlite3Schem
4e80: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30  aMutexHeld(db, 0
4e90: 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  , pIndex->pSchem
4ea0: 61 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  a) );.      asse
4eb0: 72 74 28 20 70 4f 6c 64 3d 3d 70 49 6e 64 65 78  rt( pOld==pIndex
4ec0: 20 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20   || pOld==0 );. 
4ed0: 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64     }.    freeInd
4ee0: 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
4ef0: 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
4f00: 20 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79   any foreign key
4f10: 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  s attached to th
4f20: 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73  is table. */.  s
4f30: 71 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28 64  qlite3FkDelete(d
4f40: 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f  b, pTable);..  /
4f50: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62  * Delete the Tab
4f60: 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73  le structure its
4f70: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  elf..  */.  sqli
4f80: 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  te3DeleteColumnN
4f90: 61 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29  ames(db, pTable)
4fa0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
4fb0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  e(db, pTable->zN
4fc0: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
4fd0: 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65  bFree(db, pTable
4fe0: 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71  ->zColAff);.  sq
4ff0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
5000: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53  e(db, pTable->pS
5010: 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
5020: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
5030: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65  db, pTable->pChe
5040: 63 6b 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ck);.#ifndef SQL
5050: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
5060: 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 56  TABLE.  sqlite3V
5070: 74 61 62 43 6c 65 61 72 28 64 62 2c 20 70 54 61  tabClear(db, pTa
5080: 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  ble);.#endif.  s
5090: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
50a0: 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20   pTable);..  /* 
50b0: 56 65 72 69 66 79 20 74 68 61 74 20 6e 6f 20 6c  Verify that no l
50c0: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20  ookaside memory 
50d0: 77 61 73 20 75 73 65 64 20 62 79 20 73 63 68 65  was used by sche
50e0: 6d 61 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 61  ma tables */.  a
50f0: 73 73 65 72 74 28 20 6e 4c 6f 6f 6b 61 73 69 64  ssert( nLookasid
5100: 65 3d 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69  e==0 || nLookasi
5110: 64 65 3d 3d 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  de==db->lookasid
5120: 65 2e 6e 4f 75 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a  e.nOut );.}../*.
5130: 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69  ** Unlink the gi
5140: 76 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  ven table from t
5150: 68 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61  he hash tables a
5160: 6e 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68  nd the delete th
5170: 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63  e.** table struc
5180: 74 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74  ture with all it
5190: 73 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f  s indices and fo
51a0: 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76  reign keys..*/.v
51b0: 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e  oid sqlite3Unlin
51c0: 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28  kAndDeleteTable(
51d0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
51e0: 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   iDb, const char
51f0: 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54   *zTabName){.  T
5200: 61 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70  able *p;.  Db *p
5210: 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64  Db;..  assert( d
5220: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
5230: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
5240: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
5250: 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b  ert( zTabName );
5260: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5270: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
5280: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
5290: 0a 20 20 74 65 73 74 63 61 73 65 28 20 7a 54 61  .  testcase( zTa
52a0: 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20  bName[0]==0 );  
52b0: 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74  /* Zero-length t
52c0: 61 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 61  able names are a
52d0: 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62 20  llowed */.  pDb 
52e0: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
52f0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61  .  p = sqlite3Ha
5300: 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70  shInsert(&pDb->p
5310: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
5320: 20 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20   zTabName, 0);. 
5330: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
5340: 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62  ble(db, p);.  db
5350: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
5360: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
5370: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
5380: 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20  a token, return 
5390: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f  a string that co
53a0: 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65  nsists of the te
53b0: 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f  xt of that.** to
53c0: 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68  ken.  Space to h
53d0: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
53e0: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62   string.** is ob
53f0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
5400: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
5410: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
5420: 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  the calling.** f
5430: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  unction..**.** A
5440: 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72  ny quotation mar
5450: 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c  ks (ex:  "name",
5460: 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c   'name', [name],
5470: 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74   or `name`) that
5480: 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65  .** surround the
5490: 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b   body of the tok
54a0: 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a  en are removed..
54b0: 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65  **.** Tokens are
54c0: 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e   often just poin
54d0: 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72  ters into the or
54e0: 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20  iginal SQL text 
54f0: 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f  and so.** are no
5500: 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  t \000 terminate
5510: 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65  d and are not pe
5520: 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72  rsistent.  The r
5530: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a  eturned string.*
5540: 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e  * is \000 termin
5550: 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73  ated and is pers
5560: 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20  istent..*/.char 
5570: 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d  *sqlite3NameFrom
5580: 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64  Token(sqlite3 *d
5590: 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  b, Token *pName)
55a0: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
55b0: 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
55c0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
55d0: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
55e0: 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a   (char*)pName->z
55f0: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20  , pName->n);.   
5600: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
5610: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  zName);.  }else{
5620: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a  .    zName = 0;.
5630: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61    }.  return zNa
5640: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  me;.}../*.** Ope
5650: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
5660: 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64  ter table stored
5670: 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d   in database num
5680: 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77  ber iDb for.** w
5690: 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c  riting. The tabl
56a0: 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e  e is opened usin
56b0: 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76  g cursor 0..*/.v
56c0: 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d  oid sqlite3OpenM
56d0: 61 73 74 65 72 54 61 62 6c 65 28 50 61 72 73 65  asterTable(Parse
56e0: 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20   *p, int iDb){. 
56f0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
5700: 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20  e3GetVdbe(p);.  
5710: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
5720: 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f  (p, iDb, MASTER_
5730: 52 4f 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f  ROOT, 1, SCHEMA_
5740: 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 73  TABLE(iDb));.  s
5750: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
5760: 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Int(v, OP_OpenWr
5770: 69 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52  ite, 0, MASTER_R
5780: 4f 4f 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20  OOT, iDb, 5);.  
5790: 69 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29  if( p->nTab==0 )
57a0: 7b 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20  {.    p->nTab = 
57b0: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
57c0: 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20  Parameter zName 
57d0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d  points to a nul-
57e0: 74 65 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65  terminated buffe
57f0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
5800: 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61   name.** of a da
5810: 74 61 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20  tabase ("main", 
5820: 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61  "temp" or the na
5830: 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65  me of an attache
5840: 64 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66  d db). This.** f
5850: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
5860: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
5870: 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
5880: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72  in db->aDb[], or
5890: 0a 2a 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61  .** -1 if the na
58a0: 6d 65 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65  med db cannot be
58b0: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
58c0: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
58d0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
58e0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
58f0: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20  {.  int i = -1; 
5900: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
5910: 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
5920: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
5930: 20 44 62 20 2a 70 44 62 3b 0a 20 20 20 20 69 6e   Db *pDb;.    in
5940: 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
5950: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
5960: 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62    for(i=(db->nDb
5970: 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44  -1), pDb=&db->aD
5980: 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  b[i]; i>=0; i--,
5990: 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69   pDb--){.      i
59a0: 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42  f( (!OMIT_TEMPDB
59b0: 20 7c 7c 20 69 21 3d 31 20 29 20 26 26 20 6e 3d   || i!=1 ) && n=
59c0: 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
59d0: 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20  (pDb->zName) && 
59e0: 0a 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71  .          0==sq
59f0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 44 62  lite3StrICmp(pDb
5a00: 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20  ->zName, zName) 
5a10: 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
5a20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5a30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
5a40: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b  }../*.** The tok
5a50: 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69  en *pName contai
5a60: 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ns the name of a
5a70: 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65   database (eithe
5a80: 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22  r "main" or.** "
5a90: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
5aa0: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
5ab0: 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69   db). This routi
5ac0: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
5ad0: 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  * index of the n
5ae0: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
5af0: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d   db->aDb[], or -
5b00: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
5b10: 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  b .** does not e
5b20: 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  xist..*/.int sql
5b30: 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74  ite3FindDb(sqlit
5b40: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
5b50: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Name){.  int i; 
5b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5b80: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
5b90: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
5ba0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
5bb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
5bc0: 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68  me we are search
5bd0: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61  ing for */.  zNa
5be0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
5bf0: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
5c00: 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69  ame);.  i = sqli
5c10: 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
5c20: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  , zName);.  sqli
5c30: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
5c40: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ame);.  return i
5c50: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c  ;.}../* The tabl
5c60: 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69  e or view or tri
5c70: 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73  gger name is pas
5c80: 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74  sed to this rout
5c90: 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a  ine via tokens.*
5ca0: 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61  * pName1 and pNa
5cb0: 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c  me2. If the tabl
5cc0: 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79  e name was fully
5cd0: 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20   qualified, for 
5ce0: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43  example:.**.** C
5cf0: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e  REATE TABLE xxx.
5d00: 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a  yyy (...);.** .*
5d10: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
5d20: 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e   set to "xxx" an
5d30: 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20  d pName2 "yyy". 
5d40: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
5d50: 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  d if.** the tabl
5d60: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
5d70: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
5d80: 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  .e.:.**.** CREAT
5d90: 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29  E TABLE yyy(...)
5da0: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61  ;.**.** Then pNa
5db0: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
5dc0: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
5dd0: 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  s ""..**.** This
5de0: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
5df0: 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e  e *ppUnqual poin
5e00: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
5e10: 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65  the token (pName
5e20: 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20  1 or.** pName2) 
5e30: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20  that stores the 
5e40: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
5e50: 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64  e name.  The ind
5e60: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ex of the.** dat
5e70: 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72  abase "xxx" is r
5e80: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
5e90: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
5ea0: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
5eb0: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
5ec0: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
5ed0: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
5ee0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
5ef0: 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me1,      /* The
5f00: 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61   "xxx" in the na
5f10: 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20  me "xxx.yyy" or 
5f20: 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  "xxx" */.  Token
5f30: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f   *pName2,      /
5f40: 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74  * The "yyy" in t
5f50: 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79  he name "xxx.yyy
5f60: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70  " */.  Token **p
5f70: 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72  Unqual     /* Wr
5f80: 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66  ite the unqualif
5f90: 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ied object name 
5fa0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
5fb0: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
5fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
5fd0: 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  base holding the
5fe0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
5ff0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
6000: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 41 4c  e->db;..  if( AL
6010: 57 41 59 53 28 70 4e 61 6d 65 32 21 3d 30 29 20  WAYS(pName2!=0) 
6020: 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29  && pName2->n>0 )
6030: 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e  {.    if( db->in
6040: 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20 20 20  it.busy ) {.    
6050: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
6060: 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75  g(pParse, "corru
6070: 70 74 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20  pt database");. 
6080: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
6090: 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e 71 75      }.    *pUnqu
60a0: 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20  al = pName2;.   
60b0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69   iDb = sqlite3Fi
60c0: 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29  ndDb(db, pName1)
60d0: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
60e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
60f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6100: 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61   "unknown databa
6110: 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b  se %T", pName1);
6120: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
6130: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
6140: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
6150: 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20  >init.iDb==0 || 
6160: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b  db->init.busy );
6170: 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69  .    iDb = db->i
6180: 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55  nit.iDb;.    *pU
6190: 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a  nqual = pName1;.
61a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62    }.  return iDb
61b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
61c0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
61d0: 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  to check if the 
61e0: 55 54 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61  UTF-8 string zNa
61f0: 6d 65 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a  me is a legal.**
6200: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   unqualified nam
6210: 65 20 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65  e for a new sche
6220: 6d 61 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65  ma object (table
6230: 2c 20 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72  , index, view or
6240: 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c  .** trigger). Al
6250: 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61  l names are lega
6260: 6c 20 65 78 63 65 70 74 20 74 68 6f 73 65 20 74  l except those t
6270: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 74  hat begin with t
6280: 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71  he string.** "sq
6290: 6c 69 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72  lite_" (in upper
62a0: 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64  , lower or mixed
62b0: 20 63 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72   case). This por
62c0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65  tion of the name
62d0: 73 70 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65  space.** is rese
62e0: 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61  rved for interna
62f0: 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  l use..*/.int sq
6300: 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74  lite3CheckObject
6310: 4e 61 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72  Name(Parse *pPar
6320: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
6330: 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70  zName){.  if( !p
6340: 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e  Parse->db->init.
6350: 62 75 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e  busy && pParse->
6360: 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20  nested==0 .     
6370: 20 20 20 20 20 26 26 20 28 70 50 61 72 73 65 2d       && (pParse-
6380: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
6390: 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29  ITE_WriteSchema)
63a0: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  ==0.          &&
63b0: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49   0==sqlite3StrNI
63c0: 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  Cmp(zName, "sqli
63d0: 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20  te_", 7) ){.    
63e0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
63f0: 70 50 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20  pParse, "object 
6400: 6e 61 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f  name reserved fo
6410: 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20  r internal use: 
6420: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
6430: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
6440: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
6450: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6460: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
6470: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
6480: 64 65 78 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  dex of a table.*
6490: 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
64a0: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
64b0: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
64c0: 49 6e 64 65 78 20 2a 70 3b 0a 20 20 66 6f 72 28  Index *p;.  for(
64d0: 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  p=pTab->pIndex; 
64e0: 70 20 26 26 20 21 49 73 50 72 69 6d 61 72 79 4b  p && !IsPrimaryK
64f0: 65 79 49 6e 64 65 78 28 70 29 3b 20 70 3d 70 2d  eyIndex(p); p=p-
6500: 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 72 65 74 75  >pNext){}.  retu
6510: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn p;.}../*.** R
6520: 65 74 75 72 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  eturn the column
6530: 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 20 74   of index pIdx t
6540: 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
6550: 74 6f 20 74 61 62 6c 65 0a 2a 2a 20 63 6f 6c 75  to table.** colu
6560: 6d 6e 20 69 43 6f 6c 2e 20 20 52 65 74 75 72 6e  mn iCol.  Return
6570: 20 2d 31 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64   -1 if not found
6580: 2e 0a 2a 2f 0a 69 31 36 20 73 71 6c 69 74 65 33  ..*/.i16 sqlite3
6590: 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 49 6e  ColumnOfIndex(In
65a0: 64 65 78 20 2a 70 49 64 78 2c 20 69 31 36 20 69  dex *pIdx, i16 i
65b0: 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Col){.  int i;. 
65c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
65d0: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
65e0: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70  .    if( iCol==p
65f0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
6600: 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d   ) return i;.  }
6610: 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
6620: 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e  ./*.** Begin con
6630: 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20  structing a new 
6640: 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61  table representa
6650: 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  tion in memory. 
6660: 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20   This is.** the 
6670: 66 69 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c  first of several
6680: 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73   action routines
6690: 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64   that get called
66a0: 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20   in response.** 
66b0: 74 6f 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  to a CREATE TABL
66c0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e  E statement.  In
66d0: 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69   particular, thi
66e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
66f0: 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65  led.** after see
6700: 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41  ing tokens "CREA
6710: 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20  TE" and "TABLE" 
6720: 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61  and the table na
6730: 6d 65 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a  me. The isTemp.*
6740: 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69  * flag is true i
6750: 66 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75  f the table shou
6760: 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ld be stored in 
6770: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
6780: 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69  tabase.** file i
6790: 6e 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65  nstead of in the
67a0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
67b0: 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ile.  This is no
67c0: 72 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a  rmally the case.
67d0: 2a 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d  ** when the "TEM
67e0: 50 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59  P" or "TEMPORARY
67f0: 22 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73  " keyword occurs
6800: 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43   in between.** C
6810: 52 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e  REATE and TABLE.
6820: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74  .**.** The new t
6830: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69  able record is i
6840: 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70  nitialized and p
6850: 75 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e  ut in pParse->pN
6860: 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d  ewTable..** As m
6870: 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54  ore of the CREAT
6880: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
6890: 74 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64  t is parsed, add
68a0: 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a  itional action.*
68b0: 2a 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20  * routines will 
68c0: 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64  be called to add
68d0: 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f   more informatio
68e0: 6e 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64  n to this record
68f0: 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
6900: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
6910: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  BLE statement, t
6920: 68 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  he sqlite3EndTab
6930: 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  le() routine.** 
6940: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d  is called to com
6950: 70 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72  plete the constr
6960: 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65  uction of the ne
6970: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a  w table record..
6980: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
6990: 74 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72  tartTable(.  Par
69a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
69b0: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
69c0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
69d0: 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70  e1,   /* First p
69e0: 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20  art of the name 
69f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
6a00: 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  view */.  Token 
6a10: 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65  *pName2,   /* Se
6a20: 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65  cond part of the
6a30: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
6a40: 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  le or view */.  
6a50: 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20  int isTemp,     
6a60: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
6a70: 20 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65   is a TEMP table
6a80: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77   */.  int isView
6a90: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
6aa0: 66 20 74 68 69 73 20 69 73 20 61 20 56 49 45 57  f this is a VIEW
6ab0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74   */.  int isVirt
6ac0: 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69  ual,   /* True i
6ad0: 66 20 74 68 69 73 20 69 73 20 61 20 56 49 52 54  f this is a VIRT
6ae0: 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  UAL table */.  i
6af0: 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20  nt noErr        
6b00: 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66  /* Do nothing if
6b10: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
6b20: 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61  xists */.){.  Ta
6b30: 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63  ble *pTable;.  c
6b40: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20  har *zName = 0; 
6b50: 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  /* The name of t
6b60: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a  he new table */.
6b70: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
6b80: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
6b90: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62  be *v;.  int iDb
6ba0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ;         /* Dat
6bb0: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20  abase number to 
6bc0: 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65  create the table
6bd0: 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a   in */.  Token *
6be0: 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71  pName;    /* Unq
6bf0: 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66  ualified name of
6c00: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72   the table to cr
6c10: 65 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  eate */..  /* Th
6c20: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
6c30: 6e 61 6d 65 20 74 6f 20 63 72 65 61 74 65 20 69  name to create i
6c40: 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  s passed to this
6c50: 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b   routine via tok
6c60: 65 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20  ens.  ** pName1 
6c70: 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74  and pName2. If t
6c80: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61  he table name wa
6c90: 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  s fully qualifie
6ca0: 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  d, for example:.
6cb0: 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45    **.  ** CREATE
6cc0: 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28   TABLE xxx.yyy (
6cd0: 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a  ...);.  ** .  **
6ce0: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
6cf0: 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64  set to "xxx" and
6d00: 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f   pName2 "yyy". O
6d10: 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
6d20: 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 74 61 62   if.  ** the tab
6d30: 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66  le name is not f
6d40: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
6d50: 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  i.e.:.  **.  ** 
6d60: 43 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79  CREATE TABLE yyy
6d70: 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  (...);.  **.  **
6d80: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
6d90: 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64  set to "yyy" and
6da0: 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 20   pName2 is "".. 
6db0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c   **.  ** The cal
6dc0: 6c 20 62 65 6c 6f 77 20 73 65 74 73 20 74 68 65  l below sets the
6dd0: 20 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20 74   pName pointer t
6de0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74  o point at the t
6df0: 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a  oken (pName1 or.
6e00: 20 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61    ** pName2) tha
6e10: 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71  t stores the unq
6e20: 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e  ualified table n
6e30: 61 6d 65 2e 20 54 68 65 20 76 61 72 69 61 62 6c  ame. The variabl
6e40: 65 20 69 44 62 20 69 73 0a 20 20 2a 2a 20 73 65  e iDb is.  ** se
6e50: 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
6e60: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
6e70: 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 6f 72  hat the table or
6e80: 20 76 69 65 77 20 69 73 20 74 6f 20 62 65 0a 20   view is to be. 
6e90: 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 2e 0a   ** created in..
6ea0: 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c    */.  iDb = sql
6eb0: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
6ec0: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
6ed0: 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
6ee0: 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72  .  if( iDb<0 ) r
6ef0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d  eturn;.  if( !OM
6f00: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54  IT_TEMPDB && isT
6f10: 65 6d 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e  emp && pName2->n
6f20: 3e 30 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a  >0 && iDb!=1 ){.
6f30: 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69      /* If creati
6f40: 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c  ng a temp table,
6f50: 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f   the name may no
6f60: 74 20 62 65 20 71 75 61 6c 69 66 69 65 64 2e 20  t be qualified. 
6f70: 55 6e 6c 65 73 73 20 0a 20 20 20 20 2a 2a 20 74  Unless .    ** t
6f80: 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
6f90: 20 69 73 20 22 74 65 6d 70 22 20 61 6e 79 77 61   is "temp" anywa
6fa0: 79 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  y.  */.    sqlit
6fb0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6fc0: 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61  e, "temporary ta
6fd0: 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  ble name must be
6fe0: 20 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a   unqualified");.
6ff0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7000: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
7010: 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 20 69  DB && isTemp ) i
7020: 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73  Db = 1;..  pPars
7030: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20  e->sNameToken = 
7040: 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20  *pName;.  zName 
7050: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
7060: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65  mToken(db, pName
7070: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  );.  if( zName==
7080: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
7090: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
70a0: 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
70b0: 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  ame(pParse, zNam
70c0: 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62  e) ){.    goto b
70d0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
70e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e  ;.  }.  if( db->
70f0: 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73  init.iDb==1 ) is
7100: 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65  Temp = 1;.#ifnde
7110: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
7120: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73  THORIZATION.  as
7130: 73 65 72 74 28 20 28 69 73 54 65 6d 70 20 26 20  sert( (isTemp & 
7140: 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20  1)==isTemp );.  
7150: 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  {.    int code;.
7160: 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20      char *zDb = 
7170: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
7180: 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
7190: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
71a0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
71b0: 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
71c0: 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62  (isTemp), 0, zDb
71d0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
71e0: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
71f0: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
7200: 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20   isView ){.     
7210: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
7220: 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20  B && isTemp ){. 
7230: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
7240: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
7250: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
7260: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
7270: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
7280: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20  _VIEW;.      }. 
7290: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
72a0: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
72b0: 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20   && isTemp ){.  
72c0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
72d0: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
72e0: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  TABLE;.      }el
72f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
7300: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
7310: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a  _TABLE;.      }.
7320: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69      }.    if( !i
7330: 73 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69  sVirtual && sqli
7340: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
7350: 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65  rse, code, zName
7360: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
7370: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
7380: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
7390: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
73a0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
73b0: 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64  new table name d
73c0: 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20  oes not collide 
73d0: 77 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67  with an existing
73e0: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
73f0: 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65  able name in the
7400: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20   same database. 
7410: 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20   Issue an error 
7420: 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20  message if.  ** 
7430: 69 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63  it does. The exc
7440: 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65  eption is if the
7450: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
7460: 20 70 61 72 73 65 64 20 77 61 73 20 70 61 73 73   parsed was pass
7470: 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71  ed.  ** to an sq
7480: 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
7490: 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68  ab() call. In th
74a0: 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65  at case only the
74b0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20   column names.  
74c0: 2a 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c  ** and types wil
74d0: 6c 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68  l be used, so th
74e0: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
74f0: 6f 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73  o test for names
7500: 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73  pace.  ** collis
7510: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
7520: 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41   !IN_DECLARE_VTA
7530: 42 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  B ){.    char *z
7540: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
7550: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ].zName;.    if(
7560: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
7570: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
7580: 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67  arse) ){.      g
7590: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
75a0: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
75b0: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
75c0: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
75d0: 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20  Name, zDb);.    
75e0: 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20  if( pTable ){.  
75f0: 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29      if( !noErr )
7600: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7610: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7620: 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65  , "table %T alre
7630: 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61  ady exists", pNa
7640: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
7650: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
7660: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
7670: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
7680: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7690: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
76a0: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
76b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
76c0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
76d0: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
76e0: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49  if( sqlite3FindI
76f0: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
7700: 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  zDb)!=0 ){.     
7710: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7720: 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
7730: 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e  is already an in
7740: 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  dex named %s", z
7750: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
7760: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
7770: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ror;.    }.  }..
7780: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
7790: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
77a0: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
77b0: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
77c0: 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  =0 ){.    db->ma
77d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
77e0: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
77f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
7800: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
7810: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69  +;.    goto begi
7820: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
7830: 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61   }.  pTable->zNa
7840: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54  me = zName;.  pT
7850: 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  able->iPKey = -1
7860: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68  ;.  pTable->pSch
7870: 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ema = db->aDb[iD
7880: 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54  b].pSchema;.  pT
7890: 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  able->nRef = 1;.
78a0: 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f    pTable->nRowLo
78b0: 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
78c0: 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
78d0: 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
78e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
78f0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d  rse->pNewTable==
7900: 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70  0 );.  pParse->p
7910: 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  NewTable = pTabl
7920: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  e;..  /* If this
7930: 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73 71   is the magic sq
7940: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
7950: 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74 6f  ble used by auto
7960: 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20  increment,.  ** 
7970: 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f  then record a po
7980: 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74 61  inter to this ta
7990: 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ble in the main 
79a0: 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
79b0: 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  re.  ** so that 
79c0: 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20  INSERT can find 
79d0: 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79  the table easily
79e0: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
79f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
7a00: 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21  NCREMENT.  if( !
7a10: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26  pParse->nested &
7a20: 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  & strcmp(zName, 
7a30: 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  "sqlite_sequence
7a40: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ")==0 ){.    ass
7a50: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
7a60: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
7a70: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  iDb, 0) );.    p
7a80: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e  Table->pSchema->
7a90: 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c 65  pSeqTab = pTable
7aa0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
7ab0: 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
7ac0: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
7ad0: 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68  t will insert th
7ae0: 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  e table record i
7af0: 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c  nto.  ** the SQL
7b00: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
7b10: 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69  .  Note in parti
7b20: 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75  cular that we mu
7b30: 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a  st go ahead.  **
7b40: 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68   and allocate th
7b50: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
7b60: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e  for the table en
7b70: 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65  try now.  Before
7b80: 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52   any.  ** PRIMAR
7b90: 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
7ba0: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61 72  keywords are par
7bb0: 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77  sed.  Those keyw
7bc0: 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a  ords will cause.
7bd0: 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
7be0: 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 74  be created and t
7bf0: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
7c00: 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65  must come before
7c10: 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63   the .  ** indic
7c20: 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20  es.  Hence, the 
7c30: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f  record number fo
7c40: 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74  r the table must
7c50: 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20   be allocated.  
7c60: 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69  ** now..  */.  i
7c70: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
7c80: 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65  y && (v = sqlite
7c90: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
7ca0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
7cb0: 6a 31 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c 65  j1;.    int file
7cc0: 46 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20  Format;.    int 
7cd0: 72 65 67 31 2c 20 72 65 67 32 2c 20 72 65 67 33  reg1, reg2, reg3
7ce0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
7cf0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
7d00: 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
7d10: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
7d20: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
7d30: 42 4c 45 0a 20 20 20 20 69 66 28 20 69 73 56 69  BLE.    if( isVi
7d40: 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73  rtual ){.      s
7d50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
7d60: 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a  (v, OP_VBegin);.
7d70: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
7d80: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
7d90: 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f   format and enco
7da0: 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74 61  ding in the data
7db0: 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62 65  base have not be
7dc0: 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20  en set, .    ** 
7dd0: 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20  set them now..  
7de0: 20 20 2a 2f 0a 20 20 20 20 72 65 67 31 20 3d 20    */.    reg1 = 
7df0: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64  pParse->regRowid
7e00: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
7e10: 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d 20 70 50  m;.    reg2 = pP
7e20: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20  arse->regRoot = 
7e30: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
7e40: 20 20 20 20 72 65 67 33 20 3d 20 2b 2b 70 50 61      reg3 = ++pPa
7e50: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
7e60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7e70: 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69  (v, OP_ReadCooki
7e80: 65 2c 20 69 44 62 2c 20 72 65 67 33 2c 20 42 54  e, iDb, reg3, BT
7e90: 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 29  REE_FILE_FORMAT)
7ea0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7eb0: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
7ec0: 62 29 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c  b);.    j1 = sql
7ed0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
7ee0: 2c 20 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 20  , OP_If, reg3); 
7ef0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
7f00: 0a 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20  .    fileFormat 
7f10: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
7f20: 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65  QLITE_LegacyFile
7f30: 46 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20  Fmt)!=0 ?.      
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 31 20 3a 20              1 : 
7f50: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f  SQLITE_MAX_FILE_
7f60: 46 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69  FORMAT;.    sqli
7f70: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7f80: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c   OP_Integer, fil
7f90: 65 46 6f 72 6d 61 74 2c 20 72 65 67 33 29 3b 0a  eFormat, reg3);.
7fa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7fb0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
7fc0: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45  ookie, iDb, BTRE
7fd0: 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 72  E_FILE_FORMAT, r
7fe0: 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg3);.    sqlite
7ff0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8000: 50 5f 49 6e 74 65 67 65 72 2c 20 45 4e 43 28 64  P_Integer, ENC(d
8010: 62 29 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73  b), reg3);.    s
8020: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8030: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
8040: 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 54 45 58  , iDb, BTREE_TEX
8050: 54 5f 45 4e 43 4f 44 49 4e 47 2c 20 72 65 67 33  T_ENCODING, reg3
8060: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8070: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
8080: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  );..    /* This 
8090: 6a 75 73 74 20 63 72 65 61 74 65 73 20 61 20 70  just creates a p
80a0: 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f  lace-holder reco
80b0: 72 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  rd in the sqlite
80c0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20  _master table.. 
80d0: 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64     ** The record
80e0: 20 63 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f   created does no
80f0: 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69  t contain anythi
8100: 6e 67 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c  ng yet.  It will
8110: 20 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20   be replaced.   
8120: 20 2a 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20   ** by the real 
8130: 65 6e 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65  entry in code ge
8140: 6e 65 72 61 74 65 64 20 61 74 20 73 71 6c 69 74  nerated at sqlit
8150: 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20  e3EndTable()..  
8160: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
8170: 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65  rowid for the ne
8180: 77 20 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20  w entry is left 
8190: 69 6e 20 72 65 67 69 73 74 65 72 20 70 50 61 72  in register pPar
81a0: 73 65 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20  se->regRowid..  
81b0: 20 20 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61    ** The root pa
81c0: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
81d0: 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6c 65   new table is le
81e0: 66 74 20 69 6e 20 72 65 67 20 70 50 61 72 73 65  ft in reg pParse
81f0: 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a  ->regRoot..    *
8200: 2a 20 54 68 65 20 72 6f 77 69 64 20 61 6e 64 20  * The rowid and 
8210: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
8220: 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 65 64   values are need
8230: 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20 74  ed by the code t
8240: 68 61 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  hat.    ** sqlit
8250: 65 33 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20  e3EndTable will 
8260: 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f  generate..    */
8270: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
8280: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
8290: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
82a0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
82b0: 41 42 4c 45 29 0a 20 20 20 20 69 66 28 20 69 73  ABLE).    if( is
82c0: 56 69 65 77 20 7c 7c 20 69 73 56 69 72 74 75 61  View || isVirtua
82d0: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
82e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
82f0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
8300: 65 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  eg2);.    }else.
8310: 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20  #endif.    {.   
8320: 20 20 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43     pParse->addrC
8330: 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33 56 64  rTab = sqlite3Vd
8340: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
8350: 72 65 61 74 65 54 61 62 6c 65 2c 20 69 44 62 2c  reateTable, iDb,
8360: 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 0a 20 20   reg2);.    }.  
8370: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73    sqlite3OpenMas
8380: 74 65 72 54 61 62 6c 65 28 70 50 61 72 73 65 2c  terTable(pParse,
8390: 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
83a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
83b0: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20  OP_NewRowid, 0, 
83c0: 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg1);.    sqlit
83d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
83e0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 33  OP_Null, 0, reg3
83f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8400: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
8410: 6e 73 65 72 74 2c 20 30 2c 20 72 65 67 33 2c 20  nsert, 0, reg3, 
8420: 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg1);.    sqlit
8430: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
8440: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
8450: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8460: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c  eAddOp0(v, OP_Cl
8470: 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ose);.  }..  /* 
8480: 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f  Normal (non-erro
8490: 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20  r) return. */.  
84a0: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66  return;..  /* If
84b0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
84c0: 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a  , we jump here *
84d0: 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  /.begin_table_er
84e0: 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62  ror:.  sqlite3Db
84f0: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
8500: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
8510: 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 69  .** This macro i
8520: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72  s used to compar
8530: 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 69 6e  e two strings in
8540: 20 61 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74   a case-insensit
8550: 69 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49  ive manner..** I
8560: 74 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66 61  t is slightly fa
8570: 73 74 65 72 20 74 68 61 6e 20 63 61 6c 6c 69 6e  ster than callin
8580: 67 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  g sqlite3StrICmp
8590: 28 29 20 64 69 72 65 63 74 6c 79 2c 20 62 75 74  () directly, but
85a0: 0a 2a 2a 20 70 72 6f 64 75 63 65 73 20 6c 61 72  .** produces lar
85b0: 67 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ger code..**.** 
85c0: 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 6d 61  WARNING: This ma
85d0: 63 72 6f 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61  cro is not compa
85e0: 74 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  tible with the s
85f0: 74 72 63 6d 70 28 29 20 66 61 6d 69 6c 79 2e 20  trcmp() family. 
8600: 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 72  It.** returns tr
8610: 75 65 20 69 66 20 74 68 65 20 74 77 6f 20 73 74  ue if the two st
8620: 72 69 6e 67 73 20 61 72 65 20 65 71 75 61 6c 2c  rings are equal,
8630: 20 6f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65   otherwise false
8640: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 52  ..*/.#define STR
8650: 49 43 4d 50 28 78 2c 20 79 29 20 28 5c 0a 73 71  ICMP(x, y) (\.sq
8660: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
8670: 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61  r[*(unsigned cha
8680: 72 20 2a 29 28 78 29 5d 3d 3d 20 20 20 5c 0a 73  r *)(x)]==   \.s
8690: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
86a0: 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68  er[*(unsigned ch
86b0: 61 72 20 2a 29 28 79 29 5d 20 20 20 20 20 5c 0a  ar *)(y)]     \.
86c0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
86d0: 70 28 28 78 29 2b 31 2c 28 79 29 2b 31 29 3d 3d  p((x)+1,(y)+1)==
86e0: 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  0 )../*.** Add a
86f0: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74   new column to t
8700: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
8710: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
8720: 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cted..**.** The 
8730: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
8740: 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66  s routine once f
8750: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64  or each column d
8760: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e  eclaration.** in
8770: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
8780: 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69  statement.  sqli
8790: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20  te3StartTable() 
87a0: 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66  gets called.** f
87b0: 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e  irst to get thin
87c0: 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20  gs going.  Then 
87d0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
87e0: 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a  called for each.
87f0: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f  ** column..*/.vo
8800: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
8810: 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  umn(Parse *pPars
8820: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  e, Token *pName)
8830: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
8840: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
8850: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
8860: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
8870: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
8880: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
8890: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
88a0: 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 53 51 4c   return;.#if SQL
88b0: 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20  ITE_MAX_COLUMN. 
88c0: 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64   if( p->nCol+1>d
88d0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
88e0: 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29  _LIMIT_COLUMN] )
88f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
8900: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
8910: 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
8920: 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65  on %s", p->zName
8930: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
8940: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 20 3d 20   }.#endif.  z = 
8950: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
8960: 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
8970: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
8980: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
8990: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
89a0: 7b 0a 20 20 20 20 69 66 28 20 53 54 52 49 43 4d  {.    if( STRICM
89b0: 50 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  P(z, p->aCol[i].
89c0: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
89d0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
89e0: 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61  pParse, "duplica
89f0: 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  te column name: 
8a00: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73  %s", z);.      s
8a10: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8a20: 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   z);.      retur
8a30: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  n;.    }.  }.  i
8a40: 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78  f( (p->nCol & 0x
8a50: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c  7)==0 ){.    Col
8a60: 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61  umn *aNew;.    a
8a70: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
8a80: 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f  ealloc(db,p->aCo
8a90: 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69  l,(p->nCol+8)*si
8aa0: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
8ab0: 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d  );.    if( aNew=
8ac0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
8ad0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
8ae0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
8af0: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f      }.    p->aCo
8b00: 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20  l = aNew;.  }.  
8b10: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
8b20: 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73  p->nCol];.  mems
8b30: 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65  et(pCol, 0, size
8b40: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
8b50: 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d  .  pCol->zName =
8b60: 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68   z;. .  /* If th
8b70: 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73  ere is no type s
8b80: 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e  pecified, column
8b90: 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61 75  s have the defau
8ba0: 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a  lt affinity.  **
8bb0: 20 27 42 4c 4f 42 27 2e 20 49 66 20 74 68 65 72   'BLOB'. If ther
8bc0: 65 20 69 73 20 61 20 74 79 70 65 20 73 70 65 63  e is a type spec
8bd0: 69 66 69 65 64 2c 20 74 68 65 6e 20 73 71 6c 69  ified, then sqli
8be0: 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  te3AddColumnType
8bf0: 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  () will.  ** be 
8c00: 63 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20 73  called next to s
8c10: 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  et pCol->affinit
8c20: 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a  y correctly..  *
8c30: 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  /.  pCol->affini
8c40: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
8c50: 42 4c 4f 42 3b 0a 20 20 70 43 6f 6c 2d 3e 73 7a  BLOB;.  pCol->sz
8c60: 45 73 74 20 3d 20 31 3b 0a 20 20 70 2d 3e 6e 43  Est = 1;.  p->nC
8c70: 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ol++;.}../*.** T
8c80: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
8c90: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
8ca0: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
8cb0: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
8cc0: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
8cd0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
8ce0: 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f   A "NOT NULL" co
8cf0: 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20  nstraint has.** 
8d00: 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63  been seen on a c
8d10: 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75  olumn.  This rou
8d20: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f  tine sets the no
8d30: 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a  tNull flag on.**
8d40: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72   the column curr
8d50: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
8d60: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
8d70: 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e  d sqlite3AddNotN
8d80: 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73  ull(Parse *pPars
8d90: 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b  e, int onError){
8da0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 70  .  Table *p;.  p
8db0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
8dc0: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
8dd0: 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f   || NEVER(p->nCo
8de0: 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  l<1) ) return;. 
8df0: 20 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c   p->aCol[p->nCol
8e00: 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75  -1].notNull = (u
8e10: 38 29 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a  8)onError;.}../*
8e20: 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c  .** Scan the col
8e30: 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54  umn type name zT
8e40: 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70  ype (length nTyp
8e50: 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  e) and return th
8e60: 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  e.** associated 
8e70: 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a  affinity type..*
8e80: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8e90: 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e  e does a case-in
8ea0: 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68  dependent search
8eb0: 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68   of zType for th
8ec0: 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73  e .** substrings
8ed0: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
8ee0: 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20  g table. If one 
8ef0: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
8f00: 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74  s is.** found, t
8f10: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
8f20: 20 61 66 66 69 6e 69 74 79 20 69 73 20 72 65 74   affinity is ret
8f30: 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20  urned. If zType 
8f40: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65  contains.** more
8f50: 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65   than one of the
8f60: 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74   substrings, ent
8f70: 72 69 65 73 20 74 6f 77 61 72 64 20 74 68 65 20  ries toward the 
8f80: 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74  top of .** the t
8f90: 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69  able take priori
8fa0: 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  ty. For example,
8fb0: 20 69 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c   if zType is 'BL
8fc0: 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49  OBINT', .** SQLI
8fd0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69  TE_AFF_INTEGER i
8fe0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
8ff0: 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20 20 20  * Substring     
9000: 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d  | Affinity.** --
9010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
9030: 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20 20 20  * 'INT'         
9040: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  | SQLITE_AFF_INT
9050: 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20  EGER.** 'CHAR'  
9060: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
9070: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42  FF_TEXT.** 'CLOB
9080: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
9090: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54  E_AFF_TEXT.** 'T
90a0: 45 58 54 27 20 20 20 20 20 20 20 20 7c 20 53 51  EXT'        | SQ
90b0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
90c0: 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c   'BLOB'        |
90d0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
90e0: 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20  .** 'REAL'      
90f0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
9100: 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20  EAL.** 'FLOA'   
9110: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
9120: 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27  F_REAL.** 'DOUB'
9130: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
9140: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20  _AFF_REAL.**.** 
9150: 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73  If none of the s
9160: 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65  ubstrings in the
9170: 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65   above table are
9180: 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54   found,.** SQLIT
9190: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73  E_AFF_NUMERIC is
91a0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68   returned..*/.ch
91b0: 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69  ar sqlite3Affini
91c0: 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61  tyType(const cha
91d0: 72 20 2a 7a 49 6e 2c 20 75 38 20 2a 70 73 7a 45  r *zIn, u8 *pszE
91e0: 73 74 29 7b 0a 20 20 75 33 32 20 68 20 3d 20 30  st){.  u32 h = 0
91f0: 3b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 53  ;.  char aff = S
9200: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
9210: 43 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  C;.  const char 
9220: 2a 7a 43 68 61 72 20 3d 20 30 3b 0a 0a 20 20 69  *zChar = 0;..  i
9230: 66 28 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74 75  f( zIn==0 ) retu
9240: 72 6e 20 61 66 66 3b 0a 20 20 77 68 69 6c 65 28  rn aff;.  while(
9250: 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68   zIn[0] ){.    h
9260: 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69   = (h<<8) + sqli
9270: 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  te3UpperToLower[
9280: 28 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20  (*zIn)&0xff];.  
9290: 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28    zIn++;.    if(
92a0: 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28   h==(('c'<<24)+(
92b0: 27 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38  'h'<<16)+('a'<<8
92c0: 29 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20 20  )+'r') ){       
92d0: 20 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f        /* CHAR */
92e0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
92f0: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
9300: 20 20 20 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b      zChar = zIn;
9310: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
9320: 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c  ==(('c'<<24)+('l
9330: 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b  '<<16)+('o'<<8)+
9340: 27 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a  'b') ){       /*
9350: 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61   CLOB */.      a
9360: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
9370: 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20  TEXT;.    }else 
9380: 69 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34  if( h==(('t'<<24
9390: 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78 27  )+('e'<<16)+('x'
93a0: 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20  <<8)+'t') ){    
93b0: 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20     /* TEXT */.  
93c0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
93d0: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
93e0: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 62  else if( h==(('b
93f0: 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29  '<<24)+('l'<<16)
9400: 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20  +('o'<<8)+'b')  
9410: 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20          /* BLOB 
9420: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 28 61  */.        && (a
9430: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
9440: 55 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53  UMERIC || aff==S
9450: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 29 20  QLITE_AFF_REAL) 
9460: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
9470: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
9480: 20 20 20 20 20 20 69 66 28 20 7a 49 6e 5b 30 5d        if( zIn[0]
9490: 3d 3d 27 28 27 20 29 20 7a 43 68 61 72 20 3d 20  =='(' ) zChar = 
94a0: 7a 49 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  zIn;.#ifndef SQL
94b0: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
94c0: 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73  G_POINT.    }els
94d0: 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c  e if( h==(('r'<<
94e0: 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27  24)+('e'<<16)+('
94f0: 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20  a'<<8)+'l')     
9500: 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a       /* REAL */.
9510: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
9520: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
9530: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
9540: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
9550: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  L;.    }else if(
9560: 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28   h==(('f'<<24)+(
9570: 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38  'l'<<16)+('o'<<8
9580: 29 2b 27 61 27 29 20 20 20 20 20 20 20 20 20 20  )+'a')          
9590: 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20  /* FLOA */.     
95a0: 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54     && aff==SQLIT
95b0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
95c0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
95d0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20  ITE_AFF_REAL;.  
95e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
95f0: 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c  ('d'<<24)+('o'<<
9600: 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27  16)+('u'<<8)+'b'
9610: 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f  )          /* DO
9620: 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26  UB */.        &&
9630: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
9640: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
9650: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
9660: 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a  FF_REAL;.#endif.
9670: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68      }else if( (h
9680: 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28  &0x00FFFFFF)==((
9690: 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38  'i'<<16)+('n'<<8
96a0: 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20  )+'t') ){    /* 
96b0: 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  INT */.      aff
96c0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   = SQLITE_AFF_IN
96d0: 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65  TEGER;.      bre
96e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
96f0: 20 2f 2a 20 49 66 20 70 73 7a 45 73 74 20 69 73   /* If pszEst is
9700: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74 6f 72 65   not NULL, store
9710: 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
9720: 74 68 65 20 66 69 65 6c 64 20 73 69 7a 65 2e 20  the field size. 
9730: 20 54 68 65 0a 20 20 2a 2a 20 65 73 74 69 6d 61   The.  ** estima
9740: 74 65 20 69 73 20 73 63 61 6c 65 64 20 73 6f 20  te is scaled so 
9750: 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
9760: 20 61 6e 20 69 6e 74 65 67 65 72 20 69 73 20 31   an integer is 1
9770: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 73 7a 45  .  */.  if( pszE
9780: 73 74 20 29 7b 0a 20 20 20 20 2a 70 73 7a 45 73  st ){.    *pszEs
9790: 74 20 3d 20 31 3b 20 20 20 2f 2a 20 64 65 66 61  t = 1;   /* defa
97a0: 75 6c 74 20 73 69 7a 65 20 69 73 20 61 70 70 72  ult size is appr
97b0: 6f 78 20 34 20 62 79 74 65 73 20 2a 2f 0a 20 20  ox 4 bytes */.  
97c0: 20 20 69 66 28 20 61 66 66 3c 53 51 4c 49 54 45    if( aff<SQLITE
97d0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
97e0: 20 20 20 20 20 20 69 66 28 20 7a 43 68 61 72 20        if( zChar 
97f0: 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
9800: 28 20 7a 43 68 61 72 5b 30 5d 20 29 7b 0a 20 20  ( zChar[0] ){.  
9810: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
9820: 74 65 33 49 73 64 69 67 69 74 28 7a 43 68 61 72  te3Isdigit(zChar
9830: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
9840: 20 20 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20      int v = 0;. 
9850: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
9860: 65 33 47 65 74 49 6e 74 33 32 28 7a 43 68 61 72  e3GetInt32(zChar
9870: 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20  , &v);.         
9880: 20 20 20 76 20 3d 20 76 2f 34 20 2b 20 31 3b 0a     v = v/4 + 1;.
9890: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
98a0: 76 3e 32 35 35 20 29 20 76 20 3d 20 32 35 35 3b  v>255 ) v = 255;
98b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 73  .            *ps
98c0: 7a 45 73 74 20 3d 20 76 3b 20 2f 2a 20 42 4c 4f  zEst = v; /* BLO
98d0: 42 28 6b 29 2c 20 56 41 52 43 48 41 52 28 6b 29  B(k), VARCHAR(k)
98e0: 2c 20 43 48 41 52 28 6b 29 20 2d 3e 20 72 3d 28  , CHAR(k) -> r=(
98f0: 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20 20 20  k/4+1) */.      
9900: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9910: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9920: 20 20 20 7a 43 68 61 72 2b 2b 3b 0a 20 20 20 20     zChar++;.    
9930: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
9940: 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 73 7a 45  e{.        *pszE
9950: 73 74 20 3d 20 35 3b 20 20 20 2f 2a 20 42 4c 4f  st = 5;   /* BLO
9960: 42 2c 20 54 45 58 54 2c 20 43 4c 4f 42 20 2d 3e  B, TEXT, CLOB ->
9970: 20 72 3d 35 20 20 28 61 70 70 72 6f 78 20 32 30   r=5  (approx 20
9980: 20 62 79 74 65 73 29 2a 2f 0a 20 20 20 20 20 20   bytes)*/.      
9990: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
99a0: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
99b0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
99c0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
99d0: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
99e0: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
99f0: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
9a00: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
9a10: 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73 74 20  nt.  The pFirst 
9a20: 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69 72  token is the fir
9a30: 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74  st.** token in t
9a40: 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74  he sequence of t
9a50: 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63 72  okens that descr
9a60: 69 62 65 20 74 68 65 20 74 79 70 65 20 6f 66 20  ibe the type of 
9a70: 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75  the.** column cu
9a80: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
9a90: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c  nstruction.   pL
9aa0: 61 73 74 20 69 73 20 74 68 65 20 6c 61 73 74 20  ast is the last 
9ab0: 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  token.** in the 
9ac0: 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20 74  sequence.  Use t
9ad0: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
9ae0: 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73  to construct a s
9af0: 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f  tring.** that co
9b00: 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70 65 6e  ntains the typen
9b10: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
9b20: 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74  n and store that
9b30: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54   string.** in zT
9b40: 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71  ype..*/ .void sq
9b50: 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79  lite3AddColumnTy
9b60: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
9b70: 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b  , Token *pType){
9b80: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43  .  Table *p;.  C
9b90: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20  olumn *pCol;..  
9ba0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
9bb0: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
9bc0: 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43  0 || NEVER(p->nC
9bd0: 6f 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a  ol<1) ) return;.
9be0: 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f    pCol = &p->aCo
9bf0: 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20  l[p->nCol-1];.  
9c00: 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 7a 54  assert( pCol->zT
9c10: 79 70 65 3d 3d 30 20 7c 7c 20 43 4f 52 52 55 50  ype==0 || CORRUP
9c20: 54 5f 44 42 20 29 3b 0a 20 20 73 71 6c 69 74 65  T_DB );.  sqlite
9c30: 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
9c40: 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29  db, pCol->zType)
9c50: 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20  ;.  pCol->zType 
9c60: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
9c70: 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
9c80: 62 2c 20 70 54 79 70 65 29 3b 0a 20 20 70 43 6f  b, pType);.  pCo
9c90: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
9ca0: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
9cb0: 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 2c 20 26  e(pCol->zType, &
9cc0: 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 3b 0a 7d 0a  pCol->szEst);.}.
9cd0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65  ./*.** The expre
9ce0: 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66  ssion is the def
9cf0: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
9d00: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
9d10: 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a   added column.**
9d20: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 75   of the table cu
9d30: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
9d40: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
9d50: 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * Default value 
9d60: 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74  expressions must
9d70: 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52   be constant.  R
9d80: 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  aise an exceptio
9d90: 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  n if this.** is 
9da0: 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a  not the case..**
9db0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9dc0: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
9dd0: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
9de0: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
9df0: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
9e00: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
9e10: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
9e20: 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61  ite3AddDefaultVa
9e30: 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lue(Parse *pPars
9e40: 65 2c 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70  e, ExprSpan *pSp
9e50: 61 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  an){.  Table *p;
9e60: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
9e70: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
9e80: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
9e90: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
9ea0: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d 30  able;.  if( p!=0
9eb0: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26   ){.    pCol = &
9ec0: 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c  (p->aCol[p->nCol
9ed0: 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73  -1]);.    if( !s
9ee0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
9ef0: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70  tantOrFunction(p
9f00: 53 70 61 6e 2d 3e 70 45 78 70 72 2c 20 64 62 2d  Span->pExpr, db-
9f10: 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20  >init.busy) ){. 
9f20: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
9f30: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 65  rMsg(pParse, "de
9f40: 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63  fault value of c
9f50: 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f  olumn [%s] is no
9f60: 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20  t constant",.   
9f70: 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61         pCol->zNa
9f80: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
9f90: 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20        /* A copy 
9fa0: 6f 66 20 70 45 78 70 72 20 69 73 20 75 73 65 64  of pExpr is used
9fb0: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
9fc0: 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20 70 45 78  original, as pEx
9fd0: 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  pr contains.    
9fe0: 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74    ** tokens that
9ff0: 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69   point to volati
a000: 6c 65 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20 27  le memory. The '
a010: 73 70 61 6e 27 20 6f 66 20 74 68 65 20 65 78 70  span' of the exp
a020: 72 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ression.      **
a030: 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20   is required by 
a040: 70 72 61 67 6d 61 20 74 61 62 6c 65 5f 69 6e 66  pragma table_inf
a050: 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  o..      */.    
a060: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
a070: 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44  ete(db, pCol->pD
a080: 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c  flt);.      pCol
a090: 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65  ->pDflt = sqlite
a0a0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 70  3ExprDup(db, pSp
a0b0: 61 6e 2d 3e 70 45 78 70 72 2c 20 45 58 50 52 44  an->pExpr, EXPRD
a0c0: 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20  UP_REDUCE);.    
a0d0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
a0e0: 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29  db, pCol->zDflt)
a0f0: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 44  ;.      pCol->zD
a100: 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 44 62 53  flt = sqlite3DbS
a110: 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72  trNDup(db, (char
a120: 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c  *)pSpan->zStart,
a130: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a150: 20 20 20 20 20 20 28 69 6e 74 29 28 70 53 70 61        (int)(pSpa
a160: 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d  n->zEnd - pSpan-
a170: 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20 20 20 7d  >zStart));.    }
a180: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
a190: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 53 70  prDelete(db, pSp
a1a0: 61 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  an->pExpr);.}../
a1b0: 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74  *.** Designate t
a1c0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66  he PRIMARY KEY f
a1d0: 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70  or the table.  p
a1e0: 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
a1f0: 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63  f names .** of c
a200: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d  olumns that form
a210: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
a220: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e  .  If pList is N
a230: 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ULL, then the.**
a240: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
a250: 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  dded column of t
a260: 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  he table is the 
a270: 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a  primary key..**.
a280: 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68  ** A table can h
a290: 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  ave at most one 
a2a0: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
a2b0: 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   the table alrea
a2c0: 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d  dy has.** a prim
a2d0: 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69  ary key (and thi
a2e0: 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  s is the second 
a2f0: 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65  primary key) the
a300: 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65  n create an.** e
a310: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rror..**.** If t
a320: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
a330: 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f  s on a single co
a340: 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74  lumn whose datat
a350: 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a  ype is INTEGER,.
a360: 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  ** then we will 
a370: 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20  try to use that 
a380: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f  column as the ro
a390: 77 69 64 2e 20 20 53 65 74 20 74 68 65 20 54 61  wid.  Set the Ta
a3a0: 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65  ble.iPKey.** fie
a3b0: 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ld of the table 
a3c0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
a3d0: 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64  on to be the ind
a3e0: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54  ex of the.** INT
a3f0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
a400: 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e   column.  Table.
a410: 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20  iPKey is set to 
a420: 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a  -1 if there is.*
a430: 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49  * no INTEGER PRI
a440: 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20  MARY KEY..**.** 
a450: 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f  If the key is no
a460: 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  t an INTEGER PRI
a470: 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63  MARY KEY, then c
a480: 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a  reate a unique.*
a490: 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20  * index for the 
a4a0: 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69  key.  No index i
a4b0: 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e  s created for IN
a4c0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
a4d0: 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Ys..*/.void sqli
a4e0: 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79  te3AddPrimaryKey
a4f0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
a500: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
a510: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
a520: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
a530: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64  /* List of field
a540: 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64   names to be ind
a550: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
a560: 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57  Error,      /* W
a570: 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61  hat to do with a
a580: 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66   uniqueness conf
a590: 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75  lict */.  int au
a5a0: 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54  toInc,      /* T
a5b0: 72 75 65 20 69 66 20 74 68 65 20 41 55 54 4f 49  rue if the AUTOI
a5c0: 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64  NCREMENT keyword
a5d0: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
a5e0: 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20   int sortOrder  
a5f0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f     /* SQLITE_SO_
a600: 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f  ASC or SQLITE_SO
a610: 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61  _DESC */.){.  Ta
a620: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72  ble *pTab = pPar
a630: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
a640: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30   char *zType = 0
a650: 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d  ;.  int iCol = -
a660: 31 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65 72  1, i;.  int nTer
a670: 6d 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  m;.  if( pTab==0
a680: 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56   || IN_DECLARE_V
a690: 54 41 42 20 29 20 67 6f 74 6f 20 70 72 69 6d 61  TAB ) goto prima
a6a0: 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69  ry_key_exit;.  i
a6b0: 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  f( pTab->tabFlag
a6c0: 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72  s & TF_HasPrimar
a6d0: 79 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  yKey ){.    sqli
a6e0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
a6f0: 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c  se, .      "tabl
a700: 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72  e \"%s\" has mor
a710: 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61  e than one prima
a720: 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a  ry key", pTab->z
a730: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
a740: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
a750: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74 61  ;.  }.  pTab->ta
a760: 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73  bFlags |= TF_Has
a770: 50 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69 66  PrimaryKey;.  if
a780: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
a790: 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e    iCol = pTab->n
a7a0: 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61  Col - 1;.    pTa
a7b0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63 6f  b->aCol[iCol].co
a7c0: 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
a7d0: 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 7a  G_PRIMKEY;.    z
a7e0: 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Type = pTab->aCo
a7f0: 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20  l[iCol].zType;. 
a800: 20 20 20 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20     nTerm = 1;.  
a810: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 54 65 72 6d  }else{.    nTerm
a820: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
a830: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
a840: 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  nTerm; i++){.   
a850: 20 20 20 45 78 70 72 20 2a 70 43 45 78 70 72 20     Expr *pCExpr 
a860: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
a870: 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e  pCollate(pList->
a880: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
a890: 20 20 20 69 66 28 20 70 43 45 78 70 72 20 26 26     if( pCExpr &&
a8a0: 20 70 43 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f   pCExpr->op==TK_
a8b0: 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ID ){.        co
a8c0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 4e 61 6d 65  nst char *zCName
a8d0: 20 3d 20 70 43 45 78 70 72 2d 3e 75 2e 7a 54 6f   = pCExpr->u.zTo
a8e0: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ken;.        for
a8f0: 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54  (iCol=0; iCol<pT
a900: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  ab->nCol; iCol++
a910: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
a920: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
a930: 7a 43 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43  zCName, pTab->aC
a940: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d  ol[iCol].zName)=
a950: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
a960: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f    pTab->aCol[iCo
a970: 6c 5d 2e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l].colFlags |= C
a980: 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a  OLFLAG_PRIMKEY;.
a990: 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 79 70              zTyp
a9a0: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
a9b0: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20  Col].zType;.    
a9c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a9d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a9e0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
a9f0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 54 65   }.  }.  if( nTe
aa00: 72 6d 3d 3d 31 0a 20 20 20 26 26 20 7a 54 79 70  rm==1.   && zTyp
aa10: 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  e && sqlite3StrI
aa20: 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45  Cmp(zType, "INTE
aa30: 47 45 52 22 29 3d 3d 30 0a 20 20 20 26 26 20 73  GER")==0.   && s
aa40: 6f 72 74 4f 72 64 65 72 21 3d 53 51 4c 49 54 45  ortOrder!=SQLITE
aa50: 5f 53 4f 5f 44 45 53 43 0a 20 20 29 7b 0a 20 20  _SO_DESC.  ){.  
aa60: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
aa70: 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e  iCol;.    pTab->
aa80: 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e  keyConf = (u8)on
aa90: 45 72 72 6f 72 3b 0a 20 20 20 20 61 73 73 65 72  Error;.    asser
aaa0: 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c  t( autoInc==0 ||
aab0: 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20   autoInc==1 );. 
aac0: 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
aad0: 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f  s |= autoInc*TF_
aae0: 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20  Autoincrement;. 
aaf0: 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 20 70     if( pList ) p
ab00: 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72  Parse->iPkSortOr
ab10: 64 65 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30  der = pList->a[0
ab20: 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  ].sortOrder;.  }
ab30: 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63  else if( autoInc
ab40: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
ab50: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
ab60: 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65  EMENT.    sqlite
ab70: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
ab80: 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  , "AUTOINCREMENT
ab90: 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64   is only allowed
aba0: 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20   on an ".       
abb0: 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59  "INTEGER PRIMARY
abc0: 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20   KEY");.#endif. 
abd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65   }else{.    Inde
abe0: 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71  x *p;.    p = sq
abf0: 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
ac00: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30  (pParse, 0, 0, 0
ac10: 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72  , pList, onError
ac20: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
ac30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac40: 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30 29  0, sortOrder, 0)
ac50: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
ac60: 20 20 20 20 20 70 2d 3e 69 64 78 54 79 70 65 20       p->idxType 
ac70: 3d 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  = SQLITE_IDXTYPE
ac80: 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20 20  _PRIMARYKEY;.   
ac90: 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30   }.    pList = 0
aca0: 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b  ;.  }..primary_k
acb0: 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ey_exit:.  sqlit
acc0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
acd0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69  (pParse->db, pLi
ace0: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  st);.  return;.}
acf0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
ad00: 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  w CHECK constrai
ad10: 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  nt to the table 
ad20: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
ad30: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f  construction..*/
ad40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
ad50: 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28  CheckConstraint(
ad60: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
ad70: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
ad80: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
ad90: 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f  r *pCheckExpr  /
ada0: 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78 70 72  * The check expr
adb0: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66  ession */.){.#if
adc0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
add0: 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a  _CHECK.  Table *
ade0: 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
adf0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 73 71 6c 69  NewTable;.  sqli
ae00: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
ae10: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 54 61 62  ->db;.  if( pTab
ae20: 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f   && !IN_DECLARE_
ae30: 56 54 41 42 0a 20 20 20 26 26 20 21 73 71 6c 69  VTAB.   && !sqli
ae40: 74 65 33 42 74 72 65 65 49 73 52 65 61 64 6f 6e  te3BtreeIsReadon
ae50: 6c 79 28 64 62 2d 3e 61 44 62 5b 64 62 2d 3e 69  ly(db->aDb[db->i
ae60: 6e 69 74 2e 69 44 62 5d 2e 70 42 74 29 0a 20 20  nit.iDb].pBt).  
ae70: 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 70 43 68  ){.    pTab->pCh
ae80: 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eck = sqlite3Exp
ae90: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
aea0: 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b  se, pTab->pCheck
aeb0: 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20  , pCheckExpr);. 
aec0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63     if( pParse->c
aed0: 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20  onstraintName.n 
aee0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
aef0: 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
af00: 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43  pParse, pTab->pC
af10: 68 65 63 6b 2c 20 26 70 50 61 72 73 65 2d 3e 63  heck, &pParse->c
af20: 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2c 20 31  onstraintName, 1
af30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
af40: 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20  .#endif.  {.    
af50: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
af60: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 43  e(pParse->db, pC
af70: 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d  heckExpr);.  }.}
af80: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
af90: 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69  collation functi
afa0: 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
afb0: 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74  ecently parsed t
afc0: 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74  able column.** t
afd0: 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69  o the CollSeq gi
afe0: 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ven..*/.void sql
aff0: 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79  ite3AddCollateTy
b000: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
b010: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
b020: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
b030: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
b040: 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
b050: 20 20 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e     /* Dequoted n
b060: 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e  ame of collation
b070: 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73   sequence */.  s
b080: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69  qlite3 *db;..  i
b090: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
b0a0: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
b0b0: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
b0c0: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20  >nCol-1;.  db = 
b0d0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43  pParse->db;.  zC
b0e0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  oll = sqlite3Nam
b0f0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
b100: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a  Token);.  if( !z
b110: 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a  Coll ) return;..
b120: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c 6f 63    if( sqlite3Loc
b130: 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
b140: 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
b150: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
b160: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
b170: 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  db, p->aCol[i].z
b180: 43 6f 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 43  Coll);.    p->aC
b190: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43  ol[i].zColl = zC
b1a0: 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49  oll;.  .    /* I
b1b0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
b1c0: 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61  declared as "<na
b1d0: 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20  me> PRIMARY KEY 
b1e0: 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c  COLLATE <type>",
b1f0: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20  .    ** then an 
b200: 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20 62  index may have b
b210: 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74  een created on t
b220: 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72  his column befor
b230: 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c  e the.    ** col
b240: 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20  lation type was 
b250: 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74  added. Correct t
b260: 68 69 73 20 69 66 20 69 74 20 69 73 20 74 68 65  his if it is the
b270: 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
b280: 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49    for(pIdx=p->pI
b290: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
b2a0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
b2b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
b2c0: 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b  x->nKeyCol==1 );
b2d0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
b2e0: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20  >aiColumn[0]==i 
b2f0: 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  ){.        pIdx-
b300: 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e  >azColl[0] = p->
b310: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20  aCol[i].zColl;. 
b320: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
b330: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
b340: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c  3DbFree(db, zCol
b350: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
b360: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
b370: 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61  eturns the colla
b380: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
b390: 72 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  r database nativ
b3a0: 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69  e text.** encodi
b3b0: 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ng identified by
b3c0: 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d   the string zNam
b3d0: 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e  e, length nName.
b3e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
b3f0: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
b400: 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f  n sequence is no
b410: 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20  t available, or 
b420: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a  not available.**
b430: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
b440: 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67   native encoding
b450: 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  , the collation 
b460: 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b  factory is invok
b470: 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74  ed to.** request
b480: 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c   it. If the coll
b490: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f  ation factory do
b4a0: 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75  es not supply su
b4b0: 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a  ch a sequence,.*
b4c0: 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e  * and the sequen
b4d0: 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
b4e0: 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20  in another text 
b4f0: 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74  encoding, then t
b500: 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  hat is.** return
b510: 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
b520: 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73  * If no versions
b530: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65   of the requeste
b540: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71  d collations seq
b550: 75 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61  uence are availa
b560: 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68  ble, or.** anoth
b570: 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  er error occurs,
b580: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
b590: 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d  d and an error m
b5a0: 65 73 73 61 67 65 20 77 72 69 74 74 65 6e 20 69  essage written i
b5b0: 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a  nto.** pParse..*
b5c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b5d0: 65 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  e is a wrapper a
b5e0: 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  round sqlite3Fin
b5f0: 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69  dCollSeq().  Thi
b600: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76  s routine.** inv
b610: 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  okes the collati
b620: 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20 74 68  on factory if th
b630: 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f  e named collatio
b640: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  n cannot be foun
b650: 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  d.** and generat
b660: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
b670: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  age..**.** See a
b680: 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46 69 6e 64  lso: sqlite3Find
b690: 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71 6c 69 74  CollSeq(), sqlit
b6a0: 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a  e3GetCollSeq().*
b6b0: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
b6c0: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
b6d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
b6e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
b6f0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
b700: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
b710: 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62   u8 enc = ENC(db
b720: 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79  );.  u8 initbusy
b730: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79   = db->init.busy
b740: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
b750: 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73  ll;..  pColl = s
b760: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
b770: 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65  q(db, enc, zName
b780: 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69  , initbusy);.  i
b790: 66 28 20 21 69 6e 69 74 62 75 73 79 20 26 26 20  f( !initbusy && 
b7a0: 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c  (!pColl || !pCol
b7b0: 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20  l->xCmp) ){.    
b7c0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  pColl = sqlite3G
b7d0: 65 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  etCollSeq(pParse
b7e0: 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e  , enc, pColl, zN
b7f0: 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ame);.  }..  ret
b800: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f  urn pColl;.}.../
b810: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
b820: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63  de that will inc
b830: 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d  rement the schem
b840: 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20  a cookie..**.** 
b850: 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  The schema cooki
b860: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
b870: 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20  ermine when the 
b880: 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a  schema for the.*
b890: 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  * database chang
b8a0: 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68 20  es.  After each 
b8b0: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74  schema change, t
b8c0: 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a  he cookie value.
b8d0: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65  ** changes.  Whe
b8e0: 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72 73  n a process firs
b8f0: 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68 65  t reads the sche
b900: 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74 68  ma it records th
b910: 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68  e.** cookie.  Th
b920: 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76  ereafter, whenev
b930: 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63  er it goes to ac
b940: 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
b950: 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20  e,.** it checks 
b960: 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61  the cookie to ma
b970: 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68 65  ke sure the sche
b980: 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67  ma has not chang
b990: 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77  ed.** since it w
b9a0: 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a  as last read..**
b9b0: 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73  .** This plan is
b9c0: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
b9d0: 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49  bullet-proof.  I
b9e0: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
b9f0: 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20  r.** the schema 
ba00: 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70  to change multip
ba10: 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72  le times and for
ba20: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62   the cookie to b
ba30: 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f  e.** set back to
ba40: 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42   prior value.  B
ba50: 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ut schema change
ba60: 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74  s are infrequent
ba70: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62  .** and the prob
ba80: 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69  ability of hitti
ba90: 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b  ng the same cook
baa0: 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79  ie value is only
bab0: 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20  .** 1 chance in 
bac0: 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20  2^32.  So we're 
bad0: 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a  safe enough..*/.
bae0: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e  void sqlite3Chan
baf0: 67 65 43 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a  geCookie(Parse *
bb00: 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29  pParse, int iDb)
bb10: 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c  {.  int r1 = sql
bb20: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
bb30: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
bb40: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
bb50: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  db;.  Vdbe *v = 
bb60: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
bb70: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
bb80: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
bb90: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
bba0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bbb0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
bbc0: 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  , db->aDb[iDb].p
bbd0: 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63  Schema->schema_c
bbe0: 6f 6f 6b 69 65 2b 31 2c 20 72 31 29 3b 0a 20 20  ookie+1, r1);.  
bbf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bc00: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
bc10: 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 53 43  e, iDb, BTREE_SC
bc20: 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 72 31  HEMA_VERSION, r1
bc30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
bc40: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
bc50: 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e, r1);.}../*.**
bc60: 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d   Measure the num
bc70: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
bc80: 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70  s needed to outp
bc90: 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  ut the given.** 
bca0: 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65  identifier.  The
bcb0: 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64   number returned
bcc0: 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75   includes any qu
bcd0: 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74  otes used.** but
bce0: 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64   does not includ
bcf0: 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69  e the null termi
bd00: 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nator..**.** The
bd10: 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e   estimate is con
bd20: 73 65 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d  servative.  It m
bd30: 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
bd40: 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72  hat what is.** r
bd50: 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f  eally needed..*/
bd60: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e  .static int iden
bd70: 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68  tLength(const ch
bd80: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b  ar *z){.  int n;
bd90: 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20  .  for(n=0; *z; 
bda0: 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69  n++, z++){.    i
bdb0: 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b  f( *z=='"' ){ n+
bdc0: 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72  +; }.  }.  retur
bdd0: 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  n n + 2;.}../*.*
bde0: 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61  * The first para
bdf0: 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
be00: 65 72 20 74 6f 20 61 6e 20 6f 75 74 70 75 74 20  er to an output 
be10: 62 75 66 66 65 72 2e 20 54 68 65 20 73 65 63 6f  buffer. The seco
be20: 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  nd .** parameter
be30: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
be40: 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74   an integer that
be50: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6f 66   contains the of
be60: 66 73 65 74 20 61 74 0a 2a 2a 20 77 68 69 63 68  fset at.** which
be70: 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74   to write into t
be80: 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
be90: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
bea0: 63 6f 70 69 65 73 20 74 68 65 0a 2a 2a 20 6e 75  copies the.** nu
beb0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l-terminated str
bec0: 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ing pointed to b
bed0: 79 20 74 68 65 20 74 68 69 72 64 20 70 61 72 61  y the third para
bee0: 6d 65 74 65 72 2c 20 7a 53 69 67 6e 65 64 49 64  meter, zSignedId
bef0: 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68 65 20 73  ent,.** to the s
bf00: 70 65 63 69 66 69 65 64 20 6f 66 66 73 65 74 20  pecified offset 
bf10: 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 61 6e  in the buffer an
bf20: 64 20 75 70 64 61 74 65 73 20 2a 70 49 64 78 20  d updates *pIdx 
bf30: 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20 74  to refer.** to t
bf40: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 61 66  he first byte af
bf50: 74 65 72 20 74 68 65 20 6c 61 73 74 20 62 79 74  ter the last byt
bf60: 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65  e written before
bf70: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a   returning..** .
bf80: 2a 2a 20 49 66 20 74 68 65 20 73 74 72 69 6e 67  ** If the string
bf90: 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 20 63 6f   zSignedIdent co
bfa0: 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20  nsists entirely 
bfb0: 6f 66 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69 63  of alpha-numeric
bfc0: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 2c 20  .** characters, 
bfd0: 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77  does not begin w
bfe0: 69 74 68 20 61 20 64 69 67 69 74 20 61 6e 64 20  ith a digit and 
bff0: 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20 6b 65  is not an SQL ke
c000: 79 77 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e 20 69  yword,.** then i
c010: 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 74  t is copied to t
c020: 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
c030: 20 65 78 61 63 74 6c 79 20 61 73 20 69 74 20 69   exactly as it i
c040: 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  s. Otherwise,.**
c050: 20 69 74 20 69 73 20 71 75 6f 74 65 64 20 75 73   it is quoted us
c060: 69 6e 67 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  ing double-quote
c070: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
c080: 64 20 69 64 65 6e 74 50 75 74 28 63 68 61 72 20  d identPut(char 
c090: 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63  *z, int *pIdx, c
c0a0: 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e  har *zSignedIden
c0b0: 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  t){.  unsigned c
c0c0: 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75  har *zIdent = (u
c0d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53  nsigned char*)zS
c0e0: 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e  ignedIdent;.  in
c0f0: 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74  t i, j, needQuot
c100: 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a  e;.  i = *pIdx;.
c110: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65  .  for(j=0; zIde
c120: 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nt[j]; j++){.   
c130: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73 61   if( !sqlite3Isa
c140: 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20  lnum(zIdent[j]) 
c150: 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f  && zIdent[j]!='_
c160: 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ' ) break;.  }. 
c170: 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 73 71 6c   needQuote = sql
c180: 69 74 65 33 49 73 64 69 67 69 74 28 7a 49 64 65  ite3Isdigit(zIde
c190: 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20  nt[0]).         
c1a0: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79     || sqlite3Key
c1b0: 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c  wordCode(zIdent,
c1c0: 20 6a 29 21 3d 54 4b 5f 49 44 0a 20 20 20 20 20   j)!=TK_ID.     
c1d0: 20 20 20 20 20 20 20 7c 7c 20 7a 49 64 65 6e 74         || zIdent
c1e0: 5b 6a 5d 21 3d 30 0a 20 20 20 20 20 20 20 20 20  [j]!=0.         
c1f0: 20 20 20 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20 20 69     || j==0;..  i
c200: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
c210: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66  [i++] = '"';.  f
c220: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
c230: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69  ]; j++){.    z[i
c240: 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b  ++] = zIdent[j];
c250: 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b  .    if( zIdent[
c260: 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d  j]=='"' ) z[i++]
c270: 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66   = '"';.  }.  if
c280: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
c290: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b  i++] = '"';.  z[
c2a0: 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20  i] = 0;.  *pIdx 
c2b0: 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = i;.}../*.** Ge
c2c0: 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20  nerate a CREATE 
c2d0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
c2e0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
c2f0: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62  the given.** tab
c300: 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68  le.  Memory to h
c310: 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20  old the text of 
c320: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
c330: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f   obtained.** fro
c340: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
c350: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
c360: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
c370: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  g function..*/.s
c380: 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61  tatic char *crea
c390: 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c 69  teTableStmt(sqli
c3a0: 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  te3 *db, Table *
c3b0: 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20  p){.  int i, k, 
c3c0: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  n;.  char *zStmt
c3d0: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20  ;.  char *zSep, 
c3e0: 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20  *zSep2, *zEnd;. 
c3f0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
c400: 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   n = 0;.  for(pC
c410: 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d  ol = p->aCol, i=
c420: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
c430: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
c440: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
c450: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20  (pCol->zName) + 
c460: 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64  5;.  }.  n += id
c470: 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61  entLength(p->zNa
c480: 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20  me);.  if( n<50 
c490: 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  ){ .    zSep = "
c4a0: 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22  ";.    zSep2 = "
c4b0: 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22  ,";.    zEnd = "
c4c0: 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  )";.  }else{.   
c4d0: 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a   zSep = "\n  ";.
c4e0: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e      zSep2 = ",\n
c4f0: 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20    ";.    zEnd = 
c500: 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b  "\n)";.  }.  n +
c510: 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c  = 35 + 6*p->nCol
c520: 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69  ;.  zStmt = sqli
c530: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30  te3DbMallocRaw(0
c540: 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d  , n);.  if( zStm
c550: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  t==0 ){.    db->
c560: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
c570: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
c580: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e    }.  sqlite3_sn
c590: 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c  printf(n, zStmt,
c5a0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22   "CREATE TABLE "
c5b0: 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65 33  );.  k = sqlite3
c5c0: 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b  Strlen30(zStmt);
c5d0: 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d  .  identPut(zStm
c5e0: 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29  t, &k, p->zName)
c5f0: 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d  ;.  zStmt[k++] =
c600: 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c   '(';.  for(pCol
c610: 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69  =p->aCol, i=0; i
c620: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
c630: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74  Col++){.    stat
c640: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  ic const char * 
c650: 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d  const azType[] =
c660: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51   {.        /* SQ
c670: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 20 20  LITE_AFF_BLOB   
c680: 20 2a 2f 20 22 22 2c 0a 20 20 20 20 20 20 20 20   */ "",.        
c690: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  /* SQLITE_AFF_TE
c6a0: 58 54 20 20 20 20 2a 2f 20 22 20 54 45 58 54 22  XT    */ " TEXT"
c6b0: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
c6c0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
c6d0: 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20  */ " NUM",.     
c6e0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
c6f0: 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20 49 4e  _INTEGER */ " IN
c700: 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  T",.        /* S
c710: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20  QLITE_AFF_REAL  
c720: 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20 20    */ " REAL".   
c730: 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b   };.    int len;
c740: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
c750: 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c  *zType;..    sql
c760: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d  ite3_snprintf(n-
c770: 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53  k, &zStmt[k], zS
c780: 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71  ep);.    k += sq
c790: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a  lite3Strlen30(&z
c7a0: 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53  Stmt[k]);.    zS
c7b0: 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20  ep = zSep2;.    
c7c0: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
c7d0: 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  &k, pCol->zName)
c7e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
c7f0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c  ol->affinity-SQL
c800: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 3e 3d 20  ITE_AFF_BLOB >= 
c810: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
c820: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d   pCol->affinity-
c830: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
c840: 3c 20 41 72 72 61 79 53 69 7a 65 28 61 7a 54 79  < ArraySize(azTy
c850: 70 65 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63  pe) );.    testc
c860: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
c870: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
c880: 42 4c 4f 42 20 29 3b 0a 20 20 20 20 74 65 73 74  BLOB );.    test
c890: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
c8a0: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
c8b0: 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65 73  _TEXT );.    tes
c8c0: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
c8d0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
c8e0: 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20  F_NUMERIC );.   
c8f0: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
c900: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
c910: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
c920: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
c930: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
c940: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29  QLITE_AFF_REAL )
c950: 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79 70 65  ;.    .    zType
c960: 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e   = azType[pCol->
c970: 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c 49 54  affinity - SQLIT
c980: 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b 0a 20 20 20  E_AFF_BLOB];.   
c990: 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74   len = sqlite3St
c9a0: 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20  rlen30(zType);. 
c9b0: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
c9c0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
c9d0: 45 5f 41 46 46 5f 42 4c 4f 42 20 0a 20 20 20 20  E_AFF_BLOB .    
c9e0: 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c 2d          || pCol-
c9f0: 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74  >affinity==sqlit
ca00: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a  e3AffinityType(z
ca10: 54 79 70 65 2c 20 30 29 20 29 3b 0a 20 20 20 20  Type, 0) );.    
ca20: 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d  memcpy(&zStmt[k]
ca30: 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20  , zType, len);. 
ca40: 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20     k += len;.   
ca50: 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b   assert( k<=n );
ca60: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
ca70: 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53  nprintf(n-k, &zS
ca80: 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45  tmt[k], "%s", zE
ca90: 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53  nd);.  return zS
caa0: 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  tmt;.}../*.** Re
cab0: 73 69 7a 65 20 61 6e 20 49 6e 64 65 78 20 6f 62  size an Index ob
cac0: 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20 4e 20 63  ject to hold N c
cad0: 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e 20 20 52  olumns total.  R
cae0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
caf0: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  ** on success an
cb00: 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  d SQLITE_NOMEM o
cb10: 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 0a  n an OOM error..
cb20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
cb30: 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  sizeIndexObject(
cb40: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64  sqlite3 *db, Ind
cb50: 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 4e 29  ex *pIdx, int N)
cb60: 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61  {.  char *zExtra
cb70: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
cb80: 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   if( pIdx->nColu
cb90: 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72 6e 20 53  mn>=N ) return S
cba0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
cbb0: 72 74 28 20 70 49 64 78 2d 3e 69 73 52 65 73 69  rt( pIdx->isResi
cbc0: 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 42 79 74  zed==0 );.  nByt
cbd0: 65 20 3d 20 28 73 69 7a 65 6f 66 28 63 68 61 72  e = (sizeof(char
cbe0: 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69 31 36 29  *) + sizeof(i16)
cbf0: 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45 78 74 72   + 1)*N;.  zExtr
cc00: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
cc10: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
cc20: 65 29 3b 0a 20 20 69 66 28 20 7a 45 78 74 72 61  e);.  if( zExtra
cc30: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
cc40: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d  ITE_NOMEM;.  mem
cc50: 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78  cpy(zExtra, pIdx
cc60: 2d 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66  ->azColl, sizeof
cc70: 28 63 68 61 72 2a 29 2a 70 49 64 78 2d 3e 6e 43  (char*)*pIdx->nC
cc80: 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e  olumn);.  pIdx->
cc90: 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a  azColl = (char**
cca0: 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72  )zExtra;.  zExtr
ccb0: 61 20 2b 3d 20 73 69 7a 65 6f 66 28 63 68 61 72  a += sizeof(char
ccc0: 2a 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a  *)*N;.  memcpy(z
ccd0: 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 69 43  Extra, pIdx->aiC
cce0: 6f 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66 28 69 31  olumn, sizeof(i1
ccf0: 36 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  6)*pIdx->nColumn
cd00: 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c  );.  pIdx->aiCol
cd10: 75 6d 6e 20 3d 20 28 69 31 36 2a 29 7a 45 78 74  umn = (i16*)zExt
cd20: 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20  ra;.  zExtra += 
cd30: 73 69 7a 65 6f 66 28 69 31 36 29 2a 4e 3b 0a 20  sizeof(i16)*N;. 
cd40: 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20   memcpy(zExtra, 
cd50: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
cd60: 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  , pIdx->nColumn)
cd70: 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ;.  pIdx->aSortO
cd80: 72 64 65 72 20 3d 20 28 75 38 2a 29 7a 45 78 74  rder = (u8*)zExt
cd90: 72 61 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c  ra;.  pIdx->nCol
cda0: 75 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49 64 78 2d  umn = N;.  pIdx-
cdb0: 3e 69 73 52 65 73 69 7a 65 64 20 3d 20 31 3b 0a  >isResized = 1;.
cdc0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cdd0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74  OK;.}../*.** Est
cde0: 69 6d 61 74 65 20 74 68 65 20 74 6f 74 61 6c 20  imate the total 
cdf0: 72 6f 77 20 77 69 64 74 68 20 66 6f 72 20 61 20  row width for a 
ce00: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
ce10: 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65 54 61   void estimateTa
ce20: 62 6c 65 57 69 64 74 68 28 54 61 62 6c 65 20 2a  bleWidth(Table *
ce30: 70 54 61 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pTab){.  unsigne
ce40: 64 20 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  d wTable = 0;.  
ce50: 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54  const Column *pT
ce60: 61 62 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  abCol;.  int i;.
ce70: 20 20 66 6f 72 28 69 3d 70 54 61 62 2d 3e 6e 43    for(i=pTab->nC
ce80: 6f 6c 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62  ol, pTabCol=pTab
ce90: 2d 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d  ->aCol; i>0; i--
cea0: 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20  , pTabCol++){.  
ceb0: 20 20 77 54 61 62 6c 65 20 2b 3d 20 70 54 61 62    wTable += pTab
cec0: 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a  Col->szEst;.  }.
ced0: 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65    if( pTab->iPKe
cee0: 79 3c 30 20 29 20 77 54 61 62 6c 65 2b 2b 3b 0a  y<0 ) wTable++;.
cef0: 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77    pTab->szTabRow
cf00: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
cf10: 28 77 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f  (wTable*4);.}../
cf20: 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
cf30: 65 20 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f  e average size o
cf40: 66 20 61 20 72 6f 77 20 66 6f 72 20 61 6e 20 69  f a row for an i
cf50: 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
cf60: 76 6f 69 64 20 65 73 74 69 6d 61 74 65 49 6e 64  void estimateInd
cf70: 65 78 57 69 64 74 68 28 49 6e 64 65 78 20 2a 70  exWidth(Index *p
cf80: 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Idx){.  unsigned
cf90: 20 77 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69   wIndex = 0;.  i
cfa0: 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 43 6f  nt i;.  const Co
cfb0: 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 49 64  lumn *aCol = pId
cfc0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b  x->pTable->aCol;
cfd0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
cfe0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  dx->nColumn; i++
cff0: 29 7b 0a 20 20 20 20 69 31 36 20 78 20 3d 20 70  ){.    i16 x = p
d000: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
d010: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 78 3c  ;.    assert( x<
d020: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43  pIdx->pTable->nC
d030: 6f 6c 20 29 3b 0a 20 20 20 20 77 49 6e 64 65 78  ol );.    wIndex
d040: 20 2b 3d 20 78 3c 30 20 3f 20 31 20 3a 20 61 43   += x<0 ? 1 : aC
d050: 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  ol[pIdx->aiColum
d060: 6e 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d  n[i]].szEst;.  }
d070: 0a 20 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f  .  pIdx->szIdxRo
d080: 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
d090: 74 28 77 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a  t(wIndex*4);.}..
d0a0: 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  /* Return true i
d0b0: 66 20 76 61 6c 75 65 20 78 20 69 73 20 66 6f 75  f value x is fou
d0c0: 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 20 66 69  nd any of the fi
d0d0: 72 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73  rst nCol entries
d0e0: 20 6f 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73   of aiCol[].*/.s
d0f0: 74 61 74 69 63 20 69 6e 74 20 68 61 73 43 6f 6c  tatic int hasCol
d100: 75 6d 6e 28 63 6f 6e 73 74 20 69 31 36 20 2a 61  umn(const i16 *a
d110: 69 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20  iCol, int nCol, 
d120: 69 6e 74 20 78 29 7b 0a 20 20 77 68 69 6c 65 28  int x){.  while(
d130: 20 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29 20 69 66   nCol-- > 0 ) if
d140: 28 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20  ( x==*(aiCol++) 
d150: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
d160: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
d170: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   This routine ru
d180: 6e 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ns at the end of
d190: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
d1a0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
d1b0: 74 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 61 20  t that.** has a 
d1c0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 63 6c  WITHOUT ROWID cl
d1d0: 61 75 73 65 2e 20 20 54 68 65 20 6a 6f 62 20 6f  ause.  The job o
d1e0: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
d1f0: 73 20 74 6f 20 63 6f 6e 76 65 72 74 20 62 6f 74  s to convert bot
d200: 68 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 73 63  h.** internal sc
d210: 68 65 6d 61 20 64 61 74 61 20 73 74 72 75 63 74  hema data struct
d220: 75 72 65 73 20 61 6e 64 20 74 68 65 20 67 65 6e  ures and the gen
d230: 65 72 61 74 65 64 20 56 44 42 45 20 63 6f 64 65  erated VDBE code
d240: 20 73 6f 20 74 68 61 74 20 74 68 65 79 0a 2a 2a   so that they.**
d250: 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65   are appropriate
d260: 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52   for a WITHOUT R
d270: 4f 57 49 44 20 74 61 62 6c 65 20 69 6e 73 74 65  OWID table inste
d280: 61 64 20 6f 66 20 61 20 72 6f 77 69 64 20 74 61  ad of a rowid ta
d290: 62 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67 65 73 20  ble..** Changes 
d2a0: 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20  include:.**.**  
d2b0: 20 20 20 28 31 29 20 20 43 6f 6e 76 65 72 74 20     (1)  Convert 
d2c0: 74 68 65 20 4f 50 5f 43 72 65 61 74 65 54 61 62  the OP_CreateTab
d2d0: 6c 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 43 72  le into an OP_Cr
d2e0: 65 61 74 65 49 6e 64 65 78 2e 20 20 54 68 65 72  eateIndex.  Ther
d2f0: 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  e is.**         
d300: 20 6e 6f 20 72 6f 77 69 64 20 62 74 72 65 65 20   no rowid btree 
d310: 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f  for a WITHOUT RO
d320: 57 49 44 2e 20 20 49 6e 73 74 65 61 64 2c 20 74  WID.  Instead, t
d330: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20  he canonical.** 
d340: 20 20 20 20 20 20 20 20 20 64 61 74 61 20 73 74           data st
d350: 6f 72 61 67 65 20 69 73 20 61 20 63 6f 76 65 72  orage is a cover
d360: 69 6e 67 20 69 6e 64 65 78 20 62 74 72 65 65 2e  ing index btree.
d370: 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 42 79 70  .**     (2)  Byp
d380: 61 73 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e  ass the creation
d390: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   of the sqlite_m
d3a0: 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72  aster table entr
d3b0: 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f  y.**          fo
d3c0: 72 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  r the PRIMARY KE
d3d0: 59 20 61 73 20 74 68 65 20 70 72 69 6d 61 72 79  Y as the primary
d3e0: 20 6b 65 79 20 69 6e 64 65 78 20 69 73 20 6e 6f   key index is no
d3f0: 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 64  w.**          id
d400: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20  entified by the 
d410: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
d420: 62 6c 65 20 65 6e 74 72 79 20 6f 66 20 74 68 65  ble entry of the
d430: 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 0a 2a   table itself..*
d440: 2a 20 20 20 20 20 28 33 29 20 20 53 65 74 20 74  *     (3)  Set t
d450: 68 65 20 49 6e 64 65 78 2e 74 6e 75 6d 20 6f 66  he Index.tnum of
d460: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
d470: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e   Index object in
d480: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
d490: 20 73 63 68 65 6d 61 20 74 6f 20 74 68 65 20 72   schema to the r
d4a0: 6f 6f 74 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ootpage from the
d4b0: 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 20   main table..** 
d4c0: 20 20 20 20 28 34 29 20 20 53 65 74 20 61 6c 6c      (4)  Set all
d4d0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
d4e0: 50 52 49 4d 41 52 59 20 4b 45 59 20 73 63 68 65  PRIMARY KEY sche
d4f0: 6d 61 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20  ma object to be 
d500: 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 20  NOT NULL..**    
d510: 20 28 35 29 20 20 41 64 64 20 61 6c 6c 20 74 61   (5)  Add all ta
d520: 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74  ble columns to t
d530: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49  he PRIMARY KEY I
d540: 6e 64 65 78 20 6f 62 6a 65 63 74 0a 2a 2a 20 20  ndex object.**  
d550: 20 20 20 20 20 20 20 20 73 6f 20 74 68 61 74 20          so that 
d560: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
d570: 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  is a covering in
d580: 64 65 78 2e 20 20 54 68 65 20 73 75 72 70 6c 75  dex.  The surplu
d590: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f  s.**          co
d5a0: 6c 75 6d 6e 73 20 61 72 65 20 70 61 72 74 20 6f  lumns are part o
d5b0: 66 20 4b 65 79 49 6e 66 6f 2e 6e 58 46 69 65 6c  f KeyInfo.nXFiel
d5c0: 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 75 73  d and are not us
d5d0: 65 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ed for.**       
d5e0: 20 20 20 73 6f 72 74 69 6e 67 20 6f 72 20 6c 6f     sorting or lo
d5f0: 6f 6b 75 70 20 6f 72 20 75 6e 69 71 75 65 6e 65  okup or uniquene
d600: 73 73 20 63 68 65 63 6b 73 2e 0a 2a 2a 20 20 20  ss checks..**   
d610: 20 20 28 36 29 20 20 52 65 70 6c 61 63 65 20 74    (6)  Replace t
d620: 68 65 20 72 6f 77 69 64 20 74 61 69 6c 20 6f 6e  he rowid tail on
d630: 20 61 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c   all automatical
d640: 6c 79 20 67 65 6e 65 72 61 74 65 64 20 55 4e 49  ly generated UNI
d650: 51 55 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  QUE.**          
d660: 69 6e 64 69 63 65 73 20 77 69 74 68 20 74 68 65  indices with the
d670: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
d680: 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  umns..*/.static 
d690: 76 6f 69 64 20 63 6f 6e 76 65 72 74 54 6f 57 69  void convertToWi
d6a0: 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28  thoutRowidTable(
d6b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
d6c0: 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49  able *pTab){.  I
d6d0: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 49 6e  ndex *pIdx;.  In
d6e0: 64 65 78 20 2a 70 50 6b 3b 0a 20 20 69 6e 74 20  dex *pPk;.  int 
d6f0: 6e 50 6b 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  nPk;.  int i, j;
d700: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
d710: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
d720: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
d730: 3e 70 56 64 62 65 3b 0a 0a 20 20 2f 2a 20 43 6f  >pVdbe;..  /* Co
d740: 6e 76 65 72 74 20 74 68 65 20 4f 50 5f 43 72 65  nvert the OP_Cre
d750: 61 74 65 54 61 62 6c 65 20 6f 70 63 6f 64 65 20  ateTable opcode 
d760: 74 68 61 74 20 77 6f 75 6c 64 20 6e 6f 72 6d 61  that would norma
d770: 6c 6c 79 20 63 72 65 61 74 65 20 74 68 65 0a 20  lly create the. 
d780: 20 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 66 6f   ** root-page fo
d790: 72 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f  r the table into
d7a0: 20 61 6e 20 4f 50 5f 43 72 65 61 74 65 49 6e 64   an OP_CreateInd
d7b0: 65 78 20 6f 70 63 6f 64 65 2e 20 20 54 68 65 20  ex opcode.  The 
d7c0: 69 6e 64 65 78 0a 20 20 2a 2a 20 63 72 65 61 74  index.  ** creat
d7d0: 65 64 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ed will become t
d7e0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
d7f0: 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ndex..  */.  if(
d800: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54   pParse->addrCrT
d810: 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
d820: 28 20 76 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ( v );.    sqlit
d830: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
d840: 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62  Parse->addrCrTab
d850: 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 43  )->opcode = OP_C
d860: 72 65 61 74 65 49 6e 64 65 78 3b 0a 20 20 7d 0a  reateIndex;.  }.
d870: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
d880: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
d890: 65 78 2e 20 20 4f 72 2c 20 69 66 20 74 68 69 73  ex.  Or, if this
d8a0: 20 74 61 62 6c 65 20 77 61 73 20 6f 72 69 67 69   table was origi
d8b0: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 61 6e 20 49 4e  nally.  ** an IN
d8c0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
d8d0: 59 20 74 61 62 6c 65 2c 20 63 72 65 61 74 65 20  Y table, create 
d8e0: 61 20 6e 65 77 20 50 52 49 4d 41 52 59 20 4b 45  a new PRIMARY KE
d8f0: 59 20 69 6e 64 65 78 2e 20 0a 20 20 2a 2f 0a 20  Y index. .  */. 
d900: 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79   if( pTab->iPKey
d910: 3e 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c  >=0 ){.    ExprL
d920: 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20  ist *pList;.    
d930: 54 6f 6b 65 6e 20 69 70 6b 54 6f 6b 65 6e 3b 0a  Token ipkToken;.
d940: 20 20 20 20 69 70 6b 54 6f 6b 65 6e 2e 7a 20 3d      ipkToken.z =
d950: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62   pTab->aCol[pTab
d960: 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 3b 0a  ->iPKey].zName;.
d970: 20 20 20 20 69 70 6b 54 6f 6b 65 6e 2e 6e 20 3d      ipkToken.n =
d980: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
d990: 28 69 70 6b 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20  (ipkToken.z);.  
d9a0: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
d9b0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
d9c0: 70 50 61 72 73 65 2c 20 30 2c 20 0a 20 20 20 20  pParse, 0, .    
d9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
d9e0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
d9f0: 62 2c 20 54 4b 5f 49 44 2c 20 26 69 70 6b 54 6f  b, TK_ID, &ipkTo
da00: 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 69 66  ken, 0));.    if
da10: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
da20: 75 72 6e 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  urn;.    pList->
da30: 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  a[0].sortOrder =
da40: 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74   pParse->iPkSort
da50: 4f 72 64 65 72 3b 0a 20 20 20 20 61 73 73 65 72  Order;.    asser
da60: 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  t( pParse->pNewT
da70: 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20  able==pTab );.  
da80: 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 43    pPk = sqlite3C
da90: 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  reateIndex(pPars
daa0: 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73  e, 0, 0, 0, pLis
dab0: 74 2c 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66  t, pTab->keyConf
dac0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
dad0: 20 20 20 69 66 28 20 70 50 6b 3d 3d 30 20 29 20     if( pPk==0 ) 
dae0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 50 6b 2d  return;.    pPk-
daf0: 3e 69 64 78 54 79 70 65 20 3d 20 53 51 4c 49 54  >idxType = SQLIT
db00: 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52  E_IDXTYPE_PRIMAR
db10: 59 4b 45 59 3b 0a 20 20 20 20 70 54 61 62 2d 3e  YKEY;.    pTab->
db20: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 7d 65  iPKey = -1;.  }e
db30: 6c 73 65 7b 0a 20 20 20 20 70 50 6b 20 3d 20 73  lse{.    pPk = s
db40: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
db50: 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 0a 20 20  Index(pTab);..  
db60: 20 20 2f 2a 20 42 79 70 61 73 73 20 74 68 65 20    /* Bypass the 
db70: 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  creation of the 
db80: 50 52 49 4d 41 52 59 20 4b 45 59 20 62 74 72 65  PRIMARY KEY btre
db90: 65 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65  e and the sqlite
dba0: 5f 6d 61 73 74 65 72 0a 20 20 20 20 2a 2a 20 74  _master.    ** t
dbb0: 61 62 6c 65 20 65 6e 74 72 79 2e 20 54 68 69 73  able entry. This
dbc0: 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65   is only require
dbd0: 64 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 67  d if currently g
dbe0: 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 0a 20  enerating VDBE. 
dbf0: 20 20 20 2a 2a 20 63 6f 64 65 20 66 6f 72 20 61     ** code for a
dc00: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 28 6e   CREATE TABLE (n
dc10: 6f 74 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  ot when parsing 
dc20: 6f 6e 65 20 61 73 20 70 61 72 74 20 6f 66 20 72  one as part of r
dc30: 65 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20 61 20  eading.    ** a 
dc40: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 29  database schema)
dc50: 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 76 20  .  */.    if( v 
dc60: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
dc70: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
dc80: 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
dc90: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
dca0: 50 6b 2d 3e 74 6e 75 6d 29 2d 3e 6f 70 63 6f 64  Pk->tnum)->opcod
dcb0: 65 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 20  e = OP_Goto;.   
dcc0: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
dcd0: 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 64  * Remove all red
dce0: 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 20 66  undant columns f
dcf0: 72 6f 6d 20 74 68 65 20 50 52 49 4d 41 52 59 20  rom the PRIMARY 
dd00: 4b 45 59 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  KEY.  For exampl
dd10: 65 2c 20 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a  e, change.    **
dd20: 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c   "PRIMARY KEY(a,
dd30: 62 2c 61 2c 62 2c 63 2c 62 2c 63 2c 64 29 22 20  b,a,b,c,b,c,d)" 
dd40: 69 6e 74 6f 20 6a 75 73 74 20 22 50 52 49 4d 41  into just "PRIMA
dd50: 52 59 20 4b 45 59 28 61 2c 62 2c 63 2c 64 29 22  RY KEY(a,b,c,d)"
dd60: 2e 20 20 4c 61 74 65 72 0a 20 20 20 20 2a 2a 20  .  Later.    ** 
dd70: 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 65  code assumes the
dd80: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
dd90: 74 61 69 6e 73 20 6e 6f 20 72 65 70 65 61 74 65  tains no repeate
dda0: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a  d columns..    *
ddb0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 31 3b  /.    for(i=j=1;
ddc0: 20 69 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   i<pPk->nKeyCol;
ddd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
dde0: 20 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e   hasColumn(pPk->
ddf0: 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b  aiColumn, j, pPk
de00: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29  ->aiColumn[i]) )
de10: 7b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 6e  {.        pPk->n
de20: 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20  Column--;.      
de30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
de40: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b  Pk->aiColumn[j++
de50: 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  ] = pPk->aiColum
de60: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n[i];.      }.  
de70: 20 20 7d 0a 20 20 20 20 70 50 6b 2d 3e 6e 4b 65    }.    pPk->nKe
de80: 79 43 6f 6c 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20  yCol = j;.  }.  
de90: 70 50 6b 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  pPk->isCovering 
dea0: 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 1;.  assert( p
deb0: 50 6b 21 3d 30 20 29 3b 0a 20 20 6e 50 6b 20 3d  Pk!=0 );.  nPk =
dec0: 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a   pPk->nKeyCol;..
ded0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 65    /* Make sure e
dee0: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  very column of t
def0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
df00: 73 20 4e 4f 54 20 4e 55 4c 4c 2e 20 20 28 45 78  s NOT NULL.  (Ex
df10: 63 65 70 74 2c 0a 20 20 2a 2a 20 64 6f 20 6e 6f  cept,.  ** do no
df20: 74 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 66  t enforce this f
df30: 6f 72 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  or imposter tabl
df40: 65 73 2e 29 20 2a 2f 0a 20 20 69 66 28 20 21 64  es.) */.  if( !d
df50: 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72  b->init.imposter
df60: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 66 6f 72  Table ){.    for
df70: 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b  (i=0; i<nPk; i++
df80: 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61  ){.      pTab->a
df90: 43 6f 6c 5b 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  Col[pPk->aiColum
dfa0: 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20  n[i]].notNull = 
dfb0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 6b  1;.    }.    pPk
dfc0: 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20  ->uniqNotNull = 
dfd0: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  1;.  }..  /* The
dfe0: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
dff0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
e000: 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 20   the table root 
e010: 70 61 67 65 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74  page */.  pPk->t
e020: 6e 75 6d 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  num = pTab->tnum
e030: 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  ;..  /* Update t
e040: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
e050: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  resentation of a
e060: 6c 6c 20 55 4e 49 51 55 45 20 69 6e 64 69 63 65  ll UNIQUE indice
e070: 73 20 62 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a  s by converting.
e080: 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 72    ** the final r
e090: 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f  owid column into
e0a0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f 6c   one or more col
e0b0: 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49 4d  umns of the PRIM
e0c0: 41 52 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20  ARY KEY..  */.  
e0d0: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
e0e0: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
e0f0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
e100: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69      int n;.    i
e110: 66 28 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49  f( IsPrimaryKeyI
e120: 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e  ndex(pIdx) ) con
e130: 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69  tinue;.    for(i
e140: 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b  =n=0; i<nPk; i++
e150: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61  ){.      if( !ha
e160: 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69  sColumn(pIdx->ai
e170: 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b  Column, pIdx->nK
e180: 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f  eyCol, pPk->aiCo
e190: 6c 75 6d 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a  lumn[i]) ) n++;.
e1a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3d      }.    if( n=
e1b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
e1c0: 68 69 73 20 69 6e 64 65 78 20 69 73 20 61 20 73  his index is a s
e1d0: 75 70 65 72 73 65 74 20 6f 66 20 74 68 65 20 70  uperset of the p
e1e0: 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20  rimary key */.  
e1f0: 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d      pIdx->nColum
e200: 6e 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  n = pIdx->nKeyCo
e210: 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  l;.      continu
e220: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
e230: 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65   resizeIndexObje
e240: 63 74 28 64 62 2c 20 70 49 64 78 2c 20 70 49 64  ct(db, pIdx, pId
e250: 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29 20  x->nKeyCol+n) ) 
e260: 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28  return;.    for(
e270: 69 3d 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65  i=0, j=pIdx->nKe
e280: 79 43 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b  yCol; i<nPk; i++
e290: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61  ){.      if( !ha
e2a0: 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69  sColumn(pIdx->ai
e2b0: 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b  Column, pIdx->nK
e2c0: 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f  eyCol, pPk->aiCo
e2d0: 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20  lumn[i]) ){.    
e2e0: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
e2f0: 6d 6e 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69 43  mn[j] = pPk->aiC
e300: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
e310: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a    pIdx->azColl[j
e320: 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b  ] = pPk->azColl[
e330: 69 5d 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b  i];.        j++;
e340: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e350: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
e360: 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e  >nColumn>=pIdx->
e370: 6e 4b 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20  nKeyCol+n );.   
e380: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
e390: 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d  Column>=j );.  }
e3a0: 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 74  ..  /* Add all t
e3b0: 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  able columns to 
e3c0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
e3d0: 69 6e 64 65 78 0a 20 20 2a 2f 0a 20 20 69 66 28  index.  */.  if(
e3e0: 20 6e 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20   nPk<pTab->nCol 
e3f0: 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a  ){.    if( resiz
e400: 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c  eIndexObject(db,
e410: 20 70 50 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c   pPk, pTab->nCol
e420: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ) ) return;.    
e430: 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20  for(i=0, j=nPk; 
e440: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
e450: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68  +){.      if( !h
e460: 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69  asColumn(pPk->ai
e470: 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b  Column, j, i) ){
e480: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
e490: 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20   j<pPk->nColumn 
e4a0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e  );.        pPk->
e4b0: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b  aiColumn[j] = i;
e4c0: 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 7a  .        pPk->az
e4d0: 43 6f 6c 6c 5b 6a 5d 20 3d 20 22 42 49 4e 41 52  Coll[j] = "BINAR
e4e0: 59 22 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b  Y";.        j++;
e4f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e500: 20 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e     assert( pPk->
e510: 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20  nColumn==j );.  
e520: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
e530: 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 65 6c  nCol==j );.  }el
e540: 73 65 7b 0a 20 20 20 20 70 50 6b 2d 3e 6e 43 6f  se{.    pPk->nCo
e550: 6c 75 6d 6e 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  lumn = pTab->nCo
e560: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
e570: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
e580: 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74  called to report
e590: 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74   the final ")" t
e5a0: 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a  hat terminates.*
e5b0: 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  * a CREATE TABLE
e5c0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
e5d0: 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75  * The table stru
e5e0: 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72  cture that other
e5f0: 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73   action routines
e600: 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64   have been build
e610: 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  ing.** is added 
e620: 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  to the internal 
e630: 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73  hash tables, ass
e640: 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20  uming no errors 
e650: 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64  have.** occurred
e660: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79  ..**.** An entry
e670: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69   for the table i
e680: 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61  s made in the ma
e690: 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69  ster table on di
e6a0: 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68  sk, unless.** th
e6b0: 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
e6c0: 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69  y table or db->i
e6d0: 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68  nit.busy==1.  Wh
e6e0: 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  en db->init.busy
e6f0: 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20  ==1.** it means 
e700: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
e710: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
e720: 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77   table because w
e730: 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63  e just.** connec
e740: 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ted to the datab
e750: 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74  ase or because t
e760: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
e770: 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65   table has.** re
e780: 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20  cently changed, 
e790: 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  so the entry for
e7a0: 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65   this table alre
e7b0: 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a  ady exists in.**
e7c0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
e7d0: 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f  er table.  We do
e7e0: 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65   not want to cre
e7f0: 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a  ate it again..**
e800: 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65  .** If the pSele
e810: 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ct argument is n
e820: 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e  ot NULL, it mean
e830: 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  s that this rout
e840: 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65  ine.** was calle
e850: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61  d to create a ta
e860: 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72  ble generated fr
e870: 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45  om a .** "CREATE
e880: 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45   TABLE ... AS SE
e890: 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d  LECT ..." statem
e8a0: 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ent.  The column
e8b0: 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
e8c0: 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20   new table will 
e8d0: 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74  match the result
e8e0: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
e8f0: 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
e900: 74 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50  te3EndTable(.  P
e910: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
e920: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
e930: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
e940: 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20  en *pCons,      
e950: 20 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20       /* The ',' 
e960: 74 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20  token after the 
e970: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e  last column defn
e980: 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45  . */.  Token *pE
e990: 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  nd,            /
e9a0: 2a 20 54 68 65 20 27 29 27 20 62 65 66 6f 72 65  * The ')' before
e9b0: 20 6f 70 74 69 6f 6e 73 20 69 6e 20 74 68 65 20   options in the 
e9c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a  CREATE TABLE */.
e9d0: 20 20 75 38 20 74 61 62 4f 70 74 73 2c 20 20 20    u8 tabOpts,   
e9e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
e9f0: 72 61 20 74 61 62 6c 65 20 6f 70 74 69 6f 6e 73  ra table options
ea00: 2e 20 55 73 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a  . Usually 0. */.
ea10: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
ea20: 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c  t         /* Sel
ea30: 65 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41  ect from a "CREA
ea40: 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54  TE ... AS SELECT
ea50: 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  " */.){.  Table 
ea60: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
ea70: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 74      /* The new t
ea80: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
ea90: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
eaa0: 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62  db; /* The datab
eab0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
eac0: 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
ead0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
eae0: 20 44 61 74 61 62 61 73 65 20 69 6e 20 77 68 69   Database in whi
eaf0: 63 68 20 74 68 65 20 74 61 62 6c 65 20 6c 69 76  ch the table liv
eb00: 65 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  es */.  Index *p
eb10: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
eb20: 20 20 2f 2a 20 41 6e 20 69 6d 70 6c 69 65 64 20    /* An implied 
eb30: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  index of the tab
eb40: 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 6e  le */..  if( pEn
eb50: 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d  d==0 && pSelect=
eb60: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
eb70: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
eb80: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
eb90: 64 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  d );.  p = pPars
eba0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
ebb0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
ebc0: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64  n;..  assert( !d
ebd0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
ebe0: 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 2f  !pSelect );..  /
ebf0: 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69  * If the db->ini
ec00: 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d  t.busy is 1 it m
ec10: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
ec20: 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20  ing the SQL off 
ec30: 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65  the.  ** "sqlite
ec40: 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c  _master" or "sql
ec50: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22  ite_temp_master"
ec60: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
ec70: 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e  sk..  ** So do n
ec80: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
ec90: 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74  disk again.  Ext
eca0: 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61  ract the root pa
ecb0: 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66  ge number.  ** f
ecc0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  or the table fro
ecd0: 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e  m the db->init.n
ece0: 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28  ewTnum field.  (
ecf0: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  The page number.
ed00: 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65    ** should have
ed10: 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20   been put there 
ed20: 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65  by the sqliteOpe
ed30: 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20  nCb routine.).  
ed40: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
ed50: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 70 2d  t.busy ){.    p-
ed60: 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74  >tnum = db->init
ed70: 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20  .newTnum;.  }.. 
ed80: 20 2f 2a 20 53 70 65 63 69 61 6c 20 70 72 6f 63   /* Special proc
ed90: 65 73 73 69 6e 67 20 66 6f 72 20 57 49 54 48 4f  essing for WITHO
eda0: 55 54 20 52 4f 57 49 44 20 54 61 62 6c 65 73 20  UT ROWID Tables 
edb0: 2a 2f 0a 20 20 69 66 28 20 74 61 62 4f 70 74 73  */.  if( tabOpts
edc0: 20 26 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77   & TF_WithoutRow
edd0: 69 64 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70  id ){.    if( (p
ede0: 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
edf0: 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 20 29  Autoincrement) )
ee00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
ee10: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
ee20: 20 20 20 20 20 20 20 20 20 20 22 41 55 54 4f 49            "AUTOI
ee30: 4e 43 52 45 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c  NCREMENT not all
ee40: 6f 77 65 64 20 6f 6e 20 57 49 54 48 4f 55 54 20  owed on WITHOUT 
ee50: 52 4f 57 49 44 20 74 61 62 6c 65 73 22 29 3b 0a  ROWID tables");.
ee60: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
ee70: 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 2d 3e    }.    if( (p->
ee80: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61  tabFlags & TF_Ha
ee90: 73 50 72 69 6d 61 72 79 4b 65 79 29 3d 3d 30 20  sPrimaryKey)==0 
eea0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
eeb0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
eec0: 20 22 50 52 49 4d 41 52 59 20 4b 45 59 20 6d 69   "PRIMARY KEY mi
eed0: 73 73 69 6e 67 20 6f 6e 20 74 61 62 6c 65 20 25  ssing on table %
eee0: 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  s", p->zName);. 
eef0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ef00: 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  p->tabFlags |= T
ef10: 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20 7c  F_WithoutRowid |
ef20: 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77   TF_NoVisibleRow
ef30: 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e 76 65 72  id;.      conver
ef40: 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54  tToWithoutRowidT
ef50: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 29 3b  able(pParse, p);
ef60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 44  .    }.  }..  iD
ef70: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
ef80: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e  aToIndex(db, p->
ef90: 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64  pSchema);..#ifnd
efa0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
efb0: 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76  HECK.  /* Resolv
efc0: 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43  e names in all C
efd0: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
efe0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a  expressions..  *
eff0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65 63  /.  if( p->pChec
f000: 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  k ){.    sqlite3
f010: 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72  ResolveSelfRefer
f020: 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70 2c 20  ence(pParse, p, 
f030: 4e 43 5f 49 73 43 68 65 63 6b 2c 20 30 2c 20 70  NC_IsCheck, 0, p
f040: 2d 3e 70 43 68 65 63 6b 29 3b 0a 20 20 7d 0a 23  ->pCheck);.  }.#
f050: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
f060: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  d(SQLITE_OMIT_CH
f070: 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 45 73  ECK) */..  /* Es
f080: 74 69 6d 61 74 65 20 74 68 65 20 61 76 65 72 61  timate the avera
f090: 67 65 20 72 6f 77 20 73 69 7a 65 20 66 6f 72 20  ge row size for 
f0a0: 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 66 6f  the table and fo
f0b0: 72 20 61 6c 6c 20 69 6d 70 6c 69 65 64 20 69 6e  r all implied in
f0c0: 64 69 63 65 73 20 2a 2f 0a 20 20 65 73 74 69 6d  dices */.  estim
f0d0: 61 74 65 54 61 62 6c 65 57 69 64 74 68 28 70 29  ateTableWidth(p)
f0e0: 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e  ;.  for(pIdx=p->
f0f0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
f100: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
f110: 0a 20 20 20 20 65 73 74 69 6d 61 74 65 49 6e 64  .    estimateInd
f120: 65 78 57 69 64 74 68 28 70 49 64 78 29 3b 0a 20  exWidth(pIdx);. 
f130: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20   }..  /* If not 
f140: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68  initializing, th
f150: 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f  en create a reco
f160: 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  rd for the new t
f170: 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  able.  ** in the
f180: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
f190: 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61  able of the data
f1a0: 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  base..  **.  ** 
f1b0: 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  If this is a TEM
f1c0: 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72  PORARY table, wr
f1d0: 69 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e  ite the entry in
f1e0: 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  to the auxiliary
f1f0: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65  .  ** file inste
f200: 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d  ad of into the m
f210: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
f220: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  e..  */.  if( !d
f230: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
f240: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56      int n;.    V
f250: 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72  dbe *v;.    char
f260: 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22   *zType;    /* "
f270: 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22  view" or "table"
f280: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54   */.    char *zT
f290: 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57  ype2;   /* "VIEW
f2a0: 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a  " or "TABLE" */.
f2b0: 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b      char *zStmt;
f2c0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74      /* Text of t
f2d0: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
f2e0: 6f 72 20 43 52 45 41 54 45 20 56 49 45 57 20 73  or CREATE VIEW s
f2f0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20  tatement */..   
f300: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
f310: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
f320: 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
f330: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20   ) return;..    
f340: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f350: 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  1(v, OP_Close, 0
f360: 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20  );..    /* .    
f370: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54  ** Initialize zT
f380: 79 70 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ype for the new 
f390: 76 69 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20  view or table.. 
f3a0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
f3b0: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
f3c0: 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61       /* A regula
f3d0: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  r table */.     
f3e0: 20 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22   zType = "table"
f3f0: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d  ;.      zType2 =
f400: 20 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65   "TABLE";.#ifnde
f410: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
f420: 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  EW.    }else{.  
f430: 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f      /* A view */
f440: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
f450: 76 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79  view";.      zTy
f460: 70 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65  pe2 = "VIEW";.#e
f470: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
f480: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
f490: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 20  CREATE TABLE xx 
f4a0: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65  AS SELECT ..., e
f4b0: 78 65 63 75 74 65 20 74 68 65 20 53 45 4c 45 43  xecute the SELEC
f4c0: 54 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65  T.    ** stateme
f4d0: 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  nt to populate t
f4e0: 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68  he new table. Th
f4f0: 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  e root-page numb
f500: 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a  er for the.    *
f510: 2a 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 69  * new table is i
f520: 6e 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73  n register pPars
f530: 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20  e->regRoot..    
f540: 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74  **.    ** Once t
f550: 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65  he SELECT has be
f560: 65 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69  en coded by sqli
f570: 74 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20  te3Select(), it 
f580: 69 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73  is in a.    ** s
f590: 75 69 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f  uitable state to
f5a0: 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 20 63   query for the c
f5b0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20  olumn names and 
f5c0: 74 79 70 65 73 20 74 6f 20 62 65 20 75 73 65 64  types to be used
f5d0: 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e  .    ** by the n
f5e0: 65 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  ew table..    **
f5f0: 0a 20 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64  .    ** A shared
f600: 2d 63 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63  -cache write-loc
f610: 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  k is not require
f620: 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  d to write to th
f630: 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20  e new table,.   
f640: 20 2a 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d   ** as a schema-
f650: 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61  lock must have a
f660: 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61  lready been obta
f670: 69 6e 65 64 20 74 6f 20 63 72 65 61 74 65 20 69  ined to create i
f680: 74 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20  t. Since.    ** 
f690: 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78  a schema-lock ex
f6a0: 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72  cludes all other
f6b0: 20 64 61 74 61 62 61 73 65 20 75 73 65 72 73 2c   database users,
f6c0: 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20   the write-lock 
f6d0: 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20  would.    ** be 
f6e0: 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a  redundant..    *
f6f0: 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  /.    if( pSelec
f700: 74 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63  t ){.      Selec
f710: 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 2f  tDest dest;    /
f720: 2a 20 57 68 65 72 65 20 74 68 65 20 53 45 4c 45  * Where the SELE
f730: 43 54 20 73 68 6f 75 6c 64 20 73 74 6f 72 65 20  CT should store 
f740: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20  results */.     
f750: 20 69 6e 74 20 72 65 67 59 69 65 6c 64 3b 20 20   int regYield;  
f760: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
f770: 20 68 6f 6c 64 69 6e 67 20 63 6f 2d 72 6f 75 74   holding co-rout
f780: 69 6e 65 20 65 6e 74 72 79 2d 70 6f 69 6e 74 20  ine entry-point 
f790: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
f7a0: 72 54 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  rTop;        /* 
f7b0: 54 6f 70 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f  Top of the co-ro
f7c0: 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69  utine */.      i
f7d0: 6e 74 20 72 65 67 52 65 63 3b 20 20 20 20 20 20  nt regRec;      
f7e0: 20 20 20 2f 2a 20 41 20 72 65 63 6f 72 64 20 74     /* A record t
f7f0: 6f 20 62 65 20 69 6e 73 65 72 74 20 69 6e 74 6f  o be insert into
f800: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a   the new table *
f810: 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52  /.      int regR
f820: 6f 77 69 64 3b 20 20 20 20 20 20 20 2f 2a 20 52  owid;       /* R
f830: 6f 77 69 64 20 6f 66 20 74 68 65 20 6e 65 78 74  owid of the next
f840: 20 72 6f 77 20 74 6f 20 69 6e 73 65 72 74 20 2a   row to insert *
f850: 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
f860: 49 6e 73 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54  InsLoop;    /* T
f870: 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66  op of the loop f
f880: 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 72 6f 77  or inserting row
f890: 73 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65  s */.      Table
f8a0: 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 20 20 2f   *pSelTab;     /
f8b0: 2a 20 41 20 74 61 62 6c 65 20 74 68 61 74 20 64  * A table that d
f8c0: 65 73 63 72 69 62 65 73 20 74 68 65 20 53 45 4c  escribes the SEL
f8d0: 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a  ECT results */..
f8e0: 20 20 20 20 20 20 72 65 67 59 69 65 6c 64 20 3d        regYield =
f8f0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
f900: 0a 20 20 20 20 20 20 72 65 67 52 65 63 20 3d 20  .      regRec = 
f910: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
f920: 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d        regRowid =
f930: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
f940: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
f950: 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a  arse->nTab==1);.
f960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79        sqlite3May
f970: 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20  Abort(pParse);. 
f980: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f990: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
f9a0: 6e 57 72 69 74 65 2c 20 31 2c 20 70 50 61 72 73  nWrite, 1, pPars
f9b0: 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62 29  e->regRoot, iDb)
f9c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f9d0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
f9e0: 50 46 4c 41 47 5f 50 32 49 53 52 45 47 29 3b 0a  PFLAG_P2ISREG);.
f9f0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54        pParse->nT
fa00: 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 61 64  ab = 2;.      ad
fa10: 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
fa20: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
fa30: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  ) + 1;.      sql
fa40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
fa50: 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
fa60: 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c  ne, regYield, 0,
fa70: 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20   addrTop);.     
fa80: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
fa90: 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
faa0: 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  T_Coroutine, reg
fab0: 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73 71  Yield);.      sq
fac0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
fad0: 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65  se, pSelect, &de
fae0: 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
faf0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
fb00: 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c  OP_EndCoroutine,
fb10: 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20   regYield);.    
fb20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
fb30: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
fb40: 20 2d 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28   - 1);.      if(
fb50: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
fb60: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 70 53  return;.      pS
fb70: 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
fb80: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
fb90: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
fba0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  );.      if( pSe
fbb0: 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  lTab==0 ) return
fbc0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
fbd0: 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  p->aCol==0 );.  
fbe0: 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53      p->nCol = pS
fbf0: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
fc00: 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65     p->aCol = pSe
fc10: 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
fc20: 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
fc30: 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  = 0;.      pSelT
fc40: 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
fc50: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
fc60: 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54  eTable(db, pSelT
fc70: 61 62 29 3b 0a 20 20 20 20 20 20 61 64 64 72 49  ab);.      addrI
fc80: 6e 73 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  nsLoop = sqlite3
fc90: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
fca0: 5f 59 69 65 6c 64 2c 20 64 65 73 74 2e 69 53 44  _Yield, dest.iSD
fcb0: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 56 64 62  Parm);.      Vdb
fcc0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
fcd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fce0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
fcf0: 52 65 63 6f 72 64 2c 20 64 65 73 74 2e 69 53 64  Record, dest.iSd
fd00: 73 74 2c 20 64 65 73 74 2e 6e 53 64 73 74 2c 20  st, dest.nSdst, 
fd10: 72 65 67 52 65 63 29 3b 0a 20 20 20 20 20 20 73  regRec);.      s
fd20: 71 6c 69 74 65 33 54 61 62 6c 65 41 66 66 69 6e  qlite3TableAffin
fd30: 69 74 79 28 76 2c 20 70 2c 20 30 29 3b 0a 20 20  ity(v, p, 0);.  
fd40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fd50: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
fd60: 6f 77 69 64 2c 20 31 2c 20 72 65 67 52 6f 77 69  owid, 1, regRowi
fd70: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
fd80: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
fd90: 50 5f 49 6e 73 65 72 74 2c 20 31 2c 20 72 65 67  P_Insert, 1, reg
fda0: 52 65 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Rec, regRowid);.
fdb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fdc0: 65 41 64 64 47 6f 74 6f 28 76 2c 20 61 64 64 72  eAddGoto(v, addr
fdd0: 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  InsLoop);.      
fde0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
fdf0: 65 72 65 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f  ere(v, addrInsLo
fe00: 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  op);.      sqlit
fe10: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
fe20: 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20  OP_Close, 1);.  
fe30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70    }..    /* Comp
fe40: 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ute the complete
fe50: 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
fe60: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ATE statement */
fe70: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
fe80: 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   ){.      zStmt 
fe90: 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d  = createTableStm
fea0: 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65  t(db, p);.    }e
feb0: 6c 73 65 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e  lse{.      Token
fec0: 20 2a 70 45 6e 64 32 20 3d 20 74 61 62 4f 70 74   *pEnd2 = tabOpt
fed0: 73 20 3f 20 26 70 50 61 72 73 65 2d 3e 73 4c 61  s ? &pParse->sLa
fee0: 73 74 54 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a  stToken : pEnd;.
fef0: 20 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28        n = (int)(
ff00: 70 45 6e 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73  pEnd2->z - pPars
ff10: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29  e->sNameToken.z)
ff20: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e 64  ;.      if( pEnd
ff30: 32 2d 3e 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e  2->z[0]!=';' ) n
ff40: 20 2b 3d 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20   += pEnd2->n;.  
ff50: 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69      zStmt = sqli
ff60: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a  te3MPrintf(db, .
ff70: 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
ff80: 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70  E %s %.*s", zTyp
ff90: 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73  e2, n, pParse->s
ffa0: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20  NameToken.z.    
ffb0: 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
ffc0: 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68  /* A slot for th
ffd0: 65 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72  e record has alr
ffe0: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
fff0: 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20  ted in the .    
10000 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ** SQLITE_MASTER
10010 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74   table.  We just
10020 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65 20   need to update 
10030 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61  that slot with a
10040 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  ll.    ** the in
10050 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20  formation we've 
10060 63 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a  collected..    *
10070 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  /.    sqlite3Nes
10080 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
10090 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25  .      "UPDATE %
100a0 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20  Q.%s ".         
100b0 22 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20  "SET type='%s', 
100c0 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d  name=%Q, tbl_nam
100d0 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23  e=%Q, rootpage=#
100e0 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20  %d, sql=%Q ".   
100f0 20 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64      "WHERE rowid
10100 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d  =#%d",.      db-
10110 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
10120 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
10130 62 29 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c  b),.      zType,
10140 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c  .      p->zName,
10150 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c  .      p->zName,
10160 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
10170 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53  egRoot,.      zS
10180 74 6d 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73  tmt,.      pPars
10190 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20  e->regRowid.    
101a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
101b0 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b  Free(db, zStmt);
101c0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
101d0 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
101e0 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
101f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
10200 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a  INCREMENT.    /*
10210 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
10220 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61   we need to crea
10230 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71  te an sqlite_seq
10240 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a  uence table for.
10250 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74      ** keeping t
10260 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72  rack of autoincr
10270 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20  ement keys..    
10280 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 61  */.    if( p->ta
10290 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
102a0 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20  increment ){.   
102b0 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
102c0 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20  ->aDb[iDb];.    
102d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
102e0 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
102f0 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
10300 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70        if( pDb->p
10310 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d  Schema->pSeqTab=
10320 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
10330 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
10340 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
10350 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
10360 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65   %Q.sqlite_seque
10370 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a  nce(name,seq)",.
10380 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a            pDb->z
10390 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a  Name.        );.
103a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
103b0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70  ndif..    /* Rep
103c0 61 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20  arse everything 
103d0 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e  to update our in
103e0 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75  ternal data stru
103f0 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71  ctures */.    sq
10400 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73  lite3VdbeAddPars
10410 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62  eSchemaOp(v, iDb
10420 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
10430 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
10440 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 20 41  "tbl_name='%q' A
10450 4e 44 20 74 79 70 65 21 3d 27 74 72 69 67 67 65  ND type!='trigge
10460 72 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b  r'", p->zName));
10470 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20  .  }...  /* Add 
10480 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65  the table to the
10490 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
104a0 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
104b0 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
104c0 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
104d0 75 73 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  usy ){.    Table
104e0 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65   *pOld;.    Sche
104f0 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d  ma *pSchema = p-
10500 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73  >pSchema;.    as
10510 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
10520 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
10530 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
10540 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
10550 73 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d  shInsert(&pSchem
10560 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a  a->tblHash, p->z
10570 4e 61 6d 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  Name, p);.    if
10580 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  ( pOld ){.      
10590 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20  assert( p==pOld 
105a0 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75  );  /* Malloc mu
105b0 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 69  st have failed i
105c0 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65 72 74  nside HashInsert
105d0 28 29 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e  () */.      db->
105e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
105f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
10600 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
10610 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b  ->pNewTable = 0;
10620 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
10630 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
10640 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66  hanges;..#ifndef
10650 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54   SQLITE_OMIT_ALT
10660 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ERTABLE.    if( 
10670 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  !p->pSelect ){. 
10680 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
10690 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
106a0 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 73  char *)pParse->s
106b0 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20  NameToken.z;.   
106c0 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20     int nName;.  
106d0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53 65      assert( !pSe
106e0 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26 26  lect && pCons &&
106f0 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 69   pEnd );.      i
10700 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29  f( pCons->z==0 )
10710 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73 20  {.        pCons 
10720 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  = pEnd;.      }.
10730 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69        nName = (i
10740 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72 20  nt)((const char 
10750 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61  *)pCons->z - zNa
10760 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  me);.      p->ad
10770 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20  dColOffset = 13 
10780 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43 68 61  + sqlite3Utf8Cha
10790 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  rLen(zName, nNam
107a0 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
107b0 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
107c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
107d0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  ./*.** The parse
107e0 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
107f0 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  tine in order to
10800 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49   create a new VI
10810 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  EW.*/.void sqlit
10820 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20  e3CreateView(.  
10830 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
10840 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
10850 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
10860 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20  oken *pBegin,   
10870 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
10880 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
10890 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  s the statement 
108a0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
108b0 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e1,     /* The t
108c0 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
108d0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
108e0 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  view */.  Token 
108f0 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
10900 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
10910 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
10920 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 45   the view */.  E
10930 78 70 72 4c 69 73 74 20 2a 70 43 4e 61 6d 65 73  xprList *pCNames
10940 2c 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 6c 69  , /* Optional li
10950 73 74 20 6f 66 20 76 69 65 77 20 63 6f 6c 75 6d  st of view colum
10960 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 53 65 6c  n names */.  Sel
10970 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
10980 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74  /* A SELECT stat
10990 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20  ement that will 
109a0 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76  become the new v
109b0 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  iew */.  int isT
109c0 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  emp,        /* T
109d0 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52  RUE for a TEMPOR
109e0 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  ARY view */.  in
109f0 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20  t noErr         
10a00 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72 72   /* Suppress err
10a10 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66 20 56  or messages if V
10a20 49 45 57 20 61 6c 72 65 61 64 79 20 65 78 69 73  IEW already exis
10a30 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ts */.){.  Table
10a40 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20   *p;.  int n;.  
10a50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
10a60 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44   Token sEnd;.  D
10a70 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54  bFixer sFix;.  T
10a80 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b  oken *pName = 0;
10a90 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71  .  int iDb;.  sq
10aa0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
10ab0 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
10ac0 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b  Parse->nVar>0 ){
10ad0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
10ae0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70 61  rMsg(pParse, "pa
10af0 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74  rameters are not
10b00 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77   allowed in view
10b10 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s");.    sqlite3
10b20 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
10b30 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72   pSelect);.    r
10b40 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
10b50 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70  ite3StartTable(p
10b60 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
10b70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31  Name2, isTemp, 1
10b80 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70  , 0, noErr);.  p
10b90 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
10ba0 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
10bb0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
10bc0 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76   ) goto create_v
10bd0 69 65 77 5f 66 61 69 6c 3b 0a 20 20 73 71 6c 69  iew_fail;.  sqli
10be0 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
10bf0 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
10c00 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
10c10 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
10c20 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
10c30 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20   p->pSchema);.  
10c40 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
10c50 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
10c60 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65  b, "view", pName
10c70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
10c80 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c  FixSelect(&sFix,
10c90 20 70 53 65 6c 65 63 74 29 20 29 20 67 6f 74 6f   pSelect) ) goto
10ca0 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69   create_view_fai
10cb0 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20  l;..  /* Make a 
10cc0 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69  copy of the enti
10cd0 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  re SELECT statem
10ce0 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
10cf0 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20   the view..  ** 
10d00 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20  This will force 
10d10 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b  all the Expr.tok
10d20 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62  en.z values to b
10d30 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20  e dynamically.  
10d40 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74  ** allocated rat
10d50 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74  her than point t
10d60 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  o the input stri
10d70 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73  ng - which means
10d80 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20   that.  ** they 
10d90 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74  will persist aft
10da0 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  er the current s
10db0 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61  qlite3_exec() ca
10dc0 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f  ll returns..  */
10dd0 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20  .  p->pSelect = 
10de0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
10df0 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45 58  (db, pSelect, EX
10e00 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
10e10 20 70 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c   p->pCheck = sql
10e20 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
10e30 64 62 2c 20 70 43 4e 61 6d 65 73 2c 20 45 58 50  db, pCNames, EXP
10e40 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
10e50 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
10e60 69 6c 65 64 20 29 20 67 6f 74 6f 20 63 72 65 61  iled ) goto crea
10e70 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20  te_view_fail;.. 
10e80 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65   /* Locate the e
10e90 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
10ea0 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e   VIEW statement.
10eb0 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e    Make sEnd poin
10ec0 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e  t to.  ** the en
10ed0 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d  d..  */.  sEnd =
10ee0 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f   pParse->sLastTo
10ef0 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ken;.  assert( s
10f00 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20  End.z[0]!=0 );. 
10f10 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d   if( sEnd.z[0]!=
10f20 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e  ';' ){.    sEnd.
10f30 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d  z += sEnd.n;.  }
10f40 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20  .  sEnd.n = 0;. 
10f50 20 6e 20 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e   n = (int)(sEnd.
10f60 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a  z - pBegin->z);.
10f70 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b    assert( n>0 );
10f80 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a  .  z = pBegin->z
10f90 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74  ;.  while( sqlit
10fa0 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d  e3Isspace(z[n-1]
10fb0 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45  ) ){ n--; }.  sE
10fc0 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a  nd.z = &z[n-1];.
10fd0 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20    sEnd.n = 1;.. 
10fe0 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45   /* Use sqlite3E
10ff0 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64  ndTable() to add
11000 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65   the view to the
11010 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
11020 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
11030 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  3EndTable(pParse
11040 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 2c 20 30  , 0, &sEnd, 0, 0
11050 29 3b 0a 0a 63 72 65 61 74 65 5f 76 69 65 77 5f  );..create_view_
11060 66 61 69 6c 3a 0a 20 20 73 71 6c 69 74 65 33 53  fail:.  sqlite3S
11070 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
11080 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69  pSelect);.  sqli
11090 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
110a0 65 28 64 62 2c 20 70 43 4e 61 6d 65 73 29 3b 0a  e(db, pCNames);.
110b0 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
110c0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
110d0 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21  T_VIEW */..#if !
110e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
110f0 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
11100 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
11110 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
11120 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  /*.** The Table 
11130 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65  structure pTable
11140 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45   is really a VIE
11150 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  W.  Fill in the 
11160 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
11170 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76  columns of the v
11180 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c  iew in the pTabl
11190 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  e structure.  Re
111a0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a  turn the number.
111b0 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  ** of errors.  I
111c0 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65  f an error is se
111d0 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  en leave an erro
111e0 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
111f0 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f  rse->zErrMsg..*/
11200 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77  .int sqlite3View
11210 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50  GetColumnNames(P
11220 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
11230 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
11240 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20  Table *pSelTab; 
11250 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c    /* A fake tabl
11260 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20  e from which we 
11270 67 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 73  get the result s
11280 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  et */.  Select *
11290 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70  pSel;     /* Cop
112a0 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
112b0 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
112c0 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  the view */.  in
112d0 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20  t nErr = 0;     
112e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72  /* Number of err
112f0 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ors encountered 
11300 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
11310 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
11320 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20  arily holds the 
11330 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  number of cursor
11340 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20  s assigned */.  
11350 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
11360 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61  arse->db;  /* Da
11370 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
11380 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72  n for malloc err
11390 6f 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ors */.  sqlite3
113a0 5f 78 61 75 74 68 20 78 41 75 74 68 3b 20 20 20  _xauth xAuth;   
113b0 20 20 20 20 2f 2a 20 53 61 76 65 64 20 78 41 75      /* Saved xAu
113c0 74 68 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  th pointer */.  
113d0 75 38 20 62 45 6e 61 62 6c 65 64 4c 41 3b 20 20  u8 bEnabledLA;  
113e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61             /* Sa
113f0 76 65 64 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  ved db->lookasid
11400 65 2e 62 45 6e 61 62 6c 65 64 20 73 74 61 74 65  e.bEnabled state
11410 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
11420 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65  Table );..#ifnde
11430 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
11440 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
11450 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c   sqlite3VtabCall
11460 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20  Connect(pParse, 
11470 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72  pTable) ){.    r
11480 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
11490 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73  OR;.  }.  if( Is
114a0 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20  Virtual(pTable) 
114b0 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
114c0 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
114d0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f  TE_OMIT_VIEW.  /
114e0 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f  * A positive nCo
114f0 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75  l means the colu
11500 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68  mns names for th
11510 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a  is view are.  **
11520 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a   already known..
11530 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
11540 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75  e->nCol>0 ) retu
11550 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65  rn 0;..  /* A ne
11560 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61  gative nCol is a
11570 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20   special marker 
11580 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20  meaning that we 
11590 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  are currently.  
115a0 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d  ** trying to com
115b0 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pute the column 
115c0 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e  names.  If we en
115d0 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
115e0 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67   with.  ** a neg
115f0 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d  ative nCol, it m
11600 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65  eans two or more
11610 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f   views form a lo
11620 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  op, like this:. 
11630 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45   **.  **     CRE
11640 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20  ATE VIEW one AS 
11650 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77  SELECT * FROM tw
11660 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  o;.  **     CREA
11670 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53  TE VIEW two AS S
11680 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65  ELECT * FROM one
11690 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75  ;.  **.  ** Actu
116a0 61 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f 72 20  ally, the error 
116b0 61 62 6f 76 65 20 69 73 20 6e 6f 77 20 63 61 75  above is now cau
116c0 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61  ght prior to rea
116d0 63 68 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74  ching this point
116e0 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 66  ..  ** But the f
116f0 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20 69 73  ollowing test is
11700 20 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74   still important
11710 20 61 73 20 69 74 20 64 6f 65 73 20 63 6f 6d 65   as it does come
11720 20 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20   up.  ** in the 
11730 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20  following:.  ** 
11740 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
11750 20 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28   TABLE main.ex1(
11760 61 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  a);.  **     CRE
11770 41 54 45 20 54 45 4d 50 20 56 49 45 57 20 65 78  ATE TEMP VIEW ex
11780 31 20 41 53 20 53 45 4c 45 43 54 20 61 20 46 52  1 AS SELECT a FR
11790 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20  OM ex1;.  **    
117a0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
117b0 65 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20  emp.ex1;.  */.  
117c0 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
117d0 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
117e0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
117f0 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69  , "view %s is ci
11800 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64  rcularly defined
11810 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
11820 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
11830 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
11840 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29  Table->nCol>=0 )
11850 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65  ;..  /* If we ge
11860 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
11870 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20  eans we need to 
11880 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c  compute the tabl
11890 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f  e names..  ** No
118a0 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  te that the call
118b0 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c   to sqlite3Resul
118c0 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77  tSetOfSelect() w
118d0 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20  ill expand any. 
118e0 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73   ** "*" elements
118f0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20   in the results 
11900 73 65 74 20 6f 66 20 74 68 65 20 76 69 65 77 20  set of the view 
11910 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20  and will assign 
11920 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20  cursors.  ** to 
11930 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  the elements of 
11940 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
11950 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20    But we do not 
11960 77 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67  want these chang
11970 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65  es.  ** to be pe
11980 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65  rmanent.  So the
11990 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
119a0 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f  done on a copy o
119b0 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a  f the SELECT.  *
119c0 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  * statement that
119d0 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
119e0 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  w..  */.  assert
119f0 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  ( pTable->pSelec
11a00 74 20 29 3b 0a 20 20 62 45 6e 61 62 6c 65 64 4c  t );.  bEnabledL
11a10 41 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  A = db->lookasid
11a20 65 2e 62 45 6e 61 62 6c 65 64 3b 0a 20 20 69 66  e.bEnabled;.  if
11a30 28 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b  ( pTable->pCheck
11a40 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b   ){.    db->look
11a50 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d  aside.bEnabled =
11a60 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   0;.    sqlite3C
11a70 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
11a80 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c  st(pParse, pTabl
11a90 65 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20 20  e->pCheck, .    
11aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ab0 20 20 20 20 20 20 20 20 20 20 20 26 70 54 61 62             &pTab
11ac0 6c 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 6c  le->nCol, &pTabl
11ad0 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73  e->aCol);.  }els
11ae0 65 7b 0a 20 20 20 20 70 53 65 6c 20 3d 20 73 71  e{.    pSel = sq
11af0 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
11b00 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  b, pTable->pSele
11b10 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ct, 0);.    if( 
11b20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 6e 20  pSel ){.      n 
11b30 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a  = pParse->nTab;.
11b40 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
11b50 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
11b60 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e  s(pParse, pSel->
11b70 70 53 72 63 29 3b 0a 20 20 20 20 20 20 70 54 61  pSrc);.      pTa
11b80 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a  ble->nCol = -1;.
11b90 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73        db->lookas
11ba0 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30  ide.bEnabled = 0
11bb0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
11bc0 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
11bd0 49 4f 4e 0a 20 20 20 20 20 20 78 41 75 74 68 20  ION.      xAuth 
11be0 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20  = db->xAuth;.   
11bf0 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 30     db->xAuth = 0
11c00 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 20  ;.      pSelTab 
11c10 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
11c20 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
11c30 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20  e, pSel);.      
11c40 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74  db->xAuth = xAut
11c50 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70  h;.#else.      p
11c60 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
11c70 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
11c80 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b  t(pParse, pSel);
11c90 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70 50  .#endif.      pP
11ca0 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a  arse->nTab = n;.
11cb0 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61        if( pSelTa
11cc0 62 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  b ){.        ass
11cd0 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f  ert( pTable->aCo
11ce0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l==0 );.        
11cf0 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70  pTable->nCol = p
11d00 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
11d10 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43        pTable->aC
11d20 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
11d30 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c  ol;.        pSel
11d40 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
11d50 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e         pSelTab->
11d60 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
11d70 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
11d80 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62  able(db, pSelTab
11d90 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
11da0 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
11db0 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
11dc0 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
11dd0 29 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ) );.      }else
11de0 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c 65  {.        pTable
11df0 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
11e00 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20      nErr++;.    
11e10 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
11e20 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
11e30 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 20 65  , pSel);.    } e
11e40 6c 73 65 20 7b 0a 20 20 20 20 20 20 6e 45 72 72  lse {.      nErr
11e50 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
11e60 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45  db->lookaside.bE
11e70 6e 61 62 6c 65 64 20 3d 20 62 45 6e 61 62 6c 65  nabled = bEnable
11e80 64 4c 41 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70  dLA;.  pTable->p
11e90 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 46 6c  Schema->schemaFl
11ea0 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65  ags |= DB_Unrese
11eb0 74 56 69 65 77 73 3b 0a 23 65 6e 64 69 66 20 2f  tViews;.#endif /
11ec0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
11ed0 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e  EW */.  return n
11ee0 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20  Err;  .}.#endif 
11ef0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
11f00 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
11f10 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
11f20 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
11f30 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  LE) */..#ifndef 
11f40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
11f50 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
11f60 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72   column names fr
11f70 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e  om every VIEW in
11f80 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a   database idx..*
11f90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
11fa0 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
11fb0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
11fc0 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c  t idx){.  HashEl
11fd0 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72 74 28  em *i;.  assert(
11fe0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
11ff0 74 65 78 48 65 6c 64 28 64 62 2c 20 69 64 78 2c  texHeld(db, idx,
12000 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21 44 62   0) );.  if( !Db
12010 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20  HasProperty(db, 
12020 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56  idx, DB_UnresetV
12030 69 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a  iews) ) return;.
12040 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
12050 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62  shFirst(&db->aDb
12060 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  [idx].pSchema->t
12070 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c  blHash); i;i=sql
12080 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
12090 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
120a0 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
120b0 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54  a(i);.    if( pT
120c0 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
120d0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
120e0 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62  teColumnNames(db
120f0 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 70  , pTab);.      p
12100 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
12110 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20       pTab->nCol 
12120 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
12130 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79   DbClearProperty
12140 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
12150 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65  esetViews);.}.#e
12160 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c  lse.# define sql
12170 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
12180 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  A,B).#endif /* S
12190 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
121a0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
121b0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
121c0 64 20 62 79 20 74 68 65 20 56 44 42 45 20 74 6f  d by the VDBE to
121d0 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65   adjust the inte
121e0 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75  rnal schema.** u
121f0 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68  sed by SQLite wh
12200 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  en the btree lay
12210 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65  er moves a table
12220 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a   root page. The.
12230 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20  ** root-page of 
12240 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
12250 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   in database iDb
12260 20 68 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f   has changed fro
12270 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54  m iFrom.** to iT
12280 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20  o..**.** Ticket 
12290 23 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62  #1728:  The symb
122a0 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73  ol table might s
122b0 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66  till contain inf
122c0 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74  ormation.** on t
122d0 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64  ables and/or ind
122e0 69 63 65 73 20 74 68 61 74 20 61 72 65 20 74 68  ices that are th
122f0 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69  e process of bei
12300 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49  ng deleted..** I
12310 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b  f you are unluck
12320 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  y, one of those 
12330 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20  deleted indices 
12340 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a  or tables might.
12350 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ** have the same
12360 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72   rootpage number
12370 20 61 73 20 74 68 65 20 72 65 61 6c 20 74 61 62   as the real tab
12380 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74  le or index that
12390 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76   is.** being mov
123a0 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f  ed.  So we canno
123b0 74 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67  t stop searching
123c0 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74   after the first
123d0 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75   match .** becau
123e0 73 65 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  se the first mat
123f0 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20  ch might be for 
12400 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74  one of the delet
12410 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72  ed indices.** or
12420 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20   tables and not 
12430 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20  the table/index 
12440 74 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79  that is actually
12450 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a   being moved..**
12460 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75   We must continu
12470 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  e looping until 
12480 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69  all tables and i
12490 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72  ndices with.** r
124a0 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68  ootpage==iFrom h
124b0 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74  ave been convert
124c0 65 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f  ed to have a roo
124d0 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20  tpage of iTo.** 
124e0 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63  in order to be c
124f0 65 72 74 61 69 6e 20 74 68 61 74 20 77 65 20 67  ertain that we g
12500 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65  ot the right one
12510 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
12520 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
12530 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  UUM.void sqlite3
12540 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73 71  RootPageMoved(sq
12550 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
12560 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  Db, int iFrom, i
12570 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45  nt iTo){.  HashE
12580 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61  lem *pElem;.  Ha
12590 73 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62 20  sh *pHash;.  Db 
125a0 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pDb;..  assert(
125b0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
125c0 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
125d0 20 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26   0) );.  pDb = &
125e0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
125f0 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53  pHash = &pDb->pS
12600 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a  chema->tblHash;.
12610 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
12620 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73  teHashFirst(pHas
12630 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
12640 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
12650 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62  pElem)){.    Tab
12660 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
12670 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
12680 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
12690 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  tnum==iFrom ){. 
126a0 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20       pTab->tnum 
126b0 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  = iTo;.    }.  }
126c0 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d  .  pHash = &pDb-
126d0 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
126e0 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  h;.  for(pElem=s
126f0 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70  qliteHashFirst(p
12700 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
12710 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
12720 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
12730 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71  Index *pIdx = sq
12740 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
12750 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  em);.    if( pId
12760 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29  x->tnum==iFrom )
12770 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e  {.      pIdx->tn
12780 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a  um = iTo;.    }.
12790 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
127a0 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74  .** Write code t
127b0 6f 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c  o erase the tabl
127c0 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
127d0 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74   iTable from dat
127e0 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c  abase iDb..** Al
127f0 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f  so write code to
12800 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69   modify the sqli
12810 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
12820 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  and internal sch
12830 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74  ema.** if a root
12840 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72  -page of another
12850 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20   table is moved 
12860 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79  by the btree-lay
12870 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61  er whilst.** era
12880 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69  sing iTable (thi
12890 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74  s can happen wit
128a0 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  h an auto-vacuum
128b0 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a   database)..*/ .
128c0 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74  static void dest
128d0 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73  royRootPage(Pars
128e0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
128f0 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b  Table, int iDb){
12900 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
12910 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
12920 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20  se);.  int r1 = 
12930 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
12940 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
12950 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
12960 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54  , OP_Destroy, iT
12970 61 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a  able, r1, iDb);.
12980 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
12990 74 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64  t(pParse);.#ifnd
129a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
129b0 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f  UTOVACUUM.  /* O
129c0 50 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73  P_Destroy stores
129d0 20 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72   an in integer r
129e0 31 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67  1. If this integ
129f0 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a  er.  ** is non-z
12a00 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ero, then it is 
12a10 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
12a20 6d 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20  mber of a table 
12a30 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f  moved to.  ** lo
12a40 63 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54  cation iTable. T
12a50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
12a60 65 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73  e modifies the s
12a70 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
12a80 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65  le to.  ** refle
12a90 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20  ct this..  **.  
12aa0 2a 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e  ** The "#NNN" in
12ab0 20 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70   the SQL is a sp
12ac0 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74  ecial constant t
12ad0 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76  hat means whatev
12ae0 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73  er value.  ** is
12af0 20 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e   in register NNN
12b00 2e 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72  .  See grammar r
12b10 75 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ules associated 
12b20 77 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49  with the TK_REGI
12b30 53 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20  STER.  ** token 
12b40 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
12b50 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f  nformation..  */
12b60 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  .  sqlite3Nested
12b70 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
12b80 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
12b90 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25  s SET rootpage=%
12ba0 64 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20  d WHERE #%d AND 
12bb0 72 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20  rootpage=#%d",. 
12bc0 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
12bd0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
12be0 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
12bf0 29 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72  ), iTable, r1, r
12c00 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  1);.#endif.  sql
12c10 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
12c20 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
12c30 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56  }../*.** Write V
12c40 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73  DBE code to eras
12c50 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  e table pTab and
12c60 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20   all associated 
12c70 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e  indices on disk.
12c80 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61  .** Code to upda
12c90 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  te the sqlite_ma
12ca0 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20  ster tables and 
12cb0 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
12cc0 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69  definitions.** i
12cd0 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61  n case a root-pa
12ce0 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
12cf0 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
12d00 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
12d10 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20  ree layer.** is 
12d20 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73  also added (this
12d30 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
12d40 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
12d50 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74  database)..*/.st
12d60 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f  atic void destro
12d70 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  yTable(Parse *pP
12d80 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
12d90 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
12da0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
12db0 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  M.  Index *pIdx;
12dc0 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
12dd0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
12de0 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
12df0 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
12e00 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
12e10 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e  pParse, pTab->tn
12e20 75 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28  um, iDb);.  for(
12e30 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
12e40 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
12e50 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
12e60 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
12e70 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e  pParse, pIdx->tn
12e80 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65  um, iDb);.  }.#e
12e90 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  lse.  /* If the 
12ea0 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20  database may be 
12eb0 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61  auto-vacuum capa
12ec0 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f  ble (if SQLITE_O
12ed0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
12ee0 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e   ** is not defin
12ef0 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ed), then it is 
12f00 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c  important to cal
12f10 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20  l OP_Destroy on 
12f20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61  the.  ** table a
12f30 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61  nd index root-pa
12f40 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74  ges in order, st
12f50 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20  arting with the 
12f60 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a  numerically .  *
12f70 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  * largest root-p
12f80 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73  age number. This
12f90 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
12fa0 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f   none of the roo
12fb0 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20  t-pages.  ** to 
12fc0 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20  be destroyed is 
12fd0 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20  relocated by an 
12fe0 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72  earlier OP_Destr
12ff0 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a  oy. i.e. if the.
13000 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77    ** following w
13010 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a  ere coded:.  **.
13020 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
13030 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a  4 0.  ** ....  *
13040 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30  * OP_Destroy 5 0
13050 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72  .  **.  ** and r
13060 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65  oot page 5 happe
13070 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61  ned to be the la
13080 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
13090 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20  number in the.  
130a0 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
130b0 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f  n root page 5 wo
130c0 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20  uld be moved to 
130d0 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20  page 4 by the . 
130e0 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20   ** "OP_Destroy 
130f0 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65  4 0" opcode. The
13100 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f   subsequent "OP_
13110 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75  Destroy 5 0" wou
13120 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72  ld hit.  ** a fr
13130 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20  ee-list page..  
13140 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
13150 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e  pTab->tnum;.  in
13160 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30  t iDestroyed = 0
13170 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  ;..  while( 1 ){
13180 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
13190 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65  ;.    int iLarge
131a0 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  st = 0;..    if(
131b0 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c   iDestroyed==0 |
131c0 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65  | iTab<iDestroye
131d0 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67  d ){.      iLarg
131e0 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  est = iTab;.    
131f0 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  }.    for(pIdx=p
13200 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
13210 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
13220 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
13230 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75  iIdx = pIdx->tnu
13240 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
13250 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d   pIdx->pSchema==
13260 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
13270 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73  .      if( (iDes
13280 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49  troyed==0 || (iI
13290 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20  dx<iDestroyed)) 
132a0 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74  && iIdx>iLargest
132b0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72   ){.        iLar
132c0 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20  gest = iIdx;.   
132d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
132e0 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29  f( iLargest==0 )
132f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  {.      return;.
13300 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13310 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
13320 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
13330 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
13340 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
13350 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
13360 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d 3e   && iDb<pParse->
13370 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20  db->nDb );.     
13380 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
13390 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73  (pParse, iLarges
133a0 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69  t, iDb);.      i
133b0 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72  Destroyed = iLar
133c0 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gest;.    }.  }.
133d0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
133e0 52 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66  Remove entries f
133f0 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73  rom the sqlite_s
13400 74 61 74 4e 20 74 61 62 6c 65 73 20 28 66 6f 72  tatN tables (for
13410 20 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a 2a   N in (1,2,3)).*
13420 2a 20 61 66 74 65 72 20 61 20 44 52 4f 50 20 49  * after a DROP I
13430 4e 44 45 58 20 6f 72 20 44 52 4f 50 20 54 41 42  NDEX or DROP TAB
13440 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73  LE command..*/.s
13450 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
13460 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65  e3ClearStatTable
13470 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
13480 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
13490 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
134a0 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
134b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
134c0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6e  * The database n
134d0 75 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  umber */.  const
134e0 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20 20   char *zType,   
134f0 20 20 2f 2a 20 22 69 64 78 22 20 6f 72 20 22 74    /* "idx" or "t
13500 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  bl" */.  const c
13510 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20  har *zName      
13520 2f 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65 78  /* Name of index
13530 20 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a   or table */.){.
13540 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
13550 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d   char *zDbName =
13560 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
13570 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 66  [iDb].zName;.  f
13580 6f 72 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b  or(i=1; i<=4; i+
13590 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 61  +){.    char zTa
135a0 62 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74  b[24];.    sqlit
135b0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
135c0 6f 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73  of(zTab),zTab,"s
135d0 71 6c 69 74 65 5f 73 74 61 74 25 64 22 2c 69 29  qlite_stat%d",i)
135e0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
135f0 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
13600 65 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62  e->db, zTab, zDb
13610 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73  Name) ){.      s
13620 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
13630 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
13640 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
13650 51 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25 51  Q.%s WHERE %s=%Q
13660 22 2c 0a 20 20 20 20 20 20 20 20 7a 44 62 4e 61  ",.        zDbNa
13670 6d 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c  me, zTab, zType,
13680 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a   zName.      );.
13690 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
136a0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
136b0 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65   to drop a table
136c0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
136d0 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 50  3CodeDropTable(P
136e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
136f0 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69  ble *pTab, int i
13700 44 62 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b  Db, int isView){
13710 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
13720 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
13730 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65  se->db;.  Trigge
13740 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 44  r *pTrigger;.  D
13750 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
13760 62 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73  b[iDb];..  v = s
13770 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
13780 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
13790 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   v!=0 );.  sqlit
137a0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
137b0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
137c0 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
137d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
137e0 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49  UALTABLE.  if( I
137f0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
13800 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
13810 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42  eAddOp0(v, OP_VB
13820 65 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  egin);.  }.#endi
13830 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  f..  /* Drop all
13840 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69   triggers associ
13850 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
13860 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
13870 64 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20  d. Code.  ** is 
13880 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d  generated to rem
13890 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  ove entries from
138a0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61   sqlite_master a
138b0 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74  nd/or.  ** sqlit
138c0 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66  e_temp_master if
138d0 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
138e0 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c    pTrigger = sql
138f0 69 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28  ite3TriggerList(
13900 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
13910 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72   while( pTrigger
13920 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
13930 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
13940 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
13950 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 70 54 72   || .        pTr
13960 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d  igger->pSchema==
13970 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
13980 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ma );.    sqlite
13990 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28  3DropTriggerPtr(
139a0 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72  pParse, pTrigger
139b0 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 20  );.    pTrigger 
139c0 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78  = pTrigger->pNex
139d0 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  t;.  }..#ifndef 
139e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
139f0 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52  INCREMENT.  /* R
13a00 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65  emove any entrie
13a10 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  s of the sqlite_
13a20 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61  sequence table a
13a30 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20  ssociated with. 
13a40 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65   ** the table be
13a50 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69  ing dropped. Thi
13a60 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65  s is done before
13a70 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72   the table is dr
13a80 6f 70 70 65 64 0a 20 20 2a 2a 20 61 74 20 74 68  opped.  ** at th
13a90 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69  e btree level, i
13aa0 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74  n case the sqlit
13ab0 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
13ac0 20 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d   needs to.  ** m
13ad0 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20  ove as a result 
13ae0 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e  of the drop (can
13af0 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d   happen in auto-
13b00 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20  vacuum mode)..  
13b10 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74  */.  if( pTab->t
13b20 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
13b30 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20  oincrement ){.  
13b40 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
13b50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
13b60 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
13b70 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %Q.sqlite_sequen
13b80 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ce WHERE name=%Q
13b90 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  ",.      pDb->zN
13ba0 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
13bb0 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  .    );.  }.#end
13bc0 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c  if..  /* Drop al
13bd0 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  l SQLITE_MASTER 
13be0 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
13bf0 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66  entries that ref
13c00 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74  er to the.  ** t
13c10 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61  able. The progra
13c20 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72  m name loops thr
13c30 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20  ough the master 
13c40 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65  table and delete
13c50 73 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77  s.  ** every row
13c60 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
13c70 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73  a table of the s
13c80 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
13c90 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64  one being.  ** d
13ca0 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73  ropped. Triggers
13cb0 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
13cc0 61 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20  arately because 
13cd0 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65  a trigger can be
13ce0 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e  .  ** created in
13cf0 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
13d00 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74  se that refers t
13d10 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f  o a table in ano
13d20 74 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62 61  ther.  ** databa
13d30 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  se..  */.  sqlit
13d40 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
13d50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44 45  arse, .      "DE
13d60 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
13d70 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25  WHERE tbl_name=%
13d80 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69  Q and type!='tri
13d90 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70 44  gger'",.      pD
13da0 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b->zName, SCHEMA
13db0 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54 61  _TABLE(iDb), pTa
13dc0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b->zName);.  if(
13dd0 20 21 69 73 56 69 65 77 20 26 26 20 21 49 73 56   !isView && !IsV
13de0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
13df0 20 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65      destroyTable
13e00 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
13e10 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65    }..  /* Remove
13e20 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
13e30 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69   from SQLite's i
13e40 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61  nternal schema a
13e50 6e 64 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74  nd modify.  ** t
13e60 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
13e70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  ..  */.  if( IsV
13e80 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
13e90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13ea0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73  ddOp4(v, OP_VDes
13eb0 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c  troy, iDb, 0, 0,
13ec0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
13ed0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
13ee0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
13ef0 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20  DropTable, iDb, 
13f00 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  0, 0, pTab->zNam
13f10 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  e, 0);.  sqlite3
13f20 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
13f30 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c  rse, iDb);.  sql
13f40 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
13f50 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  db, iDb);.}../*.
13f60 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13f70 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20  is called to do 
13f80 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52  the work of a DR
13f90 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  OP TABLE stateme
13fa0 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20  nt..** pName is 
13fb0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
13fc0 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70  table to be drop
13fd0 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ped..*/.void sql
13fe0 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61  ite3DropTable(Pa
13ff0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
14000 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
14010 20 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45   isView, int noE
14020 72 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  rr){.  Table *pT
14030 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  ab;.  Vdbe *v;. 
14040 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
14050 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
14060 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d   iDb;..  if( db-
14070 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
14080 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
14090 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
140a0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
140b0 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73  >nErr==0 );.  as
140c0 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
140d0 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 73 71  c==1 );.  if( sq
140e0 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
140f0 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65  pParse) ) goto e
14100 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
14110 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62    if( noErr ) db
14120 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2b 2b 3b  ->suppressErr++;
14130 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
14140 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d  3LocateTableItem
14150 28 70 50 61 72 73 65 2c 20 69 73 56 69 65 77 2c  (pParse, isView,
14160 20 26 70 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a   &pName->a[0]);.
14170 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62    if( noErr ) db
14180 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2d 2d 3b  ->suppressErr--;
14190 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ..  if( pTab==0 
141a0 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45 72 72  ){.    if( noErr
141b0 20 29 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65   ) sqlite3CodeVe
141c0 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28  rifyNamedSchema(
141d0 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61  pParse, pName->a
141e0 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
141f0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
14200 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  op_table;.  }.  
14210 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
14220 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
14230 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
14240 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
14250 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
14260 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61 62 20  ;..  /* If pTab 
14270 69 73 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  is a virtual tab
14280 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77 47 65 74  le, call ViewGet
14290 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 74 6f  ColumnNames() to
142a0 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20 69 74 20   ensure.  ** it 
142b0 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a  is initialized..
142c0 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72    */.  if( IsVir
142d0 74 75 61 6c 28 70 54 61 62 29 20 26 26 20 73 71  tual(pTab) && sq
142e0 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
142f0 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
14300 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67 6f 74  pTab) ){.    got
14310 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
14320 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  e;.  }.#ifndef S
14330 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
14340 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
14350 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63   int code;.    c
14360 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
14370 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  = SCHEMA_TABLE(i
14380 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  Db);.    const c
14390 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
143a0 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
143b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
143c0 41 72 67 32 20 3d 20 30 3b 0a 20 20 20 20 69 66  Arg2 = 0;.    if
143d0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
143e0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
143f0 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20  E_DELETE, zTab, 
14400 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20  0, zDb)){.      
14410 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
14420 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  able;.    }.    
14430 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20  if( isView ){.  
14440 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
14450 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
14460 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
14470 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
14480 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65  P_VIEW;.      }e
14490 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
144a0 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
144b0 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69  VIEW;.      }.#i
144c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
144d0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
144e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56     }else if( IsV
144f0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
14500 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
14510 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b  ITE_DROP_VTABLE;
14520 0a 20 20 20 20 20 20 7a 41 72 67 32 20 3d 20 73  .      zArg2 = s
14530 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28  qlite3GetVTable(
14540 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d 6f 64 2d  db, pTab)->pMod-
14550 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20  >zName;.#endif. 
14560 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14570 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
14580 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
14590 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
145a0 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41  ITE_DROP_TEMP_TA
145b0 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
145c0 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
145d0 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42   SQLITE_DROP_TAB
145e0 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LE;.      }.    
145f0 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
14600 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
14610 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a  e, code, pTab->z
14620 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62  Name, zArg2, zDb
14630 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
14640 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
14650 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
14660 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
14670 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
14680 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61  ELETE, pTab->zNa
14690 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
146a0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
146b0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
146c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
146d0 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
146e0 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22  p(pTab->zName, "
146f0 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20  sqlite_", 7)==0 
14700 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53  .    && sqlite3S
14710 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e  trNICmp(pTab->zN
14720 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 74 61  ame, "sqlite_sta
14730 74 22 2c 20 31 31 29 21 3d 30 20 29 7b 0a 20 20  t", 11)!=0 ){.  
14740 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
14750 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
14760 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64   %s may not be d
14770 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a  ropped", pTab->z
14780 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
14790 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
147a0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
147b0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
147c0 20 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20   /* Ensure DROP 
147d0 54 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65  TABLE is not use
147e0 64 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64  d on a view, and
147f0 20 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f   DROP VIEW is no
14800 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61  t used.  ** on a
14810 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
14820 66 28 20 69 73 56 69 65 77 20 26 26 20 70 54 61  f( isView && pTa
14830 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  b->pSelect==0 ){
14840 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
14850 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73  rMsg(pParse, "us
14860 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20  e DROP TABLE to 
14870 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22  delete table %s"
14880 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
14890 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
148a0 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  op_table;.  }.  
148b0 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20 70  if( !isView && p
148c0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
148d0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
148e0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65  Msg(pParse, "use
148f0 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65   DROP VIEW to de
14900 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c 20 70  lete view %s", p
14910 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
14920 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
14930 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69  table;.  }.#endi
14940 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
14950 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
14960 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
14970 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a  he master table.
14980 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20    ** on disk..  
14990 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
149a0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
149b0 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
149c0 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
149d0 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
149e0 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 1, iDb);.    
149f0 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74  sqlite3ClearStat
14a00 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69  Tables(pParse, i
14a10 44 62 2c 20 22 74 62 6c 22 2c 20 70 54 61 62 2d  Db, "tbl", pTab-
14a20 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
14a30 69 74 65 33 46 6b 44 72 6f 70 54 61 62 6c 65 28  ite3FkDropTable(
14a40 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70  pParse, pName, p
14a50 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Tab);.    sqlite
14a60 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 70  3CodeDropTable(p
14a70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 44 62  Parse, pTab, iDb
14a80 2c 20 69 73 56 69 65 77 29 3b 0a 20 20 7d 0a 0a  , isView);.  }..
14a90 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a  exit_drop_table:
14aa0 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
14ab0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d  tDelete(db, pNam
14ac0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  e);.}../*.** Thi
14ad0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
14ae0 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  led to create a 
14af0 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  new foreign key 
14b00 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  on the table.** 
14b10 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
14b20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70  construction.  p
14b30 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e  FromCol determin
14b40 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73  es which columns
14b50 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65  .** in the curre
14b60 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74  nt table point t
14b70 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  o the foreign ke
14b80 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d  y.  If pFromCol=
14b90 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65  =0 then.** conne
14ba0 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68  ct the key to th
14bb0 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e  e last column in
14bc0 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20  serted.  pTo is 
14bd0 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74  the name of.** t
14be0 68 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65  he table referre
14bf0 64 20 74 6f 20 28 61 2e 6b 2e 61 20 74 68 65 20  d to (a.k.a the 
14c00 22 70 61 72 65 6e 74 22 20 74 61 62 6c 65 29 2e  "parent" table).
14c10 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69    pToCol is a li
14c20 73 74 0a 2a 2a 20 6f 66 20 74 61 62 6c 65 73 20  st.** of tables 
14c30 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 54  in the parent pT
14c40 6f 20 74 61 62 6c 65 2e 20 20 66 6c 61 67 73 20  o table.  flags 
14c50 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20  contains all.** 
14c60 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
14c70 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72  t the conflict r
14c80 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
14c90 74 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a  thms specified.*
14ca0 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45  * in the ON DELE
14cb0 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e  TE, ON UPDATE an
14cc0 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75  d ON INSERT clau
14cd0 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b  ses..**.** An FK
14ce0 65 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ey structure is 
14cf0 63 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65  created and adde
14d00 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  d to the table c
14d10 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65  urrently.** unde
14d20 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69  r construction i
14d30 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e  n the pParse->pN
14d40 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a  ewTable field..*
14d50 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e  *.** The foreign
14d60 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72 20   key is set for 
14d70 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73  IMMEDIATE proces
14d80 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75  sing.  A subsequ
14d90 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73  ent call.** to s
14da0 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
14db0 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68  gnKey() might ch
14dc0 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45 46  ange this to DEF
14dd0 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ERRED..*/.void s
14de0 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65  qlite3CreateFore
14df0 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20  ignKey(.  Parse 
14e00 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
14e10 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
14e20 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
14e30 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43  *pFromCol,  /* C
14e40 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74  olumns in this t
14e50 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20  able that point 
14e60 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  to other table *
14e70 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20  /.  Token *pTo, 
14e80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
14e90 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74 61   of the other ta
14ea0 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
14eb0 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a  t *pToCol,    /*
14ec0 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   Columns in the 
14ed0 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
14ee0 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
14ef0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63        /* Conflic
14f00 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
14f10 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20  orithms. */.){. 
14f20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
14f30 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64  Parse->db;.#ifnd
14f40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
14f50 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65  OREIGN_KEY.  FKe
14f60 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20  y *pFKey = 0;.  
14f70 46 4b 65 79 20 2a 70 4e 65 78 74 54 6f 3b 0a 20  FKey *pNextTo;. 
14f80 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72   Table *p = pPar
14f90 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
14fa0 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e   int nByte;.  in
14fb0 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  t i;.  int nCol;
14fc0 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61  .  char *z;..  a
14fd0 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b  ssert( pTo!=0 );
14fe0 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 49  .  if( p==0 || I
14ff0 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
15000 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
15010 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20  if( pFromCol==0 
15020 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  ){.    int iCol 
15030 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20  = p->nCol-1;.   
15040 20 69 66 28 20 4e 45 56 45 52 28 69 43 6f 6c 3c   if( NEVER(iCol<
15050 30 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  0) ) goto fk_end
15060 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c  ;.    if( pToCol
15070 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
15080 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  r!=1 ){.      sq
15090 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
150a0 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b  arse, "foreign k
150b0 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20  ey on %s".      
150c0 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65     " should refe
150d0 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63  rence only one c
150e0 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25  olumn of table %
150f0 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e  T",.         p->
15100 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
15110 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f  , pTo);.      go
15120 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d  to fk_end;.    }
15130 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20  .    nCol = 1;. 
15140 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f   }else if( pToCo
15150 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78  l && pToCol->nEx
15160 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  pr!=pFromCol->nE
15170 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
15180 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15190 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62  e,.        "numb
151a0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
151b0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65   foreign key doe
151c0 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
151d0 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20  number of ".    
151e0 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20      "columns in 
151f0 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
15200 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f  able");.    goto
15210 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65   fk_end;.  }else
15220 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72  {.    nCol = pFr
15230 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20  omCol->nExpr;.  
15240 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  }.  nByte = size
15250 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43  of(*pFKey) + (nC
15260 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b  ol-1)*sizeof(pFK
15270 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70  ey->aCol[0]) + p
15280 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28  To->n + 1;.  if(
15290 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66   pToCol ){.    f
152a0 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c  or(i=0; i<pToCol
152b0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
152c0 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71       nByte += sq
152d0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54  lite3Strlen30(pT
152e0 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
152f0 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) + 1;.    }.  }
15300 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74  .  pFKey = sqlit
15310 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
15320 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  b, nByte );.  if
15330 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20  ( pFKey==0 ){.  
15340 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
15350 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f   }.  pFKey->pFro
15360 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e  m = p;.  pFKey->
15370 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70  pNextFrom = p->p
15380 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61  FKey;.  z = (cha
15390 72 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  r*)&pFKey->aCol[
153a0 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e  nCol];.  pFKey->
153b0 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70  zTo = z;.  memcp
153c0 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f  y(z, pTo->z, pTo
153d0 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e  ->n);.  z[pTo->n
153e0 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
153f0 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20  Dequote(z);.  z 
15400 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70  += pTo->n+1;.  p
15410 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f  FKey->nCol = nCo
15420 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  l;.  if( pFromCo
15430 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65  l==0 ){.    pFKe
15440 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d  y->aCol[0].iFrom
15450 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
15460 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
15470 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
15480 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  {.      int j;. 
15490 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
154a0 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  p->nCol; j++){. 
154b0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
154c0 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f  e3StrICmp(p->aCo
154d0 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f  l[j].zName, pFro
154e0 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
154f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
15500 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
15510 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20  .iFrom = j;.    
15520 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15540 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e       if( j>=p->n
15550 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Col ){.        s
15560 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
15570 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
15580 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d    "unknown colum
15590 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65  n \"%s\" in fore
155a0 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
155b0 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  on", .          
155c0 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
155d0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
155e0 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
155f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
15600 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
15610 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
15620 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
15630 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
15640 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61  rlen30(pToCol->a
15650 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
15660 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
15670 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20  .zCol = z;.     
15680 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f   memcpy(z, pToCo
15690 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e  l->a[i].zName, n
156a0 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20  );.      z[n] = 
156b0 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b  0;.      z += n+
156c0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
156d0 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
156e0 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61   = 0;.  pFKey->a
156f0 41 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29  Action[0] = (u8)
15700 28 66 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20  (flags & 0xff); 
15710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e             /* ON
15720 20 44 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a   DELETE action *
15730 2f 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69  /.  pFKey->aActi
15740 6f 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c  on[1] = (u8)((fl
15750 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66  ags >> 8 ) & 0xf
15760 66 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44  f);    /* ON UPD
15770 41 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20  ATE action */.. 
15780 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15790 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
157a0 64 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d  db, 0, p->pSchem
157b0 61 29 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20  a) );.  pNextTo 
157c0 3d 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65  = (FKey *)sqlite
157d0 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e  3HashInsert(&p->
157e0 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73  pSchema->fkeyHas
157f0 68 2c 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  h, .      pFKey-
15800 3e 7a 54 6f 2c 20 28 76 6f 69 64 20 2a 29 70 46  >zTo, (void *)pF
15810 4b 65 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 70  Key.  );.  if( p
15820 4e 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b  NextTo==pFKey ){
15830 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
15840 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 67  ailed = 1;.    g
15850 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a  oto fk_end;.  }.
15860 20 20 69 66 28 20 70 4e 65 78 74 54 6f 20 29 7b    if( pNextTo ){
15870 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
15880 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30  xtTo->pPrevTo==0
15890 20 29 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70   );.    pFKey->p
158a0 4e 65 78 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f  NextTo = pNextTo
158b0 3b 0a 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70  ;.    pNextTo->p
158c0 50 72 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a  PrevTo = pFKey;.
158d0 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74    }..  /* Link t
158e0 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74  he foreign key t
158f0 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74  o the table as t
15900 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20  he last step..  
15910 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20  */.  p->pFKey = 
15920 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d  pFKey;.  pFKey =
15930 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73   0;..fk_end:.  s
15940 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
15950 20 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20   pFKey);.#endif 
15960 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
15970 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
15980 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  KEY) */.  sqlite
15990 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
159a0 64 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20  db, pFromCol);. 
159b0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
159c0 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 6f  Delete(db, pToCo
159d0 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  l);.}../*.** Thi
159e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
159f0 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54  led when an INIT
15a00 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20  IALLY IMMEDIATE 
15a10 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  or INITIALLY DEF
15a20 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20  ERRED.** clause 
15a30 69 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 20  is seen as part 
15a40 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79  of a foreign key
15a50 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68   definition.  Th
15a60 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20  e isDeferred.** 
15a70 70 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 66  parameter is 1 f
15a80 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  or INITIALLY DEF
15a90 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20  ERRED and 0 for 
15aa0 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
15ab0 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61  ATE..** The beha
15ac0 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74  vior of the most
15ad0 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65   recently create
15ae0 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73  d foreign key is
15af0 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63   adjusted.** acc
15b00 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69  ordingly..*/.voi
15b10 64 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f  d sqlite3DeferFo
15b20 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a  reignKey(Parse *
15b30 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65  pParse, int isDe
15b40 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66  ferred){.#ifndef
15b50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
15b60 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65  EIGN_KEY.  Table
15b70 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a   *pTab;.  FKey *
15b80 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54  pFKey;.  if( (pT
15b90 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
15ba0 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70  wTable)==0 || (p
15bb0 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b  FKey = pTab->pFK
15bc0 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ey)==0 ) return;
15bd0 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 65 66  .  assert( isDef
15be0 65 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65  erred==0 || isDe
15bf0 66 65 72 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20  ferred==1 ); /* 
15c00 45 56 3a 20 52 2d 33 30 33 32 33 2d 32 31 39 31  EV: R-30323-2191
15c10 37 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73  7 */.  pFKey->is
15c20 44 65 66 65 72 72 65 64 20 3d 20 28 75 38 29 69  Deferred = (u8)i
15c30 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69  sDeferred;.#endi
15c40 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  f.}../*.** Gener
15c50 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
15c60 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65 66  ll erase and ref
15c70 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e  ill index *pIdx.
15c80 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65    This is.** use
15c90 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
15ca0 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20  a newly created 
15cb0 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f  index or to reco
15cc0 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e  mpute the.** con
15cd0 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  tent of an index
15ce0 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20   in response to 
15cf0 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e  a REINDEX comman
15d00 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52  d..**.** if memR
15d10 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  ootPage is not n
15d20 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e  egative, it mean
15d30 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78  s that the index
15d40 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65   is newly.** cre
15d50 61 74 65 64 2e 20 20 54 68 65 20 72 65 67 69 73  ated.  The regis
15d60 74 65 72 20 73 70 65 63 69 66 69 65 64 20 62 79  ter specified by
15d70 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e   memRootPage con
15d80 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  tains the.** roo
15d90 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
15da0 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20   the index.  If 
15db0 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e  memRootPage is n
15dc0 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a  egative, then.**
15dd0 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61   the index alrea
15de0 64 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75  dy exists and mu
15df0 73 74 20 62 65 20 63 6c 65 61 72 65 64 20 62 65  st be cleared be
15e00 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c  fore being refil
15e10 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72  led and.** the r
15e20 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
15e30 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  of the index is 
15e40 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65  taken from pInde
15e50 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74  x->tnum..*/.stat
15e60 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52  ic void sqlite3R
15e70 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65  efillIndex(Parse
15e80 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
15e90 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d  *pIndex, int mem
15ea0 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62  RootPage){.  Tab
15eb0 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
15ec0 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54  x->pTable;  /* T
15ed0 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
15ee0 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
15ef0 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d  t iTab = pParse-
15f00 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20  >nTab++;     /* 
15f10 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65  Btree cursor use
15f20 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20  d for pTab */.  
15f30 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72 73  int iIdx = pPars
15f40 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f  e->nTab++;     /
15f50 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75  * Btree cursor u
15f60 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a  sed for pIndex *
15f70 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 65 72 3b  /.  int iSorter;
15f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f90 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65     /* Cursor ope
15fa0 6e 65 64 20 62 79 20 4f 70 65 6e 53 6f 72 74 65  ned by OpenSorte
15fb0 72 20 28 69 66 20 69 6e 20 75 73 65 29 20 2a 2f  r (if in use) */
15fc0 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20  .  int addr1;   
15fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fe0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
15ff0 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20  top of loop */. 
16000 20 69 6e 74 20 61 64 64 72 32 3b 20 20 20 20 20   int addr2;     
16010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16020 2f 2a 20 41 64 64 72 65 73 73 20 74 6f 20 6a 75  /* Address to ju
16030 6d 70 20 74 6f 20 66 6f 72 20 6e 65 78 74 20 69  mp to for next i
16040 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  teration */.  in
16050 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  t tnum;         
16060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16070 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64  Root page of ind
16080 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ex */.  int iPar
16090 74 49 64 78 4c 61 62 65 6c 3b 20 20 20 20 20 20  tIdxLabel;      
160a0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74         /* Jump t
160b0 6f 20 74 68 69 73 20 6c 61 62 65 6c 20 74 6f 20  o this label to 
160c0 73 6b 69 70 20 61 20 72 6f 77 20 2a 2f 0a 20 20  skip a row */.  
160d0 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
160e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
160f0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
16100 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75 61  into this virtua
16110 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b  l machine */.  K
16120 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20  eyInfo *pKey;   
16130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16140 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64   KeyInfo for ind
16150 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  ex */.  int regR
16160 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20  ecord;          
16170 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
16180 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d  er holding assem
16190 62 6c 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72  bled index recor
161a0 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  d */.  sqlite3 *
161b0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
161c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
161d0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
161e0 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20   */.  int iDb = 
161f0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
16200 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d  ndex(db, pIndex-
16210 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e  >pSchema);..#ifn
16220 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16230 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
16240 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
16250 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
16260 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e  ITE_REINDEX, pIn
16270 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20  dex->zName, 0,. 
16280 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
16290 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20  ].zName ) ){.   
162a0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
162b0 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72  dif..  /* Requir
162c0 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  e a write-lock o
162d0 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 70  n the table to p
162e0 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70 65 72  erform this oper
162f0 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ation */.  sqlit
16300 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
16310 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
16320 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e  num, 1, pTab->zN
16330 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  ame);..  v = sql
16340 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
16350 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
16360 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
16370 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29  memRootPage>=0 )
16380 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d 65 6d  {.    tnum = mem
16390 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65 6c 73  RootPage;.  }els
163a0 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49  e{.    tnum = pI
163b0 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 7d 0a  ndex->tnum;.  }.
163c0 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
163d0 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70  KeyInfoOfIndex(p
163e0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a  Parse, pIndex);.
163f0 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73  .  /* Open the s
16400 6f 72 74 65 72 20 63 75 72 73 6f 72 20 69 66 20  orter cursor if 
16410 77 65 20 61 72 65 20 74 6f 20 75 73 65 20 6f 6e  we are to use on
16420 65 2e 20 2a 2f 0a 20 20 69 53 6f 72 74 65 72 20  e. */.  iSorter 
16430 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
16440 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
16450 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp4(v, OP_Sort
16460 65 72 4f 70 65 6e 2c 20 69 53 6f 72 74 65 72 2c  erOpen, iSorter,
16470 20 30 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79   0, pIndex->nKey
16480 43 6f 6c 2c 20 28 63 68 61 72 2a 29 0a 20 20 20  Col, (char*).   
16490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164a0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52   sqlite3KeyInfoR
164b0 65 66 28 70 4b 65 79 29 2c 20 50 34 5f 4b 45 59  ef(pKey), P4_KEY
164c0 49 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65  INFO);..  /* Ope
164d0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 4c 6f 6f  n the table. Loo
164e0 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f  p through all ro
164f0 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2c  ws of the table,
16500 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 64 65 78   inserting index
16510 0a 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 69 6e  .  ** records in
16520 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a  to the sorter. *
16530 2f 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54  /.  sqlite3OpenT
16540 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61  able(pParse, iTa
16550 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  b, iDb, pTab, OP
16560 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64  _OpenRead);.  ad
16570 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
16580 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
16590 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 20  wind, iTab, 0); 
165a0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
165b0 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73  .  regRecord = s
165c0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
165d0 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 73 71 6c  (pParse);..  sql
165e0 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
165f0 78 4b 65 79 28 70 50 61 72 73 65 2c 70 49 6e 64  xKey(pParse,pInd
16600 65 78 2c 69 54 61 62 2c 72 65 67 52 65 63 6f 72  ex,iTab,regRecor
16610 64 2c 30 2c 26 69 50 61 72 74 49 64 78 4c 61 62  d,0,&iPartIdxLab
16620 65 6c 2c 30 2c 30 29 3b 0a 20 20 73 71 6c 69 74  el,0,0);.  sqlit
16630 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16640 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c  OP_SorterInsert,
16650 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63   iSorter, regRec
16660 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ord);.  sqlite3R
16670 65 73 6f 6c 76 65 50 61 72 74 49 64 78 4c 61 62  esolvePartIdxLab
16680 65 6c 28 70 50 61 72 73 65 2c 20 69 50 61 72 74  el(pParse, iPart
16690 49 64 78 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c  IdxLabel);.  sql
166a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
166b0 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c  , OP_Next, iTab,
166c0 20 61 64 64 72 31 2b 31 29 3b 20 56 64 62 65 43   addr1+1); VdbeC
166d0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
166e0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
166f0 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 69  e(v, addr1);.  i
16700 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3c 30  f( memRootPage<0
16710 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   ) sqlite3VdbeAd
16720 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72  dOp2(v, OP_Clear
16730 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  , tnum, iDb);.  
16740 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16750 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  4(v, OP_OpenWrit
16760 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20 69  e, iIdx, tnum, i
16770 44 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  Db, .           
16780 20 20 20 20 20 20 20 20 20 28 63 68 61 72 20 2a           (char *
16790 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46  )pKey, P4_KEYINF
167a0 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  O);.  sqlite3Vdb
167b0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
167c0 4c 41 47 5f 42 55 4c 4b 43 53 52 7c 28 28 6d 65  LAG_BULKCSR|((me
167d0 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 29 3f 4f 50  mRootPage>=0)?OP
167e0 46 4c 41 47 5f 50 32 49 53 52 45 47 3a 30 29 29  FLAG_P2ISREG:0))
167f0 3b 0a 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  ;..  addr1 = sql
16800 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16810 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c  , OP_SorterSort,
16820 20 69 53 6f 72 74 65 72 2c 20 30 29 3b 20 56 64   iSorter, 0); Vd
16830 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
16840 20 61 73 73 65 72 74 28 20 70 4b 65 79 21 3d 30   assert( pKey!=0
16850 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
16860 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
16870 6e 45 72 72 20 29 3b 0a 20 20 69 66 28 20 49 73  nErr );.  if( Is
16880 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64  UniqueIndex(pInd
16890 65 78 29 20 26 26 20 70 4b 65 79 21 3d 30 20 29  ex) && pKey!=0 )
168a0 7b 0a 20 20 20 20 69 6e 74 20 6a 32 20 3d 20 73  {.    int j2 = s
168b0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
168c0 74 41 64 64 72 28 76 29 20 2b 20 33 3b 0a 20 20  tAddr(v) + 3;.  
168d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
168e0 47 6f 74 6f 28 76 2c 20 6a 32 29 3b 0a 20 20 20  Goto(v, j2);.   
168f0 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
16900 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
16910 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
16920 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
16930 4f 50 5f 53 6f 72 74 65 72 43 6f 6d 70 61 72 65  OP_SorterCompare
16940 2c 20 69 53 6f 72 74 65 72 2c 20 6a 32 2c 20 72  , iSorter, j2, r
16950 65 67 52 65 63 6f 72 64 2c 0a 20 20 20 20 20 20  egRecord,.      
16960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16970 20 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43     pIndex->nKeyC
16980 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ol); VdbeCoverag
16990 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
169a0 33 55 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e  3UniqueConstrain
169b0 74 28 70 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f  t(pParse, OE_Abo
169c0 72 74 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d  rt, pIndex);.  }
169d0 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 32 20  else{.    addr2 
169e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
169f0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d  rentAddr(v);.  }
16a00 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16a10 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp3(v, OP_Sorte
16a20 72 44 61 74 61 2c 20 69 53 6f 72 74 65 72 2c 20  rData, iSorter, 
16a30 72 65 67 52 65 63 6f 72 64 2c 20 69 49 64 78 29  regRecord, iIdx)
16a40 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
16a50 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4c 61 73 74  ddOp3(v, OP_Last
16a60 2c 20 69 49 64 78 2c 20 30 2c 20 2d 31 29 3b 0a  , iIdx, 0, -1);.
16a70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16a80 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op3(v, OP_IdxIns
16a90 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67 52 65  ert, iIdx, regRe
16aa0 63 6f 72 64 2c 20 30 29 3b 0a 20 20 73 71 6c 69  cord, 0);.  sqli
16ab0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
16ac0 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
16ad0 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69  KRESULT);.  sqli
16ae0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
16af0 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
16b00 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
16b10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16b20 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 53 6f 72  SorterNext, iSor
16b30 74 65 72 2c 20 61 64 64 72 32 29 3b 20 56 64 62  ter, addr2); Vdb
16b40 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
16b50 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
16b60 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a  ere(v, addr1);..
16b70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16b80 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
16b90 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65   iTab);.  sqlite
16ba0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
16bb0 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29 3b 0a  P_Close, iIdx);.
16bc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16bd0 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
16be0 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a 2f 2a   iSorter);.}../*
16bf0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 68 65 61  .** Allocate hea
16c00 70 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  p space to hold 
16c10 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  an Index object 
16c20 77 69 74 68 20 6e 43 6f 6c 20 63 6f 6c 75 6d 6e  with nCol column
16c30 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 61 73  s..**.** Increas
16c40 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  e the allocation
16c50 20 73 69 7a 65 20 74 6f 20 70 72 6f 76 69 64 65   size to provide
16c60 20 61 6e 20 65 78 74 72 61 20 6e 45 78 74 72 61   an extra nExtra
16c70 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 38 2d 62   bytes.** of 8-b
16c80 79 74 65 20 61 6c 69 67 6e 65 64 20 73 70 61 63  yte aligned spac
16c90 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64 65  e after the Inde
16ca0 78 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74  x object and ret
16cb0 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72  urn a.** pointer
16cc0 20 74 6f 20 74 68 69 73 20 65 78 74 72 61 20 73   to this extra s
16cd0 70 61 63 65 20 69 6e 20 2a 70 70 45 78 74 72 61  pace in *ppExtra
16ce0 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  ..*/.Index *sqli
16cf0 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78  te3AllocateIndex
16d00 4f 62 6a 65 63 74 28 0a 20 20 73 71 6c 69 74 65  Object(.  sqlite
16d10 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f  3 *db,         /
16d20 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
16d30 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 31 36 20 6e  ction */.  i16 n
16d40 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
16d50 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
16d60 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
16d70 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  e index */.  int
16d80 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
16d90 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
16da0 79 74 65 73 20 6f 66 20 65 78 74 72 61 20 73 70  ytes of extra sp
16db0 61 63 65 20 74 6f 20 61 6c 6c 6f 63 20 2a 2f 0a  ace to alloc */.
16dc0 20 20 63 68 61 72 20 2a 2a 70 70 45 78 74 72 61    char **ppExtra
16dd0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
16de0 72 20 74 6f 20 74 68 65 20 22 65 78 74 72 61 22  r to the "extra"
16df0 20 73 70 61 63 65 20 2a 2f 0a 29 7b 0a 20 20 49   space */.){.  I
16e00 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20  ndex *p;        
16e10 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
16e20 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f   index object */
16e30 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
16e40 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
16e50 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 49 6e   of space for In
16e60 64 65 78 20 6f 62 6a 65 63 74 20 2b 20 61 72 72  dex object + arr
16e70 61 79 73 20 2a 2f 0a 0a 20 20 6e 42 79 74 65 20  ays */..  nByte 
16e80 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
16e90 49 6e 64 65 78 29 29 20 2b 20 20 20 20 20 20 20  Index)) +       
16ea0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
16eb0 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20 20  structure  */.  
16ec0 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73          ROUND8(s
16ed0 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f  izeof(char*)*nCo
16ee0 6c 29 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20  l) +         /* 
16ef0 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20  Index.azColl    
16f00 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f   */.          RO
16f10 55 4e 44 38 28 73 69 7a 65 6f 66 28 4c 6f 67 45  UND8(sizeof(LogE
16f20 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20 20  st)*(nCol+1) +  
16f30 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f     /* Index.aiRo
16f40 77 4c 6f 67 45 73 74 20 20 20 2a 2f 0a 20 20 20  wLogEst   */.   
16f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
16f60 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 20 2b  zeof(i16)*nCol +
16f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
16f80 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20  ndex.aiColumn   
16f90 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
16fa0 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e      sizeof(u8)*n
16fb0 43 6f 6c 29 3b 20 20 20 20 20 20 20 20 20 20 20  Col);           
16fc0 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74    /* Index.aSort
16fd0 4f 72 64 65 72 20 2a 2f 0a 20 20 70 20 3d 20 73  Order */.  p = s
16fe0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
16ff0 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 2b 20 6e  ro(db, nByte + n
17000 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70 20  Extra);.  if( p 
17010 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 45 78  ){.    char *pEx
17020 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29  tra = ((char*)p)
17030 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 49  +ROUND8(sizeof(I
17040 6e 64 65 78 29 29 3b 0a 20 20 20 20 70 2d 3e 61  ndex));.    p->a
17050 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29  zColl = (char**)
17060 70 45 78 74 72 61 3b 20 20 20 20 20 20 20 70 45  pExtra;       pE
17070 78 74 72 61 20 2b 3d 20 52 4f 55 4e 44 38 28 73  xtra += ROUND8(s
17080 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f  izeof(char*)*nCo
17090 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 69 52 6f 77  l);.    p->aiRow
170a0 4c 6f 67 45 73 74 20 3d 20 28 4c 6f 67 45 73 74  LogEst = (LogEst
170b0 2a 29 70 45 78 74 72 61 3b 20 70 45 78 74 72 61  *)pExtra; pExtra
170c0 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73   += sizeof(LogEs
170d0 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20  t)*(nCol+1);.   
170e0 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28   p->aiColumn = (
170f0 69 31 36 2a 29 70 45 78 74 72 61 3b 20 20 20 20  i16*)pExtra;    
17100 20 20 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a     pExtra += siz
17110 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 3b 0a 20  eof(i16)*nCol;. 
17120 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72     p->aSortOrder
17130 20 3d 20 28 75 38 2a 29 70 45 78 74 72 61 3b 0a   = (u8*)pExtra;.
17140 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d      p->nColumn =
17150 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 6e 4b   nCol;.    p->nK
17160 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2d 20 31  eyCol = nCol - 1
17170 3b 0a 20 20 20 20 2a 70 70 45 78 74 72 61 20 3d  ;.    *ppExtra =
17180 20 28 28 63 68 61 72 2a 29 70 29 20 2b 20 6e 42   ((char*)p) + nB
17190 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  yte;.  }.  retur
171a0 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  n p;.}../*.** Cr
171b0 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78  eate a new index
171c0 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c   for an SQL tabl
171d0 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65  e.  pName1.pName
171e0 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  2 is the name of
171f0 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61   the index .** a
17200 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74  nd pTblList is t
17210 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
17220 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
17230 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74  be indexed.  Bot
17240 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55  h will .** be NU
17250 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79  LL for a primary
17260 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78   key or an index
17270 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64   that is created
17280 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a   to satisfy a.**
17290 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
172a0 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61  nt.  If pTable a
172b0 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55  nd pIndex are NU
172c0 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e  LL, use pParse->
172d0 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20  pNewTable.** as 
172e0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
172f0 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65  indexed.  pParse
17300 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61  ->pNewTable is a
17310 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a   table that is.*
17320 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  * currently bein
17330 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  g constructed by
17340 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
17350 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
17360 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
17370 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
17380 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73  e indexed.  pLis
17390 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  t will be NULL i
173a0 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70  f this.** is a p
173b0 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e  rimary key or un
173c0 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20  ique-constraint 
173d0 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
173e0 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a  nt column added.
173f0 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ** to the table 
17400 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
17410 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a  construction.  .
17420 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 64  **.** If the ind
17430 65 78 20 69 73 20 63 72 65 61 74 65 64 20 73 75  ex is created su
17440 63 63 65 73 73 66 75 6c 6c 79 2c 20 72 65 74 75  ccessfully, retu
17450 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
17460 74 68 65 20 6e 65 77 20 49 6e 64 65 78 0a 2a 2a  the new Index.**
17470 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 69 73   structure. This
17480 20 69 73 20 75 73 65 64 20 62 79 20 73 71 6c 69   is used by sqli
17490 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79  te3AddPrimaryKey
174a0 28 29 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 69  () to mark the i
174b0 6e 64 65 78 0a 2a 2a 20 61 73 20 74 68 65 20 74  ndex.** as the t
174c0 61 62 6c 65 73 20 70 72 69 6d 61 72 79 20 6b 65  ables primary ke
174d0 79 20 28 49 6e 64 65 78 2e 69 64 78 54 79 70 65  y (Index.idxType
174e0 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  ==SQLITE_IDXTYPE
174f0 5f 50 52 49 4d 41 52 59 4b 45 59 29 0a 2a 2f 0a  _PRIMARYKEY).*/.
17500 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 43 72  Index *sqlite3Cr
17510 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72  eateIndex(.  Par
17520 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
17530 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  /* All informati
17540 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61  on about this pa
17550 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  rse */.  Token *
17560 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46  pName1,     /* F
17570 69 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64  irst part of ind
17580 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20  ex name. May be 
17590 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
175a0 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
175b0 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69  Second part of i
175c0 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62  ndex name. May b
175d0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c  e NULL */.  SrcL
175e0 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f  ist *pTblName, /
175f0 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78  * Table to index
17600 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  . Use pParse->pN
17610 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a  ewTable if 0 */.
17620 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
17630 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  t,   /* A list o
17640 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
17650 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
17660 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20   onError,       
17670 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f  /* OE_Abort, OE_
17680 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61  Ignore, OE_Repla
17690 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a  ce, or OE_None *
176a0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72  /.  Token *pStar
176b0 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52  t,     /* The CR
176c0 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
176d0 62 65 67 69 6e 73 20 74 68 69 73 20 73 74 61 74  begins this stat
176e0 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20  ement */.  Expr 
176f0 2a 70 50 49 57 68 65 72 65 2c 20 20 20 20 2f 2a  *pPIWhere,    /*
17700 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f   WHERE clause fo
17710 72 20 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65  r partial indice
17720 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  s */.  int sortO
17730 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72  rder,     /* Sor
17740 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69 6d 61  t order of prima
17750 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c 69 73  ry key when pLis
17760 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  t==NULL */.  int
17770 20 69 66 4e 6f 74 45 78 69 73 74 20 20 20 20 20   ifNotExist     
17780 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20 69 66  /* Omit error if
17790 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
177a0 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 49 6e  xists */.){.  In
177b0 64 65 78 20 2a 70 52 65 74 20 3d 20 30 3b 20 20  dex *pRet = 0;  
177c0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
177d0 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 54 61 62   return */.  Tab
177e0 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20  le *pTab = 0;   
177f0 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
17800 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e   indexed */.  In
17810 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b  dex *pIndex = 0;
17820 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
17830 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f  to be created */
17840 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
17850 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20   0;     /* Name 
17860 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  of the index */.
17870 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20    int nName;    
17880 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
17890 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69   of characters i
178a0 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  n zName */.  int
178b0 20 69 2c 20 6a 3b 0a 20 20 44 62 46 69 78 65 72   i, j;.  DbFixer
178c0 20 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a   sFix;        /*
178d0 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64   For assigning d
178e0 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f  atabase names to
178f0 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   pTable */.  int
17900 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20   sortOrderMask; 
17910 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20    /* 1 to honor 
17920 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20  DESC in index.  
17930 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a  0 to ignore. */.
17940 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
17950 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62  pParse->db;.  Db
17960 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
17970 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66     /* The specif
17980 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  ic table contain
17990 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64 20  ing the indexed 
179a0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
179b0 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
179c0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
179d0 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
179e0 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
179f0 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
17a00 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55  ame = 0;    /* U
17a10 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
17a20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
17a30 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75  create */.  stru
17a40 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
17a50 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20   *pListItem; /* 
17a60 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
17a70 20 70 4c 69 73 74 20 2a 2f 0a 20 20 63 6f 6e 73   pList */.  cons
17a80 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f  t Column *pTabCo
17a90 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l;           /* 
17aa0 41 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  A column in the 
17ab0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  table */.  int n
17ac0 45 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20  Extra = 0;      
17ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
17ae0 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
17af0 6f 72 20 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a 20  or zExtra[] */. 
17b00 20 69 6e 74 20 6e 45 78 74 72 61 43 6f 6c 3b 20   int nExtraCol; 
17b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
17b30 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65  xtra columns nee
17b40 64 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ded */.  char *z
17b50 45 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20  Extra = 0;      
17b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
17b70 72 61 20 73 70 61 63 65 20 61 66 74 65 72 20 74  ra space after t
17b80 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  he Index object 
17b90 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 20  */.  Index *pPk 
17ba0 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 50 52 49  = 0;      /* PRI
17bb0 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66  MARY KEY index f
17bc0 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  or WITHOUT ROWID
17bd0 20 74 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 69 66   tables */..  if
17be0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
17bf0 65 64 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45  ed || IN_DECLARE
17c00 5f 56 54 41 42 20 7c 7c 20 70 50 61 72 73 65 2d  _VTAB || pParse-
17c10 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 67  >nErr>0 ){.    g
17c20 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
17c30 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
17c40 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
17c50 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
17c60 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  arse) ){.    got
17c70 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
17c80 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  dex;.  }..  /*. 
17c90 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62   ** Find the tab
17ca0 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
17cb0 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72   indexed.  Retur
17cc0 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66  n early if not f
17cd0 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ound..  */.  if(
17ce0 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
17cf0 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20  .    /* Use the 
17d00 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e  two-part index n
17d10 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
17d20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
17d30 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20     ** to search 
17d40 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27  for the table. '
17d50 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e  Fix' the table n
17d60 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20  ame to this db. 
17d70 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f     ** before loo
17d80 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c  king up the tabl
17d90 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
17da0 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20  sert( pName1 && 
17db0 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44  pName2 );.    iD
17dc0 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
17dd0 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
17de0 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
17df0 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
17e00 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69  iDb<0 ) goto exi
17e10 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
17e20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
17e30 65 20 26 26 20 70 4e 61 6d 65 2d 3e 7a 20 29 3b  e && pName->z );
17e40 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
17e50 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20  _OMIT_TEMPDB.   
17e60 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78   /* If the index
17e70 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c   name was unqual
17e80 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20  ified, check if 
17e90 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
17ea0 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65   is a temp table
17eb0 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65  . If so, set the
17ec0 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e 20   database to 1. 
17ed0 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20  Do not do this. 
17ee0 20 20 20 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c     ** if initial
17ef0 69 73 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  ising a database
17f00 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a   schema..    */.
17f10 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
17f20 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20  t.busy ){.      
17f30 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72  pTab = sqlite3Sr
17f40 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72  cListLookup(pPar
17f50 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  se, pTblName);. 
17f60 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32 2d       if( pName2-
17f70 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26  >n==0 && pTab &&
17f80 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d   pTab->pSchema==
17f90 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
17fa0 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69 44  ma ){.        iD
17fb0 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  b = 1;.      }. 
17fc0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
17fd0 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
17fe0 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
17ff0 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61  Db, "index", pNa
18000 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  me);.    if( sql
18010 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26  ite3FixSrcList(&
18020 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 20  sFix, pTblName) 
18030 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61  ){.      /* Beca
18040 75 73 65 20 74 68 65 20 70 61 72 73 65 72 20 63  use the parser c
18050 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61  onstructs pTblNa
18060 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  me from a single
18070 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20   identifier,.   
18080 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78     ** sqlite3Fix
18090 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65  SrcList can neve
180a0 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20  r fail. */.     
180b0 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20   assert(0);.    
180c0 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  }.    pTab = sql
180d0 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
180e0 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 26  tem(pParse, 0, &
180f0 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b  pTblName->a[0]);
18100 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
18110 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
18120 20 7c 7c 20 70 54 61 62 3d 3d 30 20 29 3b 0a 20   || pTab==0 );. 
18130 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
18140 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
18150 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  e_index;.    if(
18160 20 69 44 62 3d 3d 31 20 26 26 20 64 62 2d 3e 61   iDb==1 && db->a
18170 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 21  Db[iDb].pSchema!
18180 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
18190 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
181a0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
181b0 0a 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e  .           "can
181c0 6e 6f 74 20 63 72 65 61 74 65 20 61 20 54 45 4d  not create a TEM
181d0 50 20 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e 2d 54  P index on non-T
181e0 45 4d 50 20 74 61 62 6c 65 20 5c 22 25 73 5c 22  EMP table \"%s\"
181f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  ",.           pT
18200 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
18210 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18220 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
18230 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
18240 64 28 70 54 61 62 29 20 29 20 70 50 6b 20 3d 20  d(pTab) ) pPk = 
18250 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
18260 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
18270 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
18280 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  t( pName==0 );. 
18290 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72     assert( pStar
182a0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62  t==0 );.    pTab
182b0 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
182c0 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70  able;.    if( !p
182d0 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Tab ) goto exit_
182e0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
182f0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
18300 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
18310 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
18320 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62  .  }.  pDb = &db
18330 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 61  ->aDb[iDb];..  a
18340 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
18350 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
18360 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20  se->nErr==0 );. 
18370 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
18380 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  ICmp(pTab->zName
18390 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d  , "sqlite_", 7)=
183a0 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 64 62  =0 .       && db
183b0 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 0a 23  ->init.busy==0.#
183c0 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
183d0 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20  UTHENTICATION.  
183e0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 55       && sqlite3U
183f0 73 65 72 41 75 74 68 54 61 62 6c 65 28 70 54 61  serAuthTable(pTa
18400 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 0a 23 65 6e  b->zName)==0.#en
18410 64 69 66 0a 20 20 20 20 20 20 20 26 26 20 73 71  dif.       && sq
18420 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 26 70  lite3StrNICmp(&p
18430 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61  Tab->zName[7],"a
18440 6c 74 65 72 74 61 62 5f 22 2c 39 29 21 3d 30 20  ltertab_",9)!=0 
18450 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
18460 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
18470 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
18480 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54   be indexed", pT
18490 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
184a0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
184b0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e  _index;.  }.#ifn
184c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
184d0 56 49 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d  VIEW.  if( pTab-
184e0 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
184f0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
18500 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d  pParse, "views m
18510 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
18520 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
18530 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18540 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e  .  }.#endif.#ifn
18550 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18560 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
18570 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
18580 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
18590 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
185a0 2c 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65  , "virtual table
185b0 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
185c0 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
185d0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
185e0 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ex;.  }.#endif..
185f0 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
18600 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
18610 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65  ndex.  Make sure
18620 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c   there is not al
18630 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20  ready another.  
18640 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
18650 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
18660 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  name.  .  **.  *
18670 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66  * Exception:  If
18680 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
18690 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72  the names of per
186a0 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66  manent indices f
186b0 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  rom the.  ** sql
186c0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
186d0 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f   (because some o
186e0 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61  ther process cha
186f0 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29  nged the schema)
18700 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66   and.  ** one of
18710 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73   the index names
18720 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74   collides with t
18730 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d  he name of a tem
18740 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a  porary table or.
18750 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e    ** index, then
18760 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
18770 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69  e to process thi
18780 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20  s index..  **.  
18790 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69  ** If pName==0 i
187a0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
187b0 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67  are.  ** dealing
187c0 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20   with a primary 
187d0 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  key or UNIQUE co
187e0 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61  nstraint.  We ha
187f0 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72  ve to invent our
18800 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a  .  ** own name..
18810 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65    */.  if( pName
18820 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
18830 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
18840 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
18850 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
18860 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
18870 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
18880 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 7a  assert( pName->z
18890 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 53  !=0 );.    if( S
188a0 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
188b0 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
188c0 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20  (pParse, zName) 
188d0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
188e0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
188f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
18900 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
18910 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
18920 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
18930 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a  zName, 0)!=0 ){.
18940 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
18950 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
18960 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
18970 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  y a table named 
18980 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
18990 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
189a0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
189b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
189c0 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  f( sqlite3FindIn
189d0 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70  dex(db, zName, p
189e0 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  Db->zName)!=0 ){
189f0 0a 20 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f  .      if( !ifNo
18a00 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20  tExist ){.      
18a10 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
18a20 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
18a30 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73   %s already exis
18a40 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ts", zName);.   
18a50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18a60 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69    assert( !db->i
18a70 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20  nit.busy );.    
18a80 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
18a90 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
18aa0 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
18ab0 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  }.      goto exi
18ac0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
18ad0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
18ae0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e     int n;.    In
18af0 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20  dex *pLoop;.    
18b00 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e  for(pLoop=pTab->
18b10 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f  pIndex, n=1; pLo
18b20 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
18b30 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20  >pNext, n++){}. 
18b40 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
18b50 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73  e3MPrintf(db, "s
18b60 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
18b70 25 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s_%d", pTab->zN
18b80 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28  ame, n);.    if(
18b90 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
18ba0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18bb0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
18bc0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
18bd0 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69   for authorizati
18be0 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  on to create an 
18bf0 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e  index..  */.#ifn
18c00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18c10 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
18c20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
18c30 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61   *zDb = pDb->zNa
18c40 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
18c50 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
18c60 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
18c70 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
18c80 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29  (iDb), 0, zDb) )
18c90 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
18ca0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
18cb0 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51      }.    i = SQ
18cc0 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45  LITE_CREATE_INDE
18cd0 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54  X;.    if( !OMIT
18ce0 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
18cf0 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43  1 ) i = SQLITE_C
18d00 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
18d10 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
18d20 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
18d30 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61  e, i, zName, pTa
18d40 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
18d50 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
18d60 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
18d70 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
18d80 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d  ..  /* If pList=
18d90 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69  =0, it means thi
18da0 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
18db0 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70  lled to make a p
18dc0 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20  rimary.  ** key 
18dd0 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20  out of the last 
18de0 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20  column added to 
18df0 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
18e00 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20  construction..  
18e10 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66  ** So create a f
18e20 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75  ake list to simu
18e30 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a  late this..  */.
18e40 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
18e50 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 70 72 65 76  {.    Token prev
18e60 43 6f 6c 3b 0a 20 20 20 20 70 72 65 76 43 6f 6c  Col;.    prevCol
18e70 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  .z = pTab->aCol[
18e80 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e  pTab->nCol-1].zN
18e90 61 6d 65 3b 0a 20 20 20 20 70 72 65 76 43 6f 6c  ame;.    prevCol
18ea0 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  .n = sqlite3Strl
18eb0 65 6e 33 30 28 70 72 65 76 43 6f 6c 2e 7a 29 3b  en30(prevCol.z);
18ec0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
18ed0 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
18ee0 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 0a 20 20  nd(pParse, 0,.  
18ef0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
18f00 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
18f10 20 54 4b 5f 49 44 2c 20 26 70 72 65 76 43 6f 6c   TK_ID, &prevCol
18f20 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70  , 0));.    if( p
18f30 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65  List==0 ) goto e
18f40 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18f50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
18f60 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b  ist->nExpr==1 );
18f70 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
18f80 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72  ListSetSortOrder
18f90 28 70 4c 69 73 74 2c 20 73 6f 72 74 4f 72 64 65  (pList, sortOrde
18fa0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
18fb0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
18fc0 43 68 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 72  CheckLength(pPar
18fd0 73 65 2c 20 70 4c 69 73 74 2c 20 22 69 6e 64 65  se, pList, "inde
18fe0 78 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  x");.  }..  /* F
18ff0 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
19000 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ny bytes of spac
19010 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74  e are required t
19020 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63 69 74  o store explicit
19030 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65  ly.  ** specifie
19040 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
19050 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f  ence names..  */
19060 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
19070 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
19080 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
19090 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  r = pList->a[i].
190a0 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
190b0 45 78 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f  Expr && pExpr->o
190c0 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b  p==TK_COLLATE ){
190d0 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d  .      nExtra +=
190e0 20 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74 72   (1 + sqlite3Str
190f0 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a  len30(pExpr->u.z
19100 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 20  Token));.    }. 
19110 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41   }..  /* .  ** A
19120 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65  llocate the inde
19130 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20  x structure. .  
19140 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c  */.  nName = sql
19150 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
19160 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61 43 6f 6c  me);.  nExtraCol
19170 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b   = pPk ? pPk->nK
19180 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20 70 49 6e  eyCol : 1;.  pIn
19190 64 65 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c  dex = sqlite3All
191a0 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74  ocateIndexObject
191b0 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70  (db, pList->nExp
191c0 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c 0a 20  r + nExtraCol,. 
191d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191f0 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e 45 78       nName + nEx
19200 74 72 61 20 2b 20 31 2c 20 26 7a 45 78 74 72 61  tra + 1, &zExtra
19210 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
19220 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
19230 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
19240 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61  e_index;.  }.  a
19250 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
19260 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64  E_ALIGNMENT(pInd
19270 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 29  ex->aiRowLogEst)
19280 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
19290 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
192a0 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c  NT(pIndex->azCol
192b0 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  l) );.  pIndex->
192c0 7a 4e 61 6d 65 20 3d 20 7a 45 78 74 72 61 3b 0a  zName = zExtra;.
192d0 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 4e 61 6d    zExtra += nNam
192e0 65 20 2b 20 31 3b 0a 20 20 6d 65 6d 63 70 79 28  e + 1;.  memcpy(
192f0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  pIndex->zName, z
19300 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a  Name, nName+1);.
19310 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
19320 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65   = pTab;.  pInde
19330 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38  x->onError = (u8
19340 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64  )onError;.  pInd
19350 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  ex->uniqNotNull 
19360 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  = onError!=OE_No
19370 6e 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 64  ne;.  pIndex->id
19380 78 54 79 70 65 20 3d 20 70 4e 61 6d 65 20 3f 20  xType = pName ? 
19390 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41  SQLITE_IDXTYPE_A
193a0 50 50 44 45 46 20 3a 20 53 51 4c 49 54 45 5f 49  PPDEF : SQLITE_I
193b0 44 58 54 59 50 45 5f 55 4e 49 51 55 45 3b 0a 20  DXTYPE_UNIQUE;. 
193c0 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
193d0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
193e0 70 53 63 68 65 6d 61 3b 0a 20 20 70 49 6e 64 65  pSchema;.  pInde
193f0 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c 69  x->nKeyCol = pLi
19400 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28  st->nExpr;.  if(
19410 20 70 50 49 57 68 65 72 65 20 29 7b 0a 20 20 20   pPIWhere ){.   
19420 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
19430 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61  elfReference(pPa
19440 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 50 61  rse, pTab, NC_Pa
19450 72 74 49 64 78 2c 20 70 50 49 57 68 65 72 65 2c  rtIdx, pPIWhere,
19460 20 30 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d   0);.    pIndex-
19470 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 20 3d  >pPartIdxWhere =
19480 20 70 50 49 57 68 65 72 65 3b 0a 20 20 20 20 70   pPIWhere;.    p
19490 50 49 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d  PIWhere = 0;.  }
194a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
194b0 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
194c0 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
194d0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
194e0 73 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64  see if we should
194f0 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75   honor DESC requ
19500 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f  ests on index co
19510 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28  lumns.  */.  if(
19520 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66   pDb->pSchema->f
19530 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b  ile_format>=4 ){
19540 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61  .    sortOrderMa
19550 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f  sk = -1;   /* Ho
19560 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65  nor DESC */.  }e
19570 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64  lse{.    sortOrd
19580 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f  erMask = 0;    /
19590 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f  * Ignore DESC */
195a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e 20  .  }..  /* Scan 
195b0 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65  the names of the
195c0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
195d0 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  table to be inde
195e0 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61  xed and.  ** loa
195f0 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64  d the column ind
19600 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e  ices into the In
19610 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 20  dex structure.  
19620 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a  Report an error.
19630 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75    ** if any colu
19640 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e  mn is not found.
19650 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a  .  **.  ** TODO:
19660 20 20 41 64 64 20 61 20 74 65 73 74 20 74 6f 20    Add a test to 
19670 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
19680 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69  he same column i
19690 73 20 6e 6f 74 20 6e 61 6d 65 64 0a 20 20 2a 2a  s not named.  **
196a0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20   more than once 
196b0 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20  within the same 
196c0 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65  index.  Only the
196d0 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65 20   first instance 
196e0 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75  of.  ** the colu
196f0 6d 6e 20 77 69 6c 6c 20 65 76 65 72 20 62 65 20  mn will ever be 
19700 75 73 65 64 20 62 79 20 74 68 65 20 6f 70 74 69  used by the opti
19710 6d 69 7a 65 72 2e 20 20 4e 6f 74 65 20 74 68 61  mizer.  Note tha
19720 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  t using the.  **
19730 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 6d 6f 72   same column mor
19740 65 20 74 68 61 6e 20 6f 6e 63 65 20 63 61 6e 6e  e than once cann
19750 6f 74 20 62 65 20 61 6e 20 65 72 72 6f 72 20 62  ot be an error b
19760 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c  ecause that woul
19770 64 20 0a 20 20 2a 2a 20 62 72 65 61 6b 20 62 61  d .  ** break ba
19780 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
19790 69 6c 69 74 79 20 2d 20 69 74 20 6e 65 65 64 73  ility - it needs
197a0 20 74 6f 20 62 65 20 61 20 77 61 72 6e 69 6e 67   to be a warning
197b0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
197c0 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73  , pListItem=pLis
197d0 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  t->a; i<pList->n
197e0 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74  Expr; i++, pList
197f0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  Item++){.    con
19800 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e 61 6d  st char *zColNam
19810 65 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 43 45  e;.    Expr *pCE
19820 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 72 65 71  xpr;.    int req
19830 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b  uestedSortOrder;
19840 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  .    char *zColl
19850 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19860 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e      /* Collation
19870 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a   sequence name *
19880 2f 0a 0a 20 20 20 20 70 43 45 78 70 72 20 3d 20  /..    pCExpr = 
19890 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
198a0 6f 6c 6c 61 74 65 28 70 4c 69 73 74 49 74 65 6d  ollate(pListItem
198b0 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ->pExpr);.    if
198c0 28 20 70 43 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  ( pCExpr->op!=TK
198d0 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _ID ){.      sql
198e0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
198f0 72 73 65 2c 20 22 69 6e 64 65 78 65 73 20 6f 6e  rse, "indexes on
19900 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6e 6f 74   expressions not
19910 20 79 65 74 20 73 75 70 70 6f 72 74 65 64 22 29   yet supported")
19920 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
19930 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6c  ;.    }.    zCol
19940 4e 61 6d 65 20 3d 20 70 43 45 78 70 72 2d 3e 75  Name = pCExpr->u
19950 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 66 6f 72  .zToken;.    for
19960 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54  (j=0, pTabCol=pT
19970 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62  ab->aCol; j<pTab
19980 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61  ->nCol; j++, pTa
19990 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69  bCol++){.      i
199a0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
199b0 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62  p(zColName, pTab
199c0 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29  Col->zName)==0 )
199d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
199e0 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e    if( j>=pTab->n
199f0 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Col ){.      sql
19a00 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
19a10 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68  rse, "table %s h
19a20 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d  as no column nam
19a30 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  ed %s",.        
19a40 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pTab->zName, zCo
19a50 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 50  lName);.      pP
19a60 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
19a70 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  a = 1;.      got
19a80 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
19a90 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  dex;.    }.    a
19aa0 73 73 65 72 74 28 20 6a 3c 3d 30 78 37 66 66 66  ssert( j<=0x7fff
19ab0 20 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e   );.    pIndex->
19ac0 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69  aiColumn[i] = (i
19ad0 31 36 29 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c  16)j;.    if( pL
19ae0 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
19af0 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op==TK_COLLATE )
19b00 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c  {.      int nCol
19b10 6c 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  l;.      zColl =
19b20 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
19b30 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
19b40 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     nColl = sqlit
19b50 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c  e3Strlen30(zColl
19b60 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 61 73 73  ) + 1;.      ass
19b70 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f  ert( nExtra>=nCo
19b80 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ll );.      memc
19b90 70 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c  py(zExtra, zColl
19ba0 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , nColl);.      
19bb0 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a  zColl = zExtra;.
19bc0 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20        zExtra += 
19bd0 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78  nColl;.      nEx
19be0 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20  tra -= nColl;.  
19bf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
19c00 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Coll = pTab->aCo
19c10 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[j].zColl;.    
19c20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 7a    if( !zColl ) z
19c30 43 6f 6c 6c 20 3d 20 22 42 49 4e 41 52 59 22 3b  Coll = "BINARY";
19c40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
19c50 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
19c60 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43   !sqlite3LocateC
19c70 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
19c80 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 67  Coll) ){.      g
19c90 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19ca0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
19cb0 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
19cc0 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20  i] = zColl;.    
19cd0 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
19ce0 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e  er = pListItem->
19cf0 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74  sortOrder & sort
19d00 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70  OrderMask;.    p
19d10 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
19d20 72 5b 69 5d 20 3d 20 28 75 38 29 72 65 71 75 65  r[i] = (u8)reque
19d30 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20  stedSortOrder;. 
19d40 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f     if( pTab->aCo
19d50 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20  l[j].notNull==0 
19d60 29 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f  ) pIndex->uniqNo
19d70 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20  tNull = 0;.  }. 
19d80 20 69 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20   if( pPk ){.    
19d90 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e  for(j=0; j<pPk->
19da0 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  nKeyCol; j++){. 
19db0 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50 6b       int x = pPk
19dc0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
19dd0 20 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75       if( hasColu
19de0 6d 6e 28 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  mn(pIndex->aiCol
19df0 75 6d 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65  umn, pIndex->nKe
19e00 79 43 6f 6c 2c 20 78 29 20 29 7b 0a 20 20 20 20  yCol, x) ){.    
19e10 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c      pIndex->nCol
19e20 75 6d 6e 2d 2d 3b 20 0a 20 20 20 20 20 20 7d 65  umn--; .      }e
19e30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  lse{.        pIn
19e40 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
19e50 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 49   = x;.        pI
19e60 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20  ndex->azColl[i] 
19e70 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d  = pPk->azColl[j]
19e80 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  ;.        pIndex
19e90 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
19ea0 3d 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65  = pPk->aSortOrde
19eb0 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b  r[j];.        i+
19ec0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
19ed0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d  .    assert( i==
19ee0 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
19ef0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
19f00 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
19f10 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70 49  [i] = -1;.    pI
19f20 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20  ndex->azColl[i] 
19f30 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a  = "BINARY";.  }.
19f40 20 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74    sqlite3Default
19f50 52 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a  RowEst(pIndex);.
19f60 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e    if( pParse->pN
19f70 65 77 54 61 62 6c 65 3d 3d 30 20 29 20 65 73 74  ewTable==0 ) est
19f80 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28  imateIndexWidth(
19f90 70 49 6e 64 65 78 29 3b 0a 0a 20 20 69 66 28 20  pIndex);..  if( 
19fa0 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e  pTab==pParse->pN
19fb0 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f  ewTable ){.    /
19fc0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
19fd0 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74  as been called t
19fe0 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f  o create an auto
19ff0 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73 20 61  matic index as a
1a000 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f  .    ** result o
1a010 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  f a PRIMARY KEY 
1a020 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65  or UNIQUE clause
1a030 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66   on a column def
1a040 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20  inition, or.    
1a050 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  ** a PRIMARY KEY
1a060 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73   or UNIQUE claus
1a070 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  e following the 
1a080 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f  column definitio
1a090 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20  ns..    ** i.e. 
1a0a0 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  one of:.    **. 
1a0b0 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42     ** CREATE TAB
1a0c0 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b  LE t(x PRIMARY K
1a0d0 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43  EY, y);.    ** C
1a0e0 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c  REATE TABLE t(x,
1a0f0 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29   y, UNIQUE(x, y)
1a100 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1a110 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 68 65   Either way, che
1a120 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
1a130 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68   table already h
1a140 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78  as such an index
1a150 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20  . If.    ** so, 
1a160 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65  don't bother cre
1a170 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20  ating this one. 
1a180 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65  This only applie
1a190 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f  s to.    ** auto
1a1a0 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65  matically create
1a1b0 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73  d indices. Users
1a1c0 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20   can do as they 
1a1d0 77 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a  wish with.    **
1a1e0 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65   explicit indice
1a1f0 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
1a200 20 54 77 6f 20 55 4e 49 51 55 45 20 6f 72 20 50   Two UNIQUE or P
1a210 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
1a220 72 61 69 6e 74 73 20 61 72 65 20 63 6f 6e 73 69  raints are consi
1a230 64 65 72 65 64 20 65 71 75 69 76 61 6c 65 6e 74  dered equivalent
1a240 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20 74 68 75  .    ** (and thu
1a250 73 20 73 75 70 70 72 65 73 73 69 6e 67 20 74 68  s suppressing th
1a260 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76  e second one) ev
1a270 65 6e 20 69 66 20 74 68 65 79 20 68 61 76 65 20  en if they have 
1a280 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a  different.    **
1a290 20 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20 20   sort orders..  
1a2a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
1a2b0 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65  here are differe
1a2c0 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nt collating seq
1a2d0 75 65 6e 63 65 73 20 6f 72 20 69 66 20 74 68 65  uences or if the
1a2e0 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20   columns of.    
1a2f0 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  ** the constrain
1a300 74 20 6f 63 63 75 72 20 69 6e 20 64 69 66 66 65  t occur in diffe
1a310 72 65 6e 74 20 6f 72 64 65 72 73 2c 20 74 68 65  rent orders, the
1a320 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  n the constraint
1a330 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e  s are.    ** con
1a340 73 69 64 65 72 65 64 20 64 69 73 74 69 6e 63 74  sidered distinct
1a350 20 61 6e 64 20 62 6f 74 68 20 72 65 73 75 6c 74   and both result
1a360 20 69 6e 20 73 65 70 61 72 61 74 65 20 69 6e 64   in separate ind
1a370 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ices..    */.   
1a380 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
1a390 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
1a3a0 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
1a3b0 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
1a3c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20  {.      int k;. 
1a3d0 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73 55       assert( IsU
1a3e0 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
1a3f0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1a400 28 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65 21  ( pIdx->idxType!
1a410 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f  =SQLITE_IDXTYPE_
1a420 41 50 50 44 45 46 20 29 3b 0a 20 20 20 20 20 20  APPDEF );.      
1a430 61 73 73 65 72 74 28 20 49 73 55 6e 69 71 75 65  assert( IsUnique
1a440 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29 3b  Index(pIndex) );
1a450 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ..      if( pIdx
1a460 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64 65  ->nKeyCol!=pInde
1a470 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e  x->nKeyCol ) con
1a480 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72  tinue;.      for
1a490 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b  (k=0; k<pIdx->nK
1a4a0 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20  eyCol; k++){.   
1a4b0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1a4c0 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  *z1;.        con
1a4d0 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20  st char *z2;.   
1a4e0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
1a4f0 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64  iColumn[k]!=pInd
1a500 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20  ex->aiColumn[k] 
1a510 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
1a520 20 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f   z1 = pIdx->azCo
1a530 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a  ll[k];.        z
1a540 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  2 = pIndex->azCo
1a550 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[k];.        i
1a560 66 28 20 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c  f( z1!=z2 && sql
1a570 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20  ite3StrICmp(z1, 
1a580 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  z2) ) break;.   
1a590 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b     }.      if( k
1a5a0 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20  ==pIdx->nKeyCol 
1a5b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1a5c0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49  Idx->onError!=pI
1a5d0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b  ndex->onError ){
1a5e0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
1a5f0 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72  is constraint cr
1a600 65 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69  eates the same i
1a610 6e 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f  ndex as a previo
1a620 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  us.          ** 
1a630 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69  constraint speci
1a640 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69  fied somewhere i
1a650 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
1a660 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  LE statement..  
1a670 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76          ** Howev
1a680 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49  er the ON CONFLI
1a690 43 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64  CT clauses are d
1a6a0 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74  ifferent. If bot
1a6b0 68 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  h this .        
1a6c0 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20    ** constraint 
1a6d0 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73  and the previous
1a6e0 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73   equivalent cons
1a6f0 74 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c  traint have expl
1a700 69 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a  icit.          *
1a710 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  * ON CONFLICT cl
1a720 61 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e  auses this is an
1a730 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73   error. Otherwis
1a740 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  e, use the.     
1a750 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74       ** explicit
1a760 6c 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68  ly specified beh
1a770 61 76 69 6f 72 20 66 6f 72 20 74 68 65 20 69 6e  avior for the in
1a780 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  dex..          *
1a790 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
1a7a0 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  !(pIdx->onError=
1a7b0 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70  =OE_Default || p
1a7c0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
1a7d0 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20  OE_Default) ){. 
1a7e0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1a7f0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1a800 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
1a810 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67      "conflicting
1a820 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
1a830 75 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c  uses specified",
1a840 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   0);.          }
1a850 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1a860 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
1a870 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  _Default ){.    
1a880 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e          pIdx->on
1a890 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e  Error = pIndex->
1a8a0 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  onError;.       
1a8b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1a8c0 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 70 49         pRet = pI
1a8d0 64 78 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  dx;.        goto
1a8e0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1a8f0 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
1a900 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b  }.  }..  /* Link
1a910 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73   the new Index s
1a920 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20  tructure to its 
1a930 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65  table and to the
1a940 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d   other.  ** in-m
1a950 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73  emory database s
1a960 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f  tructures. .  */
1a970 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
1a980 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65  busy ){.    Inde
1a990 78 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74  x *p;.    assert
1a9a0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
1a9b0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20  utexHeld(db, 0, 
1a9c0 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
1a9d0 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69   );.    p = sqli
1a9e0 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
1a9f0 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e  Index->pSchema->
1aa00 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20  idxHash, .      
1aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
1aa30 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  e, pIndex);.    
1aa40 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61  if( p ){.      a
1aa50 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78  ssert( p==pIndex
1aa60 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d   );  /* Malloc m
1aa70 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
1aa80 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  */.      db->mal
1aa90 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
1aaa0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
1aab0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1aac0 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73   }.    db->flags
1aad0 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
1aae0 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66  nChanges;.    if
1aaf0 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
1ab00 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74  .      pIndex->t
1ab10 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e  num = db->init.n
1ab20 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20  ewTnum;.    }.  
1ab30 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
1ab40 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 43  is the initial C
1ab50 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
1ab60 65 6d 65 6e 74 20 28 6f 72 20 43 52 45 41 54 45  ement (or CREATE
1ab70 20 54 41 42 4c 45 20 69 66 20 74 68 65 0a 20 20   TABLE if the.  
1ab80 2a 2a 20 69 6e 64 65 78 20 69 73 20 61 6e 20 69  ** index is an i
1ab90 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 66 6f 72  mplied index for
1aba0 20 61 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49   a UNIQUE or PRI
1abb0 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
1abc0 69 6e 74 29 20 74 68 65 6e 0a 20 20 2a 2a 20 65  int) then.  ** e
1abd0 6d 69 74 20 63 6f 64 65 20 74 6f 20 61 6c 6c 6f  mit code to allo
1abe0 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 72  cate the index r
1abf0 6f 6f 74 70 61 67 65 20 6f 6e 20 64 69 73 6b 20  ootpage on disk 
1ac00 61 6e 64 20 6d 61 6b 65 20 61 6e 20 65 6e 74 72  and make an entr
1ac10 79 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 69  y for.  ** the i
1ac20 6e 64 65 78 20 69 6e 20 74 68 65 20 73 71 6c 69  ndex in the sqli
1ac30 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
1ac40 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65  and populate the
1ac50 20 69 6e 64 65 78 20 77 69 74 68 0a 20 20 2a 2a   index with.  **
1ac60 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74 2c 20   content.  But, 
1ac70 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 69  do not do this i
1ac80 66 20 77 65 20 61 72 65 20 73 69 6d 70 6c 79 20  f we are simply 
1ac90 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
1aca0 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74  te_master.  ** t
1acb0 61 62 6c 65 20 74 6f 20 70 61 72 73 65 20 74 68  able to parse th
1acc0 65 20 73 63 68 65 6d 61 2c 20 6f 72 20 69 66 20  e schema, or if 
1acd0 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 74 68  this index is th
1ace0 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
1acf0 64 65 78 0a 20 20 2a 2a 20 6f 66 20 61 20 57 49  dex.  ** of a WI
1ad00 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
1ad10 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
1ad20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  pTblName==0 it m
1ad30 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20  eans this index 
1ad40 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20  is generated as 
1ad50 61 6e 20 69 6d 70 6c 69 65 64 20 50 52 49 4d 41  an implied PRIMA
1ad60 52 59 20 4b 45 59 0a 20 20 2a 2a 20 6f 72 20 55  RY KEY.  ** or U
1ad70 4e 49 51 55 45 20 69 6e 64 65 78 20 69 6e 20 61  NIQUE index in a
1ad80 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
1ad90 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20  atement.  Since 
1ada0 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68  the table.  ** h
1adb0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65  as just been cre
1adc0 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e  ated, it contain
1add0 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68  s no data and th
1ade0 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69  e index initiali
1adf0 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70  zation.  ** step
1ae00 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e   can be skipped.
1ae10 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28  .  */.  else if(
1ae20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
1ae30 20 26 26 20 28 48 61 73 52 6f 77 69 64 28 70 54   && (HasRowid(pT
1ae40 61 62 29 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 21  ab) || pTblName!
1ae50 3d 30 29 20 29 7b 0a 20 20 20 20 56 64 62 65 20  =0) ){.    Vdbe 
1ae60 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  *v;.    char *zS
1ae70 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65  tmt;.    int iMe
1ae80 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
1ae90 65 6d 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c  em;..    v = sql
1aea0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1aeb0 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
1aec0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
1aed0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20  eate_index;..   
1aee0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1aef0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
1af00 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 20 20  se, 1, iDb);..  
1af10 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
1af20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65  rootpage for the
1af30 20 69 6e 64 65 78 20 75 73 69 6e 67 20 43 72 65   index using Cre
1af40 61 74 65 49 6e 64 65 78 2e 20 42 75 74 20 62 65  ateIndex. But be
1af50 66 6f 72 65 0a 20 20 20 20 2a 2a 20 64 6f 69 6e  fore.    ** doin
1af60 67 20 73 6f 2c 20 63 6f 64 65 20 61 20 4e 6f 6f  g so, code a Noo
1af70 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e  p instruction an
1af80 64 20 73 74 6f 72 65 20 69 74 73 20 61 64 64 72  d store its addr
1af90 65 73 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 49  ess in .    ** I
1afa0 6e 64 65 78 2e 74 6e 75 6d 2e 20 54 68 69 73 20  ndex.tnum. This 
1afb0 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 63  is required in c
1afc0 61 73 65 20 74 68 69 73 20 69 6e 64 65 78 20 69  ase this index i
1afd0 73 20 61 63 74 75 61 6c 6c 79 20 61 20 0a 20 20  s actually a .  
1afe0 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59    ** PRIMARY KEY
1aff0 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 69   and the table i
1b000 73 20 61 63 74 75 61 6c 6c 79 20 61 20 57 49 54  s actually a WIT
1b010 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
1b020 2e 20 49 6e 20 0a 20 20 20 20 2a 2a 20 74 68 61  . In .    ** tha
1b030 74 20 63 61 73 65 20 74 68 65 20 63 6f 6e 76 65  t case the conve
1b040 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64  rtToWithoutRowid
1b050 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 20  Table() routine 
1b060 77 69 6c 6c 20 72 65 70 6c 61 63 65 0a 20 20 20  will replace.   
1b070 20 2a 2a 20 74 68 65 20 4e 6f 6f 70 20 77 69 74   ** the Noop wit
1b080 68 20 61 20 47 6f 74 6f 20 74 6f 20 6a 75 6d 70  h a Goto to jump
1b090 20 6f 76 65 72 20 74 68 65 20 56 44 42 45 20 63   over the VDBE c
1b0a0 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 65  ode generated be
1b0b0 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 70 49 6e 64  low. */.    pInd
1b0c0 65 78 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c 69 74  ex->tnum = sqlit
1b0d0 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
1b0e0 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 73 71  OP_Noop);.    sq
1b0f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b100 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65  v, OP_CreateInde
1b110 78 2c 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a  x, iDb, iMem);..
1b120 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68      /* Gather th
1b130 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
1b140 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49 4e  of the CREATE IN
1b150 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  DEX statement in
1b160 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53  to.    ** the zS
1b170 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20  tmt variable.   
1b180 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61   */.    if( pSta
1b190 72 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  rt ){.      int 
1b1a0 6e 20 3d 20 28 69 6e 74 29 28 70 50 61 72 73 65  n = (int)(pParse
1b1b0 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d  ->sLastToken.z -
1b1c0 20 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61   pName->z) + pPa
1b1d0 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e  rse->sLastToken.
1b1e0 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61  n;.      if( pNa
1b1f0 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20  me->z[n-1]==';' 
1b200 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 2f 2a 20  ) n--;.      /* 
1b210 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69  A named index wi
1b220 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43  th an explicit C
1b230 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
1b240 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a  ement */.      z
1b250 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
1b260 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54  rintf(db, "CREAT
1b270 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c  E%s INDEX %.*s",
1b280 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72  .        onError
1b290 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a  ==OE_None ? "" :
1b2a0 20 22 20 55 4e 49 51 55 45 22 2c 20 6e 2c 20 70   " UNIQUE", n, p
1b2b0 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65  Name->z);.    }e
1b2c0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
1b2d0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
1b2e0 20 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52   created by a PR
1b2f0 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
1b300 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  QUE constraint *
1b310 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74  /.      /* zStmt
1b320 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
1b330 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20  f(""); */.      
1b340 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  zStmt = 0;.    }
1b350 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20  ..    /* Add an 
1b360 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f  entry in sqlite_
1b370 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20  master for this 
1b380 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20  index.    */.   
1b390 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
1b3a0 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
1b3b0 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
1b3c0 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27  O %Q.%s VALUES('
1b3d0 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64  index',%Q,%Q,#%d
1b3e0 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20  ,%Q);",.        
1b3f0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
1b400 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
1b410 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70  (iDb),.        p
1b420 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  Index->zName,.  
1b430 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
1b440 65 2c 0a 20 20 20 20 20 20 20 20 69 4d 65 6d 2c  e,.        iMem,
1b450 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20  .        zStmt. 
1b460 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
1b470 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d  3DbFree(db, zStm
1b480 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c  t);..    /* Fill
1b490 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20   the index with 
1b4a0 64 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65  data and reparse
1b4b0 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64   the schema. Cod
1b4c0 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20  e an OP_Expire. 
1b4d0 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64     ** to invalid
1b4e0 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70  ate all pre-comp
1b4f0 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  iled statements.
1b500 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1b510 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  pTblName ){.    
1b520 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
1b530 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
1b540 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  dex, iMem);.    
1b550 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
1b560 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
1b570 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
1b580 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68  3VdbeAddParseSch
1b590 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20  emaOp(v, iDb,.  
1b5a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
1b5b0 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d  rintf(db, "name=
1b5c0 27 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69  '%q' AND type='i
1b5d0 6e 64 65 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e  ndex'", pIndex->
1b5e0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73  zName));.      s
1b5f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
1b600 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30  (v, OP_Expire, 0
1b610 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71  );.    }..    sq
1b620 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
1b630 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75  e(v, pIndex->tnu
1b640 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68  m);.  }..  /* Wh
1b650 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64  en adding an ind
1b660 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ex to the list o
1b670 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20  f indices for a 
1b680 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a  table, make.  **
1b690 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65   sure all indice
1b6a0 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70  s labeled OE_Rep
1b6b0 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20  lace come after 
1b6c0 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65  all those labele
1b6d0 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65  d.  ** OE_Ignore
1b6e0 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
1b6f0 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72  sary for the cor
1b700 72 65 63 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  rect constraint 
1b710 63 68 65 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65  check.  ** proce
1b720 73 73 69 6e 67 20 28 69 6e 20 73 71 6c 69 74 65  ssing (in sqlite
1b730 33 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61  3GenerateConstra
1b740 69 6e 74 43 68 65 63 6b 73 28 29 29 20 61 73 20  intChecks()) as 
1b750 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44  part of.  ** UPD
1b760 41 54 45 20 61 6e 64 20 49 4e 53 45 52 54 20 73  ATE and INSERT s
1b770 74 61 74 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a  tatements.  .  *
1b780 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
1b790 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d  .busy || pTblNam
1b7a0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  e==0 ){.    if( 
1b7b0 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
1b7c0 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e  ace || pTab->pIn
1b7d0 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  dex==0.         
1b7e0 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d  || pTab->pIndex-
1b7f0 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70  >onError==OE_Rep
1b800 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e  lace){.      pIn
1b810 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61  dex->pNext = pTa
1b820 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
1b830 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20   pTab->pIndex = 
1b840 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73  pIndex;.    }els
1b850 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
1b860 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70  pOther = pTab->p
1b870 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69  Index;.      whi
1b880 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  le( pOther->pNex
1b890 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65  t && pOther->pNe
1b8a0 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  xt->onError!=OE_
1b8b0 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20  Replace ){.     
1b8c0 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68     pOther = pOth
1b8d0 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
1b8e0 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d   }.      pIndex-
1b8f0 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d  >pNext = pOther-
1b900 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f  >pNext;.      pO
1b910 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49  ther->pNext = pI
1b920 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
1b930 70 52 65 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20  pRet = pIndex;. 
1b940 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20     pIndex = 0;. 
1b950 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75   }..  /* Clean u
1b960 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  p before exiting
1b970 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f   */.exit_create_
1b980 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e  index:.  if( pIn
1b990 64 65 78 20 29 20 66 72 65 65 49 6e 64 65 78 28  dex ) freeIndex(
1b9a0 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 73  db, pIndex);.  s
1b9b0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1b9c0 28 64 62 2c 20 70 50 49 57 68 65 72 65 29 3b 0a  (db, pPIWhere);.
1b9d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
1b9e0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
1b9f0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63  t);.  sqlite3Src
1ba00 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1ba10 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  TblName);.  sqli
1ba20 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
1ba30 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ame);.  return p
1ba40 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  Ret;.}../*.** Fi
1ba50 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52  ll the Index.aiR
1ba60 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69  owEst[] array wi
1ba70 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72  th default infor
1ba80 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61  mation - informa
1ba90 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73  tion.** to be us
1baa0 65 64 20 77 68 65 6e 20 77 65 20 68 61 76 65 20  ed when we have 
1bab0 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c  not run the ANAL
1bac0 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  YZE command..**.
1bad0 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69  ** aiRowEst[0] i
1bae0 73 20 73 75 70 70 6f 73 65 64 20 74 6f 20 63 6f  s supposed to co
1baf0 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ntain the number
1bb00 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
1bb10 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69  the index..** Si
1bb20 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e  nce we do not kn
1bb30 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69 6c 6c  ow, guess 1 mill
1bb40 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b 31  ion.  aiRowEst[1
1bb50 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  ] is an estimate
1bb60 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65   of the.** numbe
1bb70 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
1bb80 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63   table that matc
1bb90 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  h any particular
1bba0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a   value of the.**
1bbb0 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66   first column of
1bbc0 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61 69 52   the index.  aiR
1bbd0 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e 20 65  owEst[2] is an e
1bbe0 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
1bbf0 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73  umber.** of rows
1bc00 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
1bc10 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69  particular combi
1bc20 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69  nation of the fi
1bc30 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  rst 2 columns.**
1bc40 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
1bc50 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49  And so forth.  I
1bc60 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65  t must always be
1bc70 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a   the case that.*
1bc80 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69  .**           ai
1bc90 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77  RowEst[N]<=aiRow
1bca0 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20  Est[N-1].**     
1bcb0 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e        aiRowEst[N
1bcc0 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74  ]>=1.**.** Apart
1bcd0 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68   from that, we h
1bce0 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f  ave little to go
1bcf0 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75   on besides intu
1bd00 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68  ition as to.** h
1bd10 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68  ow aiRowEst[] sh
1bd20 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69  ould be initiali
1bd30 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  zed.  The number
1bd40 73 20 67 65 6e 65 72 61 74 65 64 20 68 65 72 65  s generated here
1bd50 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e  .** are based on
1bd60 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20   typical values 
1bd70 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20  found in actual 
1bd80 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64  indices..*/.void
1bd90 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52   sqlite3DefaultR
1bda0 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64  owEst(Index *pId
1bdb0 78 29 7b 0a 20 20 2f 2a 20 20 20 20 20 20 20 20  x){.  /*        
1bdc0 20 20 20 20 20 20 20 20 31 30 2c 20 20 39 2c 20          10,  9, 
1bdd0 20 38 2c 20 20 37 2c 20 20 36 20 2a 2f 0a 20 20   8,  7,  6 */.  
1bde0 4c 6f 67 45 73 74 20 61 56 61 6c 5b 5d 20 3d 20  LogEst aVal[] = 
1bdf0 7b 20 33 33 2c 20 33 32 2c 20 33 30 2c 20 32 38  { 33, 32, 30, 28
1be00 2c 20 32 36 20 7d 3b 0a 20 20 4c 6f 67 45 73 74  , 26 };.  LogEst
1be10 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f   *a = pIdx->aiRo
1be20 77 4c 6f 67 45 73 74 3b 0a 20 20 69 6e 74 20 6e  wLogEst;.  int n
1be30 43 6f 70 79 20 3d 20 4d 49 4e 28 41 72 72 61 79  Copy = MIN(Array
1be40 53 69 7a 65 28 61 56 61 6c 29 2c 20 70 49 64 78  Size(aVal), pIdx
1be50 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 69 6e  ->nKeyCol);.  in
1be60 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  t i;..  /* Set t
1be70 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 28  he first entry (
1be80 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
1be90 6e 20 74 68 65 20 69 6e 64 65 78 29 20 74 6f 20  n the index) to 
1bea0 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 0a 20  the estimated . 
1beb0 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f   ** number of ro
1bec0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ws in the table.
1bed0 20 4f 72 20 31 30 2c 20 69 66 20 74 68 65 20 65   Or 10, if the e
1bee0 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
1bef0 6f 66 20 72 6f 77 73 20 0a 20 20 2a 2a 20 69 6e  of rows .  ** in
1bf00 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6c 65   the table is le
1bf10 73 73 20 74 68 61 6e 20 74 68 61 74 2e 20 20 2a  ss than that.  *
1bf20 2f 0a 20 20 61 5b 30 5d 20 3d 20 70 49 64 78 2d  /.  a[0] = pIdx-
1bf30 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67  >pTable->nRowLog
1bf40 45 73 74 3b 0a 20 20 69 66 28 20 61 5b 30 5d 3c  Est;.  if( a[0]<
1bf50 33 33 20 29 20 61 5b 30 5d 20 3d 20 33 33 3b 20  33 ) a[0] = 33; 
1bf60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 33         assert( 3
1bf70 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  3==sqlite3LogEst
1bf80 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 73  (10) );..  /* Es
1bf90 74 69 6d 61 74 65 20 74 68 61 74 20 61 5b 31 5d  timate that a[1]
1bfa0 20 69 73 20 31 30 2c 20 61 5b 32 5d 20 69 73 20   is 10, a[2] is 
1bfb0 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20 61 5b  9, a[3] is 8, a[
1bfc0 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20 69 73  4] is 7, a[5] is
1bfd0 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65 61 63 68  .  ** 6 and each
1bfe0 20 73 75 62 73 65 71 75 65 6e 74 20 76 61 6c 75   subsequent valu
1bff0 65 20 28 69 66 20 61 6e 79 29 20 69 73 20 35 2e  e (if any) is 5.
1c000 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 61    */.  memcpy(&a
1c010 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f 70 79  [1], aVal, nCopy
1c020 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 29  *sizeof(LogEst))
1c030 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70 79 2b  ;.  for(i=nCopy+
1c040 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65 79  1; i<=pIdx->nKey
1c050 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  Col; i++){.    a
1c060 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20 20 20 20  [i] = 23;       
1c070 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
1c080 65 72 74 28 20 32 33 3d 3d 73 71 6c 69 74 65 33  ert( 23==sqlite3
1c090 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a 20 20 7d  LogEst(5) );.  }
1c0a0 0a 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73  ..  assert( 0==s
1c0b0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20  qlite3LogEst(1) 
1c0c0 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75  );.  if( IsUniqu
1c0d0 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 61  eIndex(pIdx) ) a
1c0e0 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d 20  [pIdx->nKeyCol] 
1c0f0 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = 0;.}../*.** Th
1c100 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
1c110 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67  drop an existing
1c120 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54   named index.  T
1c130 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
1c140 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52  mplements the DR
1c150 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  OP INDEX stateme
1c160 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
1c170 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72  te3DropIndex(Par
1c180 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
1c190 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20  ist *pName, int 
1c1a0 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64  ifExists){.  Ind
1c1b0 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64  ex *pIndex;.  Vd
1c1c0 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33  be *v;.  sqlite3
1c1d0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1c1e0 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
1c1f0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1c200 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a  >nErr==0 );   /*
1c210 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   Never called wi
1c220 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20  th prior errors 
1c230 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
1c240 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1c250 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
1c260 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73  index;.  }.  ass
1c270 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
1c280 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  ==1 );.  if( SQL
1c290 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
1c2a0 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
1c2b0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
1c2c0 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
1c2d0 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
1c2e0 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
1c2f0 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  b, pName->a[0].z
1c300 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  Name, pName->a[0
1c310 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
1c320 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b  if( pIndex==0 ){
1c330 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69 73  .    if( !ifExis
1c340 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts ){.      sqli
1c350 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1c360 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
1c370 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20  ex: %S", pName, 
1c380 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
1c390 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
1c3a0 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d  VerifyNamedSchem
1c3b0 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d  a(pParse, pName-
1c3c0 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
1c3d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
1c3e0 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
1c3f0 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  = 1;.    goto ex
1c400 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
1c410 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d   }.  if( pIndex-
1c420 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45  >idxType!=SQLITE
1c430 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 20  _IDXTYPE_APPDEF 
1c440 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1c450 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1c460 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
1c470 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20   with UNIQUE ". 
1c480 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59       "or PRIMARY
1c490 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
1c4a0 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  cannot be droppe
1c4b0 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f  d", 0);.    goto
1c4c0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1c4d0 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
1c4e0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
1c4f0 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70  ex(db, pIndex->p
1c500 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66  Schema);.#ifndef
1c510 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1c520 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
1c530 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51     int code = SQ
1c540 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b  LITE_DROP_INDEX;
1c550 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
1c560 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
1c570 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
1c580 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
1c590 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
1c5a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
1c5b0 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
1c5c0 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73  (iDb);.    if( s
1c5d0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1c5e0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
1c5f0 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
1c600 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
1c610 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1c620 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
1c630 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
1c640 26 20 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53  & iDb ) code = S
1c650 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
1c660 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
1c670 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1c680 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49  pParse, code, pI
1c690 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61  ndex->zName, pTa
1c6a0 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
1c6b0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
1c6c0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1c6d0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1c6e0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1c6f0 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
1c700 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20   index and from 
1c710 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
1c720 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
1c730 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1c740 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
1c750 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1c760 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
1c770 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20  se, 1, iDb);.   
1c780 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
1c790 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
1c7a0 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
1c7b0 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65  %Q.%s WHERE name
1c7c0 3d 25 51 20 41 4e 44 20 74 79 70 65 3d 27 69 6e  =%Q AND type='in
1c7d0 64 65 78 27 22 2c 0a 20 20 20 20 20 20 20 64 62  dex'",.       db
1c7e0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
1c7f0 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
1c800 44 62 29 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  Db), pIndex->zNa
1c810 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  me.    );.    sq
1c820 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61  lite3ClearStatTa
1c830 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44 62  bles(pParse, iDb
1c840 2c 20 22 69 64 78 22 2c 20 70 49 6e 64 65 78 2d  , "idx", pIndex-
1c850 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
1c860 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
1c870 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
1c880 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61     destroyRootPa
1c890 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ge(pParse, pInde
1c8a0 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
1c8b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c8c0 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49  dOp4(v, OP_DropI
1c8d0 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c  ndex, iDb, 0, 0,
1c8e0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
1c8f0 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72  0);.  }..exit_dr
1c900 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69  op_index:.  sqli
1c910 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1c920 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  (db, pName);.}..
1c930 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69 73 20  /*.** pArray is 
1c940 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
1c950 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73  array of objects
1c960 2e 20 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e  . Each object in
1c970 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73   the.** array is
1c980 20 73 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69   szEntry bytes i
1c990 6e 20 73 69 7a 65 2e 20 54 68 69 73 20 72 6f 75  n size. This rou
1c9a0 74 69 6e 65 20 75 73 65 73 20 73 71 6c 69 74 65  tine uses sqlite
1c9b0 33 44 62 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20  3DbRealloc().** 
1c9c0 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 61 72  to extend the ar
1c9d0 72 61 79 20 73 6f 20 74 68 61 74 20 74 68 65 72  ray so that ther
1c9e0 65 20 69 73 20 73 70 61 63 65 20 66 6f 72 20 61  e is space for a
1c9f0 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 74 20 74   new object at t
1ca00 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68  he end..**.** Wh
1ca10 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1ca20 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 45   is called, *pnE
1ca30 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73 20 74 68  ntry contains th
1ca40 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
1ca50 66 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20 28  f.** the array (
1ca60 69 6e 20 65 6e 74 72 69 65 73 20 2d 20 73 6f 20  in entries - so 
1ca70 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  the allocation i
1ca80 73 20 28 28 2a 70 6e 45 6e 74 72 79 29 20 2a 20  s ((*pnEntry) * 
1ca90 73 7a 45 6e 74 72 79 29 20 62 79 74 65 73 0a 2a  szEntry) bytes.*
1caa0 2a 20 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a  * in total)..**.
1cab0 2a 2a 20 49 66 20 74 68 65 20 72 65 61 6c 6c 6f  ** If the reallo
1cac0 63 28 29 20 69 73 20 73 75 63 63 65 73 73 66 75  c() is successfu
1cad0 6c 20 28 69 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f  l (i.e. if no OO
1cae0 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75  M condition occu
1caf0 72 73 29 2c 20 74 68 65 0a 2a 2a 20 73 70 61 63  rs), the.** spac
1cb00 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
1cb10 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69  the new object i
1cb20 73 20 7a 65 72 6f 65 64 2c 20 2a 70 6e 45 6e 74  s zeroed, *pnEnt
1cb30 72 79 20 75 70 64 61 74 65 64 20 74 6f 0a 2a 2a  ry updated to.**
1cb40 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77   reflect the new
1cb50 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
1cb60 61 79 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72  ay and a pointer
1cb70 20 74 6f 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f   to the new allo
1cb80 63 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e  cation.** return
1cb90 65 64 2e 20 2a 70 49 64 78 20 69 73 20 73 65 74  ed. *pIdx is set
1cba0 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
1cbb0 20 74 68 65 20 6e 65 77 20 61 72 72 61 79 20 65   the new array e
1cbc0 6e 74 72 79 20 69 6e 20 74 68 69 73 20 63 61 73  ntry in this cas
1cbd0 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  e..**.** Otherwi
1cbe0 73 65 2c 20 69 66 20 74 68 65 20 72 65 61 6c 6c  se, if the reall
1cbf0 6f 63 28 29 20 66 61 69 6c 73 2c 20 2a 70 49 64  oc() fails, *pId
1cc00 78 20 69 73 20 73 65 74 20 74 6f 20 2d 31 2c 20  x is set to -1, 
1cc10 2a 70 6e 45 6e 74 72 79 20 72 65 6d 61 69 6e 73  *pnEntry remains
1cc20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  .** unchanged an
1cc30 64 20 61 20 63 6f 70 79 20 6f 66 20 70 41 72 72  d a copy of pArr
1cc40 61 79 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  ay returned..*/.
1cc50 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 41 72 72  void *sqlite3Arr
1cc60 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71  ayAllocate(.  sq
1cc70 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1cc80 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  /* Connection to
1cc90 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f   notify of mallo
1cca0 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20  c failures */.  
1ccb0 76 6f 69 64 20 2a 70 41 72 72 61 79 2c 20 20 20  void *pArray,   
1ccc0 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 62    /* Array of ob
1ccd0 6a 65 63 74 73 2e 20 20 4d 69 67 68 74 20 62 65  jects.  Might be
1cce0 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a   reallocated */.
1ccf0 20 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20    int szEntry,  
1cd00 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65      /* Size of e
1cd10 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  ach object in th
1cd20 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  e array */.  int
1cd30 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f   *pnEntry,     /
1cd40 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65  * Number of obje
1cd50 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  cts currently in
1cd60 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   use */.  int *p
1cd70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 57  Idx         /* W
1cd80 72 69 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f  rite the index o
1cd90 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65 72  f a new slot her
1cda0 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  e */.){.  char *
1cdb0 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 2a 70 6e  z;.  int n = *pn
1cdc0 45 6e 74 72 79 3b 0a 20 20 69 66 28 20 28 6e 20  Entry;.  if( (n 
1cdd0 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a 20  & (n-1))==0 ){. 
1cde0 20 20 20 69 6e 74 20 73 7a 20 3d 20 28 6e 3d 3d     int sz = (n==
1cdf0 30 29 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20 20  0) ? 1 : 2*n;.  
1ce00 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 73    void *pNew = s
1ce10 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
1ce20 64 62 2c 20 70 41 72 72 61 79 2c 20 73 7a 2a 73  db, pArray, sz*s
1ce30 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66 28  zEntry);.    if(
1ce40 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
1ce50 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20    *pIdx = -1;.  
1ce60 20 20 20 20 72 65 74 75 72 6e 20 70 41 72 72 61      return pArra
1ce70 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72  y;.    }.    pAr
1ce80 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ray = pNew;.  }.
1ce90 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 41 72    z = (char*)pAr
1cea0 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a  ray;.  memset(&z
1ceb0 5b 6e 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30  [n * szEntry], 0
1cec0 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70  , szEntry);.  *p
1ced0 49 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b 2a 70 6e  Idx = n;.  ++*pn
1cee0 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20  Entry;.  return 
1cef0 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pArray;.}../*.**
1cf00 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c   Append a new el
1cf10 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76  ement to the giv
1cf20 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61  en IdList.  Crea
1cf30 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20  te a new IdList 
1cf40 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a  if.** need be..*
1cf50 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73  *.** A new IdLis
1cf60 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
1cf70 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
1cf80 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c  () fails..*/.IdL
1cf90 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
1cfa0 73 74 41 70 70 65 6e 64 28 73 71 6c 69 74 65 33  stAppend(sqlite3
1cfb0 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c   *db, IdList *pL
1cfc0 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
1cfd0 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  en){.  int i;.  
1cfe0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
1cff0 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
1d000 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
1d010 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69 73  db, sizeof(IdLis
1d020 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
1d030 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
1d040 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e  0;.  }.  pList->
1d050 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  a = sqlite3Array
1d060 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
1d070 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73 74 2d  db,.      pList-
1d080 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  >a,.      sizeof
1d090 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20  (pList->a[0]),. 
1d0a0 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64       &pList->nId
1d0b0 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  ,.      &i.  );.
1d0c0 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
1d0d0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1d0e0 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
1d0f0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1d100 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   }.  pList->a[i]
1d110 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  .zName = sqlite3
1d120 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1d130 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74  , pToken);.  ret
1d140 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
1d150 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64  .** Delete an Id
1d160 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  List..*/.void sq
1d170 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
1d180 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  e(sqlite3 *db, I
1d190 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  dList *pList){. 
1d1a0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1d1b0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1d1c0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
1d1d0 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
1d1e0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1d1f0 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  e(db, pList->a[i
1d200 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ].zName);.  }.  
1d210 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1d220 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  , pList->a);.  s
1d230 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1d240 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
1d250 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
1d260 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74  ex in pList of t
1d270 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61  he identifier na
1d280 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e  med zId.  Return
1d290 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f   -1.** if not fo
1d2a0 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  und..*/.int sqli
1d2b0 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49  te3IdListIndex(I
1d2c0 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f  dList *pList, co
1d2d0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
1d2e0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
1d2f0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1d300 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30  rn -1;.  for(i=0
1d310 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
1d320 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
1d330 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
1d340 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
1d350 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
1d360 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
1d370 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
1d380 45 78 70 61 6e 64 20 74 68 65 20 73 70 61 63 65  Expand the space
1d390 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
1d3a0 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74  he given SrcList
1d3b0 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63 72   object by.** cr
1d3c0 65 61 74 69 6e 67 20 6e 45 78 74 72 61 20 6e 65  eating nExtra ne
1d3d0 77 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69 6e  w slots beginnin
1d3e0 67 20 61 74 20 69 53 74 61 72 74 2e 20 20 69 53  g at iStart.  iS
1d3f0 74 61 72 74 20 69 73 20 7a 65 72 6f 20 62 61 73  tart is zero bas
1d400 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74 73  ed..** New slots
1d410 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a   are zeroed..**.
1d420 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1d430 73 75 70 70 6f 73 65 20 61 20 53 72 63 4c 69 73  suppose a SrcLis
1d440 74 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e 74  t initially cont
1d450 61 69 6e 73 20 74 77 6f 20 65 6e 74 72 69 65 73  ains two entries
1d460 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70 70  : A,B..** To app
1d470 65 6e 64 20 33 20 6e 65 77 20 65 6e 74 72 69 65  end 3 new entrie
1d480 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c 20  s onto the end, 
1d490 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  do this:.**.**  
1d4a0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1d4b0 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63  Enlarge(db, pSrc
1d4c0 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a  list, 3, 2);.**.
1d4d0 2a 2a 20 41 66 74 65 72 20 74 68 65 20 63 61 6c  ** After the cal
1d4e0 6c 20 61 62 6f 76 65 20 69 74 20 77 6f 75 6c 64  l above it would
1d4f0 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42 2c   contain:  A, B,
1d500 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a   nil, nil, nil..
1d510 2a 2a 20 49 66 20 74 68 65 20 69 53 74 61 72 74  ** If the iStart
1d520 20 61 72 67 75 6d 65 6e 74 20 68 61 64 20 62 65   argument had be
1d530 65 6e 20 31 20 69 6e 73 74 65 61 64 20 6f 66 20  en 1 instead of 
1d540 32 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  2, then the resu
1d550 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65  lt.** would have
1d560 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20   been:  A, nil, 
1d570 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54 6f  nil, nil, B.  To
1d580 20 70 72 65 70 65 6e 64 20 74 68 65 20 6e 65 77   prepend the new
1d590 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20 69   slots,.** the i
1d5a0 53 74 61 72 74 20 76 61 6c 75 65 20 77 6f 75 6c  Start value woul
1d5b0 64 20 62 65 20 30 2e 20 20 54 68 65 20 72 65 73  d be 0.  The res
1d5c0 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a 2a  ult then would.*
1d5d0 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20  * be: nil, nil, 
1d5e0 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a  nil, A, B..**.**
1d5f0 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
1d600 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 74 68  ocation fails th
1d610 65 20 53 72 63 4c 69 73 74 20 69 73 20 75 6e 63  e SrcList is unc
1d620 68 61 6e 67 65 64 2e 20 20 54 68 65 0a 2a 2a 20  hanged.  The.** 
1d630 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1d640 20 66 6c 61 67 20 77 69 6c 6c 20 62 65 20 73 65   flag will be se
1d650 74 20 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a 53 72  t to true..*/.Sr
1d660 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
1d670 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 0a 20 20  cListEnlarge(.  
1d680 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1d690 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
1d6a0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74  onnection to not
1d6b0 69 66 79 20 6f 66 20 4f 4f 4d 20 65 72 72 6f 72  ify of OOM error
1d6c0 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  s */.  SrcList *
1d6d0 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 68 65  pSrc,     /* The
1d6e0 20 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20 65   SrcList to be e
1d6f0 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74  nlarged */.  int
1d700 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
1d710 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 77  /* Number of new
1d720 20 73 6c 6f 74 73 20 74 6f 20 61 64 64 20 74 6f   slots to add to
1d730 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20   pSrc->a[] */.  
1d740 69 6e 74 20 69 53 74 61 72 74 20 20 20 20 20 20  int iStart      
1d750 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
1d760 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72 73  Src->a[] of firs
1d770 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b  t new slot */.){
1d780 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
1d790 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
1d7a0 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72 61 6d  on calling param
1d7b0 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72  eters */.  asser
1d7c0 74 28 20 69 53 74 61 72 74 3e 3d 30 20 29 3b 0a  t( iStart>=0 );.
1d7d0 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61    assert( nExtra
1d7e0 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
1d7f0 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 61 73   pSrc!=0 );.  as
1d800 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70 53  sert( iStart<=pS
1d810 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20 20 2f  rc->nSrc );..  /
1d820 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64 64 69 74  * Allocate addit
1d830 69 6f 6e 61 6c 20 73 70 61 63 65 20 69 66 20 6e  ional space if n
1d840 65 65 64 65 64 20 2a 2f 0a 20 20 69 66 28 20 28  eeded */.  if( (
1d850 75 33 32 29 70 53 72 63 2d 3e 6e 53 72 63 2b 6e  u32)pSrc->nSrc+n
1d860 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c  Extra>pSrc->nAll
1d870 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  oc ){.    SrcLis
1d880 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74  t *pNew;.    int
1d890 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63 2d 3e   nAlloc = pSrc->
1d8a0 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20 20 20  nSrc+nExtra;.   
1d8b0 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20 20 70   int nGot;.    p
1d8c0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
1d8d0 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63 2c  ealloc(db, pSrc,
1d8e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d8f0 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b 20  sizeof(*pSrc) + 
1d900 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f  (nAlloc-1)*sizeo
1d910 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 3b  f(pSrc->a[0]) );
1d920 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
1d930 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1d940 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1d950 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ed );.      retu
1d960 72 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a 20  rn pSrc;.    }. 
1d970 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77 3b 0a     pSrc = pNew;.
1d980 20 20 20 20 6e 47 6f 74 20 3d 20 28 73 71 6c 69      nGot = (sqli
1d990 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
1d9a0 64 62 2c 20 70 4e 65 77 29 20 2d 20 73 69 7a 65  db, pNew) - size
1d9b0 6f 66 28 2a 70 53 72 63 29 29 2f 73 69 7a 65 6f  of(*pSrc))/sizeo
1d9c0 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b 31 3b  f(pSrc->a[0])+1;
1d9d0 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f  .    pSrc->nAllo
1d9e0 63 20 3d 20 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20  c = nGot;.  }.. 
1d9f0 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74 69 6e   /* Move existin
1da00 67 20 73 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d  g slots that com
1da10 65 20 61 66 74 65 72 20 74 68 65 20 6e 65 77 6c  e after the newl
1da20 79 20 69 6e 73 65 72 74 65 64 20 73 6c 6f 74 73  y inserted slots
1da30 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65  .  ** out of the
1da40 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d   way */.  for(i=
1da50 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e  pSrc->nSrc-1; i>
1da60 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20  =iStart; i--){. 
1da70 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78     pSrc->a[i+nEx
1da80 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69  tra] = pSrc->a[i
1da90 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e  ];.  }.  pSrc->n
1daa0 53 72 63 20 2b 3d 20 6e 45 78 74 72 61 3b 0a 0a  Src += nExtra;..
1dab0 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65    /* Zero the ne
1dac0 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c  wly allocated sl
1dad0 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ots */.  memset(
1dae0 26 70 53 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d  &pSrc->a[iStart]
1daf0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 72 63  , 0, sizeof(pSrc
1db00 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b  ->a[0])*nExtra);
1db10 0a 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 3b  .  for(i=iStart;
1db20 20 69 3c 69 53 74 61 72 74 2b 6e 45 78 74 72 61   i<iStart+nExtra
1db30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63  ; i++){.    pSrc
1db40 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d  ->a[i].iCursor =
1db50 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52   -1;.  }..  /* R
1db60 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1db70 74 6f 20 74 68 65 20 65 6e 6c 61 72 67 65 64 20  to the enlarged 
1db80 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74  SrcList */.  ret
1db90 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a  urn pSrc;.}.../*
1dba0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
1dbb0 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
1dbc0 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74  he given SrcList
1dbd0 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
1dbe0 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65  SrcList if.** ne
1dbf0 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e  ed be.  A new en
1dc00 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69  try is created i
1dc10 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76  n the SrcList ev
1dc20 65 6e 20 69 66 20 70 54 61 62 6c 65 20 69 73 20  en if pTable is 
1dc30 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72  NULL..**.** A Sr
1dc40 63 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  cList is returne
1dc50 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68  d, or NULL if th
1dc60 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72  ere is an OOM er
1dc70 72 6f 72 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ror.  The return
1dc80 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69  ed.** SrcList mi
1dc90 67 68 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ght be the same 
1dca0 61 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  as the SrcList t
1dcb0 68 61 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72  hat was input or
1dcc0 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20   it might be.** 
1dcd0 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61  a new one.  If a
1dce0 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73  n OOM error does
1dcf0 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68   occurs, then th
1dd00 65 20 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66  e prior value of
1dd10 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69   pList.** that i
1dd20 73 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20  s input to this 
1dd30 72 6f 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d  routine is autom
1dd40 61 74 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a  atically freed..
1dd50 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61  **.** If pDataba
1dd60 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20  se is not null, 
1dd70 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
1dd80 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f  e table has an o
1dd90 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62  ptional.** datab
1dda0 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e  ase name prefix.
1ddb0 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64    Like this:  "d
1ddc0 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20  atabase.table". 
1ddd0 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a   The pDatabase.*
1dde0 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
1ddf0 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74  table name and t
1de00 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73  he pTable points
1de10 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1de20 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72   name..** The Sr
1de30 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20  cList.a[].zName 
1de40 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20  field is filled 
1de50 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e  with the table n
1de60 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a  ame which might.
1de70 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61  ** come from pTa
1de80 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73  ble (if pDatabas
1de90 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72  e is NULL) or fr
1dea0 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a  om pDatabase.  .
1deb0 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  ** SrcList.a[].z
1dec0 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c  Database is fill
1ded0 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
1dee0 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70  base name from p
1def0 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74  Table,.** or wit
1df00 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74  h NULL if no dat
1df10 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69  abase is specifi
1df20 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68  ed..**.** In oth
1df30 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c  er words, if cal
1df40 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  l like this:.**.
1df50 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
1df60 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
1df70 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,B,0);.**.** 
1df80 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c  Then B is a tabl
1df90 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64  e name and the d
1dfa0 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
1dfb0 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66  unspecified.  If
1dfc0 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20   called.** like 
1dfd0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
1dfe0 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
1dff0 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43  stAppend(D,A,B,C
1e000 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20  );.**.** Then C 
1e010 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  is the table nam
1e020 65 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64  e and B is the d
1e030 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 20 20 49  atabase name.  I
1e040 66 20 43 20 69 73 20 64 65 66 69 6e 65 64 0a 2a  f C is defined.*
1e050 2a 20 74 68 65 6e 20 73 6f 20 69 73 20 42 2e 20  * then so is B. 
1e060 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1e070 20 77 65 20 6e 65 76 65 72 20 68 61 76 65 20 61   we never have a
1e080 20 63 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a   case where:.**.
1e090 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
1e0a0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
1e0b0 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,0,C);.**.** 
1e0c0 42 6f 74 68 20 70 54 61 62 6c 65 20 61 6e 64 20  Both pTable and 
1e0d0 70 44 61 74 61 62 61 73 65 20 61 72 65 20 61 73  pDatabase are as
1e0e0 73 75 6d 65 64 20 74 6f 20 62 65 20 71 75 6f 74  sumed to be quot
1e0f0 65 64 2e 20 20 54 68 65 79 20 61 72 65 20 64 65  ed.  They are de
1e100 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65  quoted.** before
1e110 20 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20   being added to 
1e120 74 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a  the SrcList..*/.
1e130 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
1e140 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20  SrcListAppend(. 
1e150 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
1e160 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
1e170 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20  on to notify of 
1e180 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20  malloc failures 
1e190 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4c  */.  SrcList *pL
1e1a0 69 73 74 2c 20 20 20 20 20 2f 2a 20 41 70 70 65  ist,     /* Appe
1e1b0 6e 64 20 74 6f 20 74 68 69 73 20 53 72 63 4c 69  nd to this SrcLi
1e1c0 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65 73  st. NULL creates
1e1d0 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 2a   a new SrcList *
1e1e0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  /.  Token *pTabl
1e1f0 65 2c 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  e,      /* Table
1e200 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20   to append */.  
1e210 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65  Token *pDatabase
1e220 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1e230 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  of the table */.
1e240 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  ){.  struct SrcL
1e250 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1e260 0a 20 20 61 73 73 65 72 74 28 20 70 44 61 74 61  .  assert( pData
1e270 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c  base==0 || pTabl
1e280 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e  e!=0 );  /* Cann
1e290 6f 74 20 68 61 76 65 20 43 20 77 69 74 68 6f 75  ot have C withou
1e2a0 74 20 42 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69  t B */.  if( pLi
1e2b0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
1e2c0 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
1e2d0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
1e2e0 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a  eof(SrcList) );.
1e2f0 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
1e300 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
1e310 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
1e320 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20   1;.  }.  pList 
1e330 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
1e340 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 4c 69 73  Enlarge(db, pLis
1e350 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72  t, 1, pList->nSr
1e360 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  c);.  if( db->ma
1e370 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
1e380 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1e390 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
1e3a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
1e3b0 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
1e3c0 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
1e3d0 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70  nSrc-1];.  if( p
1e3e0 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74  Database && pDat
1e3f0 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  abase->z==0 ){. 
1e400 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30     pDatabase = 0
1e410 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74  ;.  }.  if( pDat
1e420 61 62 61 73 65 20 29 7b 0a 20 20 20 20 54 6f 6b  abase ){.    Tok
1e430 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74  en *pTemp = pDat
1e440 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61  abase;.    pData
1e450 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20  base = pTable;. 
1e460 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d     pTable = pTem
1e470 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e  p;.  }.  pItem->
1e480 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
1e490 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
1e4a0 20 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74 65   pTable);.  pIte
1e4b0 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
1e4c0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1e4d0 6b 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61 73  ken(db, pDatabas
1e4e0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  e);.  return pLi
1e4f0 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  st;.}../*.** Ass
1e500 69 67 6e 20 56 64 62 65 43 75 72 73 6f 72 20 69  ign VdbeCursor i
1e510 6e 64 65 78 20 6e 75 6d 62 65 72 73 20 74 6f 20  ndex numbers to 
1e520 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20  all tables in a 
1e530 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20  SrcList.*/.void 
1e540 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
1e550 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73  signCursors(Pars
1e560 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
1e570 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
1e580 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72  t i;.  struct Sr
1e590 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1e5a0 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 73  m;.  assert(pLis
1e5b0 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  t || pParse->db-
1e5c0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1e5d0 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
1e5e0 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
1e5f0 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  em=pList->a; i<p
1e600 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
1e610 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
1e620 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72   if( pItem->iCur
1e630 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a  sor>=0 ) break;.
1e640 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75        pItem->iCu
1e650 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
1e660 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  Tab++;.      if(
1e670 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
1e680 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1e690 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
1e6a0 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
1e6b0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  Item->pSelect->p
1e6c0 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Src);.      }.  
1e6d0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1e6e0 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
1e6f0 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64  e SrcList includ
1e700 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73  ing all its subs
1e710 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
1e720 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
1e730 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
1e740 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  db, SrcList *pLi
1e750 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
1e760 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1e770 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66  tem *pItem;.  if
1e780 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1e790 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  urn;.  for(pItem
1e7a0 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
1e7b0 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  i<pList->nSrc; i
1e7c0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1e7d0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1e7e0 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  db, pItem->zData
1e7f0 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  base);.    sqlit
1e800 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
1e810 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
1e820 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1e830 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  , pItem->zAlias)
1e840 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ;.    if( pItem-
1e850 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20  >fg.isIndexedBy 
1e860 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
1e870 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49  db, pItem->u1.zI
1e880 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 69  ndexedBy);.    i
1e890 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54  f( pItem->fg.isT
1e8a0 61 62 46 75 6e 63 20 29 20 73 71 6c 69 74 65 33  abFunc ) sqlite3
1e8b0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
1e8c0 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75  b, pItem->u1.pFu
1e8d0 6e 63 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69  ncArg);.    sqli
1e8e0 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
1e8f0 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b  b, pItem->pTab);
1e900 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
1e910 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  ctDelete(db, pIt
1e920 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  em->pSelect);.  
1e930 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1e940 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
1e950 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  On);.    sqlite3
1e960 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
1e970 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b   pItem->pUsing);
1e980 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
1e990 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  Free(db, pList);
1e9a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1e9b0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1e9c0 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74   by the parser t
1e9d0 6f 20 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d  o add a new term
1e9e0 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
1e9f0 66 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d  f a growing FROM
1ea00 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70   clause.  The "p
1ea10 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  " parameter is t
1ea20 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68  he part of.** th
1ea30 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68  e FROM clause th
1ea40 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
1ea50 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e  een constructed.
1ea60 20 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a    "p" is NULL.**
1ea70 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
1ea80 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68  first term of th
1ea90 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
1eaa0 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61  pTable and pData
1eab0 62 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  base.** are the 
1eac0 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
1ead0 65 20 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e  e and database n
1eae0 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d  amed in the FROM
1eaf0 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a   clause term..**
1eb00 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55   pDatabase is NU
1eb10 4c 4c 20 69 66 20 74 68 65 20 64 61 74 61 62 61  LL if the databa
1eb20 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65  se name qualifie
1eb30 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74  r is missing - t
1eb40 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65  he.** usual case
1eb50 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 68  .  If the term h
1eb60 61 73 20 61 6e 20 61 6c 69 61 73 2c 20 74 68 65  as an alias, the
1eb70 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20  n pAlias points 
1eb80 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20  to the.** alias 
1eb90 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74  token.  If the t
1eba0 65 72 6d 20 69 73 20 61 20 73 75 62 71 75 65 72  erm is a subquer
1ebb0 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65 72  y, then pSubquer
1ebc0 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45  y is the.** SELE
1ebd0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
1ebe0 74 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65  t the subquery e
1ebf0 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61  ncodes.  The pTa
1ec00 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61  ble and.** pData
1ec10 62 61 73 65 20 70 61 72 61 6d 65 74 65 72 73 20  base parameters 
1ec20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62  are NULL for sub
1ec30 71 75 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f  queries.  The pO
1ec40 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20  n and pUsing.** 
1ec50 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 74  parameters are t
1ec60 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
1ec70 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  e ON and USING c
1ec80 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  lauses..**.** Re
1ec90 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69  turn a new SrcLi
1eca0 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73  st which encodes
1ecb0 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74   is the FROM wit
1ecc0 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72  h the new.** ter
1ecd0 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c  m added..*/.SrcL
1ece0 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
1ecf0 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72  istAppendFromTer
1ed00 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
1ed10 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
1ed20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
1ed30 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c  */.  SrcList *p,
1ed40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ed50 54 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66  The left part of
1ed60 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1ed70 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f   already seen */
1ed80 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
1ed90 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ,          /* Na
1eda0 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
1edb0 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46 52  to add to the FR
1edc0 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54  OM clause */.  T
1edd0 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c  oken *pDatabase,
1ede0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1edf0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  f the database c
1ee00 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65  ontaining pTable
1ee10 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c   */.  Token *pAl
1ee20 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ias,          /*
1ee30 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
1ee40 73 69 64 65 20 6f 66 20 74 68 65 20 41 53 20 73  side of the AS s
1ee50 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  ubexpression */.
1ee60 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75    Select *pSubqu
1ee70 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73  ery,      /* A s
1ee80 75 62 71 75 65 72 79 20 75 73 65 64 20 69 6e 20  ubquery used in 
1ee90 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65  place of a table
1eea0 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20   name */.  Expr 
1eeb0 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  *pOn,           
1eec0 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61     /* The ON cla
1eed0 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f  use of a join */
1eee0 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e  .  IdList *pUsin
1eef0 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g          /* Th
1ef00 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  e USING clause o
1ef10 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20  f a join */.){. 
1ef20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1ef30 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
1ef40 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1ef50 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21  rse->db;.  if( !
1ef60 70 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73  p && (pOn || pUs
1ef70 69 6e 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ing) ){.    sqli
1ef80 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1ef90 73 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75  se, "a JOIN clau
1efa0 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  se is required b
1efb0 65 66 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20  efore %s", .    
1efc0 20 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20    (pOn ? "ON" : 
1efd0 22 55 53 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a  "USING").    );.
1efe0 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f      goto append_
1eff0 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  from_error;.  }.
1f000 20 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63    p = sqlite3Src
1f010 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70  ListAppend(db, p
1f020 2c 20 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62  , pTable, pDatab
1f030 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ase);.  if( p==0
1f040 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 53 72   || NEVER(p->nSr
1f050 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 67 6f 74  c==0) ){.    got
1f060 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72  o append_from_er
1f070 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  ror;.  }.  pItem
1f080 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63   = &p->a[p->nSrc
1f090 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  -1];.  assert( p
1f0a0 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20 69 66  Alias!=0 );.  if
1f0b0 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20  ( pAlias->n ){. 
1f0c0 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73     pItem->zAlias
1f0d0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1f0e0 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69  omToken(db, pAli
1f0f0 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  as);.  }.  pItem
1f100 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62  ->pSelect = pSub
1f110 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e  query;.  pItem->
1f120 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74  pOn = pOn;.  pIt
1f130 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73  em->pUsing = pUs
1f140 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  ing;.  return p;
1f150 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65  .. append_from_e
1f160 72 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20  rror:.  assert( 
1f170 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  p==0 );.  sqlite
1f180 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1f190 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49  pOn);.  sqlite3I
1f1a0 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
1f1b0 70 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74  pUsing);.  sqlit
1f1c0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
1f1d0 62 2c 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20  b, pSubquery);. 
1f1e0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1f1f0 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58  .** Add an INDEX
1f200 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44  ED BY or NOT IND
1f210 45 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74  EXED clause to t
1f220 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
1f230 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65   added .** eleme
1f240 6e 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65  nt of the source
1f250 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20  -list passed as 
1f260 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1f270 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
1f280 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78  ite3SrcListIndex
1f290 65 64 42 79 28 50 61 72 73 65 20 2a 70 50 61 72  edBy(Parse *pPar
1f2a0 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  se, SrcList *p, 
1f2b0 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42  Token *pIndexedB
1f2c0 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49  y){.  assert( pI
1f2d0 6e 64 65 78 65 64 42 79 21 3d 30 20 29 3b 0a 20  ndexedBy!=0 );. 
1f2e0 20 69 66 28 20 70 20 26 26 20 41 4c 57 41 59 53   if( p && ALWAYS
1f2f0 28 70 2d 3e 6e 53 72 63 3e 30 29 20 29 7b 0a 20  (p->nSrc>0) ){. 
1f300 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
1f310 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
1f320 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d  &p->a[p->nSrc-1]
1f330 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
1f340 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78  tem->fg.notIndex
1f350 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ed==0 );.    ass
1f360 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69  ert( pItem->fg.i
1f370 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b  sIndexedBy==0 );
1f380 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
1f390 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
1f3a0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
1f3b0 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20  IndexedBy->n==1 
1f3c0 26 26 20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e  && !pIndexedBy->
1f3d0 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  z ){.      /* A 
1f3e0 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c  "NOT INDEXED" cl
1f3f0 61 75 73 65 20 77 61 73 20 73 75 70 70 6c 69 65  ause was supplie
1f400 64 2e 20 53 65 65 20 70 61 72 73 65 2e 79 20 0a  d. See parse.y .
1f410 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75        ** constru
1f420 63 74 20 22 69 6e 64 65 78 65 64 5f 6f 70 74 22  ct "indexed_opt"
1f430 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f   for details. */
1f440 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  .      pItem->fg
1f450 2e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 31 3b  .notIndexed = 1;
1f460 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f470 20 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64    pItem->u1.zInd
1f480 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33  exedBy = sqlite3
1f490 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
1f4a0 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78  arse->db, pIndex
1f4b0 65 64 42 79 29 3b 0a 20 20 20 20 20 20 70 49 74  edBy);.      pIt
1f4c0 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64  em->fg.isIndexed
1f4d0 42 79 20 3d 20 28 70 49 74 65 6d 2d 3e 75 31 2e  By = (pItem->u1.
1f4e0 7a 49 6e 64 65 78 65 64 42 79 21 3d 30 29 3b 0a  zIndexedBy!=0);.
1f4f0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1f500 2a 2a 20 41 64 64 20 74 68 65 20 6c 69 73 74 20  ** Add the list 
1f510 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
1f520 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 53 72 63  ments to the Src
1f530 4c 69 73 74 20 65 6e 74 72 79 20 66 6f 72 20 61  List entry for a
1f540 0a 2a 2a 20 74 61 62 6c 65 2d 76 61 6c 75 65 64  .** table-valued
1f550 2d 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  -function..*/.vo
1f560 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
1f570 74 46 75 6e 63 41 72 67 73 28 50 61 72 73 65 20  tFuncArgs(Parse 
1f580 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
1f590 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70   *p, ExprList *p
1f5a0 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70 20 26  List){.  if( p &
1f5b0 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73  & pList ){.    s
1f5c0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1f5d0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
1f5e0 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
1f5f0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
1f600 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  >fg.notIndexed==
1f610 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1f620 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64   pItem->fg.isInd
1f630 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20  exedBy==0 );.   
1f640 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
1f650 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20  fg.isTabFunc==0 
1f660 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 31  );.    pItem->u1
1f670 2e 70 46 75 6e 63 41 72 67 20 3d 20 70 4c 69 73  .pFuncArg = pLis
1f680 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  t;.    pItem->fg
1f690 2e 69 73 54 61 62 46 75 6e 63 20 3d 20 31 3b 0a  .isTabFunc = 1;.
1f6a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1f6b0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
1f6c0 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
1f6d0 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  List);.  }.}../*
1f6e0 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e  .** When buildin
1f6f0 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75  g up a FROM clau
1f700 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  se in the parser
1f710 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  , the join opera
1f720 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61  tor.** is initia
1f730 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f 20  lly attached to 
1f740 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
1f750 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65 20  .  But the code 
1f760 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70  generator.** exp
1f770 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ects the join op
1f780 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20  erator to be on 
1f790 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
1f7a0 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
1f7b0 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a  .** Shifts all j
1f7c0 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72  oin operators fr
1f7d0 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
1f7e0 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46   for an entire F
1f7f0 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a  ROM.** clause..*
1f800 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75  *.** Example: Su
1f810 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69  ppose the join i
1f820 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
1f830 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20 6e  **           A n
1f840 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69  atural cross joi
1f850 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  n B.**.** The op
1f860 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72  erator is "natur
1f870 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20  al cross join". 
1f880 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65   The A and B ope
1f890 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64  rands are stored
1f8a0 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61  .** in p->a[0] a
1f8b0 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70  nd p->a[1], resp
1f8c0 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70  ectively.  The p
1f8d0 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20  arser initially 
1f8e0 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70  stores the.** op
1f8f0 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20  erator with A.  
1f900 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69  This routine shi
1f910 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f  fts that operato
1f920 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a  r over to B..*/.
1f930 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
1f940 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65  istShiftJoinType
1f950 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20  (SrcList *p){.  
1f960 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
1f970 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d   i;.    for(i=p-
1f980 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d  >nSrc-1; i>0; i-
1f990 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69  -){.      p->a[i
1f9a0 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  ].fg.jointype = 
1f9b0 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f 69  p->a[i-1].fg.joi
1f9c0 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20  ntype;.    }.   
1f9d0 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69 6e   p->a[0].fg.join
1f9e0 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  type = 0;.  }.}.
1f9f0 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74  ./*.** Begin a t
1fa00 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
1fa10 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54  id sqlite3BeginT
1fa20 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
1fa30 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79   *pParse, int ty
1fa40 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pe){.  sqlite3 *
1fa50 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
1fa60 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72   int i;..  asser
1fa70 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
1fa80 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
1fa90 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  b;.  assert( db!
1faa0 3d 30 20 29 3b 0a 2f 2a 20 20 69 66 28 20 64 62  =0 );./*  if( db
1fab0 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20  ->aDb[0].pBt==0 
1fac0 29 20 72 65 74 75 72 6e 3b 20 2a 2f 0a 20 20 69  ) return; */.  i
1fad0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1fae0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1faf0 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
1fb00 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29  "BEGIN", 0, 0) )
1fb10 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
1fb20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  }.  v = sqlite3G
1fb30 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
1fb40 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72    if( !v ) retur
1fb50 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54  n;.  if( type!=T
1fb60 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20  K_DEFERRED ){.  
1fb70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
1fb80 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
1fb90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1fba0 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61  Op2(v, OP_Transa
1fbb0 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d  ction, i, (type=
1fbc0 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31  =TK_EXCLUSIVE)+1
1fbd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1fbe0 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
1fbf0 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   i);.    }.  }. 
1fc00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1fc10 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  p2(v, OP_AutoCom
1fc20 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f  mit, 0, 0);.}../
1fc30 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72  *.** Commit a tr
1fc40 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
1fc50 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54  d sqlite3CommitT
1fc60 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
1fc70 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
1fc80 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28  e *v;..  assert(
1fc90 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20   pParse!=0 );.  
1fca0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1fcb0 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  db!=0 );.  if( s
1fcc0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1fcd0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
1fce0 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d  RANSACTION, "COM
1fcf0 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20  MIT", 0, 0) ){. 
1fd00 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1fd10 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1fd20 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
1fd30 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
1fd40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1fd50 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
1fd60 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  1, 0);.  }.}../*
1fd70 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74  .** Rollback a t
1fd80 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
1fd90 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  id sqlite3Rollba
1fda0 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  ckTransaction(Pa
1fdb0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
1fdc0 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65  Vdbe *v;..  asse
1fdd0 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
1fde0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1fdf0 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  e->db!=0 );.  if
1fe00 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1fe10 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
1fe20 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
1fe30 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29  ROLLBACK", 0, 0)
1fe40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
1fe50 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65    }.  v = sqlite
1fe60 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1fe70 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
1fe80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1fe90 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  p2(v, OP_AutoCom
1fea0 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a  mit, 1, 1);.  }.
1feb0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1fec0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1fed0 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
1fee0 68 65 6e 20 69 74 20 70 61 72 73 65 73 20 61 20  hen it parses a 
1fef0 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65 61 74  command to creat
1ff00 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72  e,.** release or
1ff10 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c   rollback an SQL
1ff20 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a   savepoint. .*/.
1ff30 76 6f 69 64 20 73 71 6c 69 74 65 33 53 61 76 65  void sqlite3Save
1ff40 70 6f 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61  point(Parse *pPa
1ff50 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b  rse, int op, Tok
1ff60 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68  en *pName){.  ch
1ff70 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ar *zName = sqli
1ff80 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1ff90 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
1ffa0 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
1ffb0 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
1ffc0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1ffd0 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65  (pParse);.#ifnde
1ffe0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1fff0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
20000 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
20010 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d 20 3d  r * const az[] =
20020 20 7b 20 22 42 45 47 49 4e 22 2c 20 22 52 45 4c   { "BEGIN", "REL
20030 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43 4b  EASE", "ROLLBACK
20040 22 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  " };.    assert(
20050 20 21 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49   !SAVEPOINT_BEGI
20060 4e 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52  N && SAVEPOINT_R
20070 45 4c 45 41 53 45 3d 3d 31 20 26 26 20 53 41 56  ELEASE==1 && SAV
20080 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d  EPOINT_ROLLBACK=
20090 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  =2 );.#endif.   
200a0 20 69 66 28 20 21 76 20 7c 7c 20 73 71 6c 69 74   if( !v || sqlit
200b0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
200c0 73 65 2c 20 53 51 4c 49 54 45 5f 53 41 56 45 50  se, SQLITE_SAVEP
200d0 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e  OINT, az[op], zN
200e0 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ame, 0) ){.     
200f0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
20100 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Parse->db, zName
20110 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
20120 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
20130 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
20140 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f 70  OP_Savepoint, op
20150 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 50  , 0, 0, zName, P
20160 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
20170 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
20180 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61  re the TEMP data
20190 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64  base is open and
201a0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
201b0 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  se.  Return.** t
201c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
201d0 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20  ors.  Leave any 
201e0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
201f0 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
20200 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ucture..*/.int s
20210 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61  qlite3OpenTempDa
20220 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50  tabase(Parse *pP
20230 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
20240 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
20250 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62  b;.  if( db->aDb
20260 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70  [1].pBt==0 && !p
20270 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
20280 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
20290 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20    Btree *pBt;.  
202a0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69    static const i
202b0 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20 20 20 20  nt flags = .    
202c0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
202d0 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20  N_READWRITE |.  
202e0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
202f0 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
20300 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
20310 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20  EN_EXCLUSIVE |. 
20320 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
20330 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
20340 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  SE |.          S
20350 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
20360 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  DB;..    rc = sq
20370 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64  lite3BtreeOpen(d
20380 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c 20  b->pVfs, 0, db, 
20390 26 70 42 74 2c 20 30 2c 20 66 6c 61 67 73 29 3b  &pBt, 0, flags);
203a0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
203b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
203c0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
203d0 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
203e0 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
203f0 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20  ary database ". 
20400 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72         "file for
20410 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61   storing tempora
20420 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20  ry tables");.   
20430 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
20440 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
20450 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62   1;.    }.    db
20460 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20 3d 20 70  ->aDb[1].pBt = p
20470 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
20480 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
20490 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51  ma );.    if( SQ
204a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69  LITE_NOMEM==sqli
204b0 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
204c0 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78  ize(pBt, db->nex
204d0 74 50 61 67 65 73 69 7a 65 2c 20 2d 31 2c 20 30  tPagesize, -1, 0
204e0 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d  ) ){.      db->m
204f0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
20500 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
20510 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
20520 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
20530 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
20540 74 68 61 74 20 74 68 65 20 73 63 68 65 6d 61 20  that the schema 
20550 63 6f 6f 6b 69 65 20 77 69 6c 6c 20 6e 65 65 64  cookie will need
20560 20 74 6f 20 62 65 20 76 65 72 69 66 69 65 64 0a   to be verified.
20570 2a 2a 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  ** for database 
20580 69 44 62 2e 20 20 54 68 65 20 63 6f 64 65 20 74  iDb.  The code t
20590 6f 20 61 63 74 75 61 6c 6c 79 20 76 65 72 69 66  o actually verif
205a0 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
205b0 6b 69 65 0a 2a 2a 20 77 69 6c 6c 20 6f 63 63 75  kie.** will occu
205c0 72 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  r at the end of 
205d0 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 56 44  the top-level VD
205e0 42 45 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 67  BE and will be g
205f0 65 6e 65 72 61 74 65 64 0a 2a 2a 20 6c 61 74 65  enerated.** late
20600 72 2c 20 62 79 20 73 71 6c 69 74 65 33 46 69 6e  r, by sqlite3Fin
20610 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a  ishCoding()..*/.
20620 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
20630 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72  VerifySchema(Par
20640 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
20650 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  iDb){.  Parse *p
20660 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
20670 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
20680 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
20690 65 33 20 2a 64 62 20 3d 20 70 54 6f 70 6c 65 76  e3 *db = pToplev
206a0 65 6c 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72  el->db;..  asser
206b0 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
206c0 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
206d0 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44  sert( db->aDb[iD
206e0 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62  b].pBt!=0 || iDb
206f0 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
20700 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f   iDb<SQLITE_MAX_
20710 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20  ATTACHED+2 );.  
20720 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
20730 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
20740 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
20750 69 66 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70  if( DbMaskTest(p
20760 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
20770 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20 29 7b  Mask, iDb)==0 ){
20780 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70  .    DbMaskSet(p
20790 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
207a0 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 20 20  Mask, iDb);.    
207b0 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69  pToplevel->cooki
207c0 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62  eValue[iDb] = db
207d0 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
207e0 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  ma->schema_cooki
207f0 65 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54  e;.    if( !OMIT
20800 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
20810 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
20820 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
20830 73 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20  se(pToplevel);. 
20840 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
20850 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 44  * If argument zD
20860 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  b is NULL, then 
20870 63 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 64 65  call sqlite3Code
20880 56 65 72 69 66 79 53 63 68 65 6d 61 28 29 20 66  VerifySchema() f
20890 6f 72 20 65 61 63 68 20 0a 2a 2a 20 61 74 74 61  or each .** atta
208a0 63 68 65 64 20 64 61 74 61 62 61 73 65 2e 20 4f  ched database. O
208b0 74 68 65 72 77 69 73 65 2c 20 69 6e 76 6f 6b 65  therwise, invoke
208c0 20 69 74 20 66 6f 72 20 74 68 65 20 64 61 74 61   it for the data
208d0 62 61 73 65 20 6e 61 6d 65 64 20 7a 44 62 20 6f  base named zDb o
208e0 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nly..*/.void sql
208f0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61  ite3CodeVerifyNa
20900 6d 65 64 53 63 68 65 6d 61 28 50 61 72 73 65 20  medSchema(Parse 
20910 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
20920 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73 71 6c  har *zDb){.  sql
20930 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
20940 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  e->db;.  int i;.
20950 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
20960 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
20970 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
20980 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
20990 44 62 2d 3e 70 42 74 20 26 26 20 28 21 7a 44 62  Db->pBt && (!zDb
209a0 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   || 0==sqlite3St
209b0 72 49 43 6d 70 28 7a 44 62 2c 20 70 44 62 2d 3e  rICmp(zDb, pDb->
209c0 7a 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20 20 20  zName)) ){.     
209d0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
209e0 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
209f0 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   i);.    }.  }.}
20a00 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
20a10 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
20a20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69  prepares for doi
20a30 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  ng an operation 
20a40 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68  that.** might ch
20a50 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73  ange the databas
20a60 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
20a70 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e  utine starts a n
20a80 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ew transaction i
20a90 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72  f we are not alr
20aa0 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61  eady within.** a
20ab0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
20ac0 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
20ad0 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
20ae0 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68  ction, then a ch
20af0 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73  eckpoint.** is s
20b00 65 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61  et if the setSta
20b10 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72  tement parameter
20b20 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65   is true.  A che
20b30 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a  ckpoint should.*
20b40 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65  * be set for ope
20b50 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67  rations that mig
20b60 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20  ht fail (due to 
20b70 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61  a constraint) pa
20b80 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79  rt of.** the way
20b90 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69   through and whi
20ba0 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  ch will need to 
20bb0 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73  undo some writes
20bc0 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
20bd0 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74  to.** rollback t
20be0 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63  he whole transac
20bf0 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61  tion.  For opera
20c00 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20  tions where all 
20c10 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63  constraints.** c
20c20 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65  an be checked be
20c30 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
20c40 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65   are made to the
20c50 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73   database, it is
20c60 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73   never.** necess
20c70 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72  ary to undo a wr
20c80 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63  ite and the chec
20c90 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f  kpoint should no
20ca0 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69  t be set..*/.voi
20cb0 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72  d sqlite3BeginWr
20cc0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72  iteOperation(Par
20cd0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
20ce0 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e  setStatement, in
20cf0 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20  t iDb){.  Parse 
20d00 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
20d10 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
20d20 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  l(pParse);.  sql
20d30 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
20d40 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
20d50 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70  );.  DbMaskSet(p
20d60 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65 4d  Toplevel->writeM
20d70 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f  ask, iDb);.  pTo
20d80 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57  plevel->isMultiW
20d90 72 69 74 65 20 7c 3d 20 73 65 74 53 74 61 74 65  rite |= setState
20da0 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ment;.}../*.** I
20db0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
20dc0 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72 72 65   statement curre
20dd0 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
20de0 72 75 63 74 69 6f 6e 20 6d 69 67 68 74 20 77 72  ruction might wr
20df0 69 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e  ite.** more than
20e00 20 6f 6e 65 20 65 6e 74 72 79 20 28 65 78 61 6d   one entry (exam
20e10 70 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e  ple: deleting on
20e20 65 20 72 6f 77 20 74 68 65 6e 20 69 6e 73 65 72  e row then inser
20e30 74 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a  ting another,.**
20e40 20 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74 69   inserting multi
20e50 70 6c 65 20 72 6f 77 73 20 69 6e 20 61 20 74 61  ple rows in a ta
20e60 62 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e  ble, or insertin
20e70 67 20 61 20 72 6f 77 20 61 6e 64 20 69 6e 64 65  g a row and inde
20e80 78 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49  x entries.).** I
20e90 66 20 61 6e 20 61 62 6f 72 74 20 6f 63 63 75 72  f an abort occur
20ea0 73 20 61 66 74 65 72 20 73 6f 6d 65 20 6f 66 20  s after some of 
20eb0 74 68 65 73 65 20 77 72 69 74 65 73 20 68 61 76  these writes hav
20ec0 65 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65  e completed, the
20ed0 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  n it will.** be 
20ee0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64  necessary to und
20ef0 6f 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 64 20  o the completed 
20f00 77 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  writes..*/.void 
20f10 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74  sqlite3MultiWrit
20f20 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
20f30 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
20f40 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
20f50 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
20f60 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c  se);.  pToplevel
20f70 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 3d  ->isMultiWrite =
20f80 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68   1;.}../* .** Th
20f90 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
20fa0 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
20fb0 69 6e 65 20 69 66 20 69 73 20 64 69 73 63 6f 76  ine if is discov
20fc0 65 72 73 20 74 68 61 74 20 69 74 20 69 73 0a 2a  ers that it is.*
20fd0 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 62  * possible to ab
20fe0 6f 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ort a statement 
20ff0 70 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74  prior to complet
21000 69 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20 74  ion.  In order t
21010 6f 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68  o .** perform th
21020 69 73 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74  is abort without
21030 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20   corrupting the 
21040 64 61 74 61 62 61 73 65 2c 20 77 65 20 6e 65 65  database, we nee
21050 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72  d to make.** sur
21060 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65  e that the state
21070 6d 65 6e 74 20 69 73 20 70 72 6f 74 65 63 74 65  ment is protecte
21080 64 20 62 79 20 61 20 73 74 61 74 65 6d 65 6e 74  d by a statement
21090 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
210a0 0a 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c  .** Technically,
210b0 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f   we only need to
210c0 20 73 65 74 20 74 68 65 20 6d 61 79 41 62 6f 72   set the mayAbor
210d0 74 20 66 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a  t flag if the.**
210e0 20 69 73 4d 75 6c 74 69 57 72 69 74 65 20 66 6c   isMultiWrite fl
210f0 61 67 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ag was previousl
21100 79 20 73 65 74 2e 20 20 54 68 65 72 65 20 69 73  y set.  There is
21110 20 61 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e   a time dependen
21120 63 79 0a 2a 2a 20 73 75 63 68 20 74 68 61 74 20  cy.** such that 
21130 74 68 65 20 61 62 6f 72 74 20 6d 75 73 74 20 6f  the abort must o
21140 63 63 75 72 20 61 66 74 65 72 20 74 68 65 20 6d  ccur after the m
21150 75 6c 74 69 77 72 69 74 65 2e 20 20 54 68 69 73  ultiwrite.  This
21160 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73   makes.** some s
21170 74 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76  tatements involv
21180 69 6e 67 20 74 68 65 20 52 45 50 4c 41 43 45 20  ing the REPLACE 
21190 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
211a0 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a  ion algorithm.**
211b0 20 67 6f 20 61 20 6c 69 74 74 6c 65 20 66 61 73   go a little fas
211c0 74 65 72 2e 20 20 42 75 74 20 74 61 6b 69 6e 67  ter.  But taking
211d0 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68   advantage of th
211e0 69 73 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e  is time dependen
211f0 63 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d  cy.** makes it m
21200 6f 72 65 20 64 69 66 66 69 63 75 6c 74 20 74 6f  ore difficult to
21210 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20   prove that the 
21220 63 6f 64 65 20 69 73 20 63 6f 72 72 65 63 74 20  code is correct 
21230 28 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c  (in .** particul
21240 61 72 2c 20 69 74 20 70 72 65 76 65 6e 74 73 20  ar, it prevents 
21250 75 73 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20  us from writing 
21260 61 6e 20 65 66 66 65 63 74 69 76 65 0a 2a 2a 20  an effective.** 
21270 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
21280 66 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d  f sqlite3AssertM
21290 61 79 41 62 6f 72 74 28 29 29 20 61 6e 64 20 73  ayAbort()) and s
212a0 6f 20 77 65 20 68 61 76 65 20 63 68 6f 73 65 6e  o we have chosen
212b0 0a 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68 65 20  .** to take the 
212c0 73 61 66 65 20 72 6f 75 74 65 20 61 6e 64 20 73  safe route and s
212d0 6b 69 70 20 74 68 65 20 6f 70 74 69 6d 69 7a 61  kip the optimiza
212e0 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
212f0 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 50 61  lite3MayAbort(Pa
21300 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
21310 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
21320 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
21330 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
21340 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61  .  pToplevel->ma
21350 79 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f  yAbort = 1;.}../
21360 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
21370 48 61 6c 74 20 74 68 61 74 20 63 61 75 73 65 73  Halt that causes
21380 20 74 68 65 20 76 64 62 65 20 74 6f 20 72 65 74   the vdbe to ret
21390 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  urn an SQLITE_CO
213a0 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f  NSTRAINT.** erro
213b0 72 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72 20 70  r. The onError p
213c0 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69  arameter determi
213d0 6e 65 73 20 77 68 69 63 68 20 28 69 66 20 61 6e  nes which (if an
213e0 79 29 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  y) of the statem
213f0 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75  ent.** and/or cu
21400 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
21410 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
21420 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
21430 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
21440 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
21450 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
21460 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
21470 20 65 72 72 43 6f 64 65 2c 20 20 20 20 20 20 2f   errCode,      /
21480 2a 20 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72  * extended error
21490 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   code */.  int o
214a0 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
214b0 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20  Constraint type 
214c0 2a 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c 20 20  */.  char *p4,  
214d0 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
214e0 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 69 38 20  message */.  i8 
214f0 70 34 74 79 70 65 2c 20 20 20 20 20 20 20 20 2f  p4type,        /
21500 2a 20 50 34 5f 53 54 41 54 49 43 20 6f 72 20 50  * P4_STATIC or P
21510 34 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 20  4_TRANSIENT */. 
21520 20 75 38 20 70 35 45 72 72 6d 73 67 20 20 20 20   u8 p5Errmsg    
21530 20 20 20 2f 2a 20 50 35 5f 45 72 72 4d 73 67 20     /* P5_ErrMsg 
21540 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  type */.){.  Vdb
21550 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
21560 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
21570 20 61 73 73 65 72 74 28 20 28 65 72 72 43 6f 64   assert( (errCod
21580 65 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  e&0xff)==SQLITE_
21590 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20 20  CONSTRAINT );.  
215a0 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  if( onError==OE_
215b0 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 73 71 6c  Abort ){.    sql
215c0 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
215d0 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rse);.  }.  sqli
215e0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
215f0 20 4f 50 5f 48 61 6c 74 2c 20 65 72 72 43 6f 64   OP_Halt, errCod
21600 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70  e, onError, 0, p
21610 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 69 66  4, p4type);.  if
21620 28 20 70 35 45 72 72 6d 73 67 20 29 20 73 71 6c  ( p5Errmsg ) sql
21630 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
21640 28 76 2c 20 70 35 45 72 72 6d 73 67 29 3b 0a 7d  (v, p5Errmsg);.}
21650 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
21660 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 55  OP_Halt due to U
21670 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59  NIQUE or PRIMARY
21680 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
21690 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  violation..*/.vo
216a0 69 64 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65  id sqlite3Unique
216b0 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61  Constraint(.  Pa
216c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
216d0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
216e0 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  xt */.  int onEr
216f0 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e  ror,      /* Con
21700 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a  straint type */.
21710 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
21720 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
21730 20 74 68 61 74 20 74 72 69 67 67 65 72 73 20 74   that triggers t
21740 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  he constraint */
21750 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  .){.  char *zErr
21760 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 53 74 72  ;.  int j;.  Str
21770 41 63 63 75 6d 20 65 72 72 4d 73 67 3b 0a 20 20  Accum errMsg;.  
21780 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
21790 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 73  dx->pTable;..  s
217a0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
217b0 69 74 28 26 65 72 72 4d 73 67 2c 20 70 50 61 72  it(&errMsg, pPar
217c0 73 65 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 32 30  se->db, 0, 0, 20
217d0 30 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  0);.  for(j=0; j
217e0 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
217f0 6a 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  j++){.    char *
21800 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
21810 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  l[pIdx->aiColumn
21820 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  [j]].zName;.    
21830 69 66 28 20 6a 20 29 20 73 71 6c 69 74 65 33 53  if( j ) sqlite3S
21840 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 65  trAccumAppend(&e
21850 72 72 4d 73 67 2c 20 22 2c 20 22 2c 20 32 29 3b  rrMsg, ", ", 2);
21860 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41  .    sqlite3StrA
21870 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 65  ccumAppendAll(&e
21880 72 72 4d 73 67 2c 20 70 54 61 62 2d 3e 7a 4e 61  rrMsg, pTab->zNa
21890 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
218a0 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
218b0 65 72 72 4d 73 67 2c 20 22 2e 22 2c 20 31 29 3b  errMsg, ".", 1);
218c0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41  .    sqlite3StrA
218d0 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 65  ccumAppendAll(&e
218e0 72 72 4d 73 67 2c 20 7a 43 6f 6c 29 3b 0a 20 20  rrMsg, zCol);.  
218f0 7d 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74  }.  zErr = sqlit
21900 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
21910 28 26 65 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c  (&errMsg);.  sql
21920 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69  ite3HaltConstrai
21930 6e 74 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  nt(pParse, .    
21940 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
21950 78 28 70 49 64 78 29 20 3f 20 53 51 4c 49 54 45  x(pIdx) ? SQLITE
21960 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d  _CONSTRAINT_PRIM
21970 41 52 59 4b 45 59 20 0a 20 20 20 20 20 20 20 20  ARYKEY .        
21980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21990 20 20 20 20 3a 20 53 51 4c 49 54 45 5f 43 4f 4e      : SQLITE_CON
219a0 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 2c 0a  STRAINT_UNIQUE,.
219b0 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20 7a 45 72      onError, zEr
219c0 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 20 50  r, P4_DYNAMIC, P
219d0 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71  5_ConstraintUniq
219e0 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ue);.}.../*.** C
219f0 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64  ode an OP_Halt d
21a00 75 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69 71 75 65  ue to non-unique
21a10 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20   rowid..*/.void 
21a20 73 71 6c 69 74 65 33 52 6f 77 69 64 43 6f 6e 73  sqlite3RowidCons
21a30 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20  traint(.  Parse 
21a40 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
21a50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
21a60 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
21a70 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63        /* Conflic
21a80 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
21a90 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 54 61 62 6c  orithm */.  Tabl
21aa0 65 20 2a 70 54 61 62 20 20 20 20 20 20 20 2f 2a  e *pTab       /*
21ab0 20 54 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   The table with 
21ac0 74 68 65 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72  the non-unique r
21ad0 6f 77 69 64 20 2a 2f 20 0a 29 7b 0a 20 20 63 68  owid */ .){.  ch
21ae0 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 69 6e 74 20  ar *zMsg;.  int 
21af0 72 63 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  rc;.  if( pTab->
21b00 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20  iPKey>=0 ){.    
21b10 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
21b20 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
21b30 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d  , "%s.%s", pTab-
21b40 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
21b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b60 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61    pTab->aCol[pTa
21b70 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29  b->iPKey].zName)
21b80 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
21b90 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49  E_CONSTRAINT_PRI
21ba0 4d 41 52 59 4b 45 59 3b 0a 20 20 7d 65 6c 73 65  MARYKEY;.  }else
21bb0 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  {.    zMsg = sql
21bc0 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
21bd0 73 65 2d 3e 64 62 2c 20 22 25 73 2e 72 6f 77 69  se->db, "%s.rowi
21be0 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
21bf0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
21c00 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57  E_CONSTRAINT_ROW
21c10 49 44 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ID;.  }.  sqlite
21c20 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
21c30 70 50 61 72 73 65 2c 20 72 63 2c 20 6f 6e 45 72  pParse, rc, onEr
21c40 72 6f 72 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  ror, zMsg, P4_DY
21c50 4e 41 4d 49 43 2c 0a 20 20 20 20 20 20 20 20 20  NAMIC,.         
21c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
21c70 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71  5_ConstraintUniq
21c80 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ue);.}../*.** Ch
21c90 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49  eck to see if pI
21ca0 6e 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f  ndex uses the co
21cb0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
21cc0 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a   pColl.  Return.
21cd0 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  ** true if it do
21ce0 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  es and false if 
21cf0 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a  it does not..*/.
21d00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21d10 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
21d20 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e  ic int collation
21d30 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72  Match(const char
21d40 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a   *zColl, Index *
21d50 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69  pIndex){.  int i
21d60 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c  ;.  assert( zCol
21d70 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  l!=0 );.  for(i=
21d80 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f  0; i<pIndex->nCo
21d90 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
21da0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
21db0 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
21dc0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  ];.    assert( z
21dd0 21 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 61  !=0 || pIndex->a
21de0 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20 29 3b 0a  iColumn[i]<0 );.
21df0 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
21e00 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26  aiColumn[i]>=0 &
21e10 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  & 0==sqlite3StrI
21e20 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b  Cmp(z, zColl) ){
21e30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
21e40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
21e50 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
21e60 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65  ./*.** Recompute
21e70 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
21e80 70 54 61 62 20 74 68 61 74 20 75 73 65 20 74 68  pTab that use th
21e90 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
21ea0 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49  ence pColl..** I
21eb0 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20  f pColl==0 then 
21ec0 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  recompute all in
21ed0 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a  dices of pTab..*
21ee0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
21ef0 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
21f00 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65  atic void reinde
21f10 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  xTable(Parse *pP
21f20 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
21f30 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  b, char const *z
21f40 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a  Coll){.  Index *
21f50 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  pIndex;         
21f60 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
21f70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
21f80 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28   pTab */..  for(
21f90 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e  pIndex=pTab->pIn
21fa0 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e  dex; pIndex; pIn
21fb0 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78  dex=pIndex->pNex
21fc0 74 29 7b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c  t){.    if( zCol
21fd0 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f  l==0 || collatio
21fe0 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49  nMatch(zColl, pI
21ff0 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20 69  ndex) ){.      i
22000 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
22010 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
22020 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
22030 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
22040 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
22050 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
22060 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 0, iDb);.    
22070 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
22080 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
22090 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a  dex, -1);.    }.
220a0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
220b0 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c  .** Recompute al
220c0 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c  l indices of all
220d0 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64   tables in all d
220e0 61 74 61 62 61 73 65 73 20 77 68 65 72 65 20 74  atabases where t
220f0 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75 73  he.** indices us
22100 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  e the collating 
22110 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20  sequence pColl. 
22120 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65   If pColl==0 the
22130 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61  n recompute.** a
22140 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65 72 79  ll indices every
22150 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  where..*/.#ifnde
22160 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
22170 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69  INDEX.static voi
22180 64 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73  d reindexDatabas
22190 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
221a0 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43  , char const *zC
221b0 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b  oll){.  Db *pDb;
221c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221d0 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
221e0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
221f0 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
22200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22210 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
22220 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69  number */.  sqli
22230 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
22240 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64  ->db;   /* The d
22250 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
22260 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d  on */.  HashElem
22270 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20   *k;            
22280 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
22290 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69  ng over tables i
222a0 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65  n pDb */.  Table
222b0 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
222c0 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c         /* A tabl
222d0 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
222e0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
222f0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
22300 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20  sAllMutexes(db) 
22310 29 3b 20 20 2f 2a 20 4e 65 65 64 65 64 20 66 6f  );  /* Needed fo
22320 72 20 73 63 68 65 6d 61 20 61 63 63 65 73 73 20  r schema access 
22330 2a 2f 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20  */.  for(iDb=0, 
22340 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62  pDb=db->aDb; iDb
22350 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c  <db->nDb; iDb++,
22360 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73   pDb++){.    ass
22370 65 72 74 28 20 70 44 62 21 3d 30 20 29 3b 0a 20  ert( pDb!=0 );. 
22380 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48     for(k=sqliteH
22390 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70  ashFirst(&pDb->p
223a0 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
223b0 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61  ;  k; k=sqliteHa
223c0 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20  shNext(k)){.    
223d0 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a    pTab = (Table*
223e0 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
223f0 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65  k);.      reinde
22400 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  xTable(pParse, p
22410 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  Tab, zColl);.   
22420 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
22430 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
22440 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45 49  code for the REI
22450 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
22460 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
22470 45 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EX              
22480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
22490 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   1.**        REI
224a0 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e  NDEX  <collation
224b0 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >               
224c0 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 2.**        R
224d0 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61  EINDEX  ?<databa
224e0 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e  se>.?<tablename>
224f0 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20    -- 3.**       
22500 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61   REINDEX  ?<data
22510 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d  base>.?<indexnam
22520 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46  e>  -- 4.**.** F
22530 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c  orm 1 causes all
22540 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20   indices in all 
22550 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
22560 65 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74  es to be rebuilt
22570 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75  ..** Form 2 rebu
22580 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  ilds all indices
22590 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65   in all database
225a0 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20 6e  s that use the n
225b0 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e  amed.** collatin
225c0 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72  g function.  For
225d0 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62 75 69  ms 3 and 4 rebui
225e0 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  ld the named ind
225f0 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64  ex or all.** ind
22600 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
22610 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74  with the named t
22620 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  able..*/.#ifndef
22630 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
22640 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65  NDEX.void sqlite
22650 33 52 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a  3Reindex(Parse *
22660 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
22670 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Name1, Token *pN
22680 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  ame2){.  CollSeq
22690 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *pColl;        
226a0 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
226b0 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65  g sequence to be
226c0 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e   reindexed, or N
226d0 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ULL */.  char *z
226e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
226f0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
22700 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
22710 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
22720 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20   *zDb;          
22730 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
22740 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54   database */.  T
22750 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
22760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
22770 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
22780 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78  abase */.  Index
22790 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
227a0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
227b0 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
227c0 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  th pTab */.  int
227d0 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
227e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
227f0 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e  database index n
22800 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
22810 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
22820 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  >db;   /* The da
22830 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
22840 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f  n */.  Token *pO
22850 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  bjName;         
22860 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
22870 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
22880 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
22890 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   */..  /* Read t
228a0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
228b0 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ma. If an error 
228c0 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
228d0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
228e0 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20   ** and code in 
228f0 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
22900 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28  n NULL. */.  if(
22910 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
22920 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
22930 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74  arse) ){.    ret
22940 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  urn;.  }..  if( 
22950 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20  pName1==0 ){.   
22960 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
22970 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20  s(pParse, 0);.  
22980 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73    return;.  }els
22990 65 20 69 66 28 20 4e 45 56 45 52 28 70 4e 61 6d  e if( NEVER(pNam
229a0 65 32 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32  e2==0) || pName2
229b0 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68  ->z==0 ){.    ch
229c0 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61  ar *zColl;.    a
229d0 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a  ssert( pName1->z
229e0 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20   );.    zColl = 
229f0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
22a00 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
22a10 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66   pName1);.    if
22a20 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72  ( !zColl ) retur
22a30 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  n;.    pColl = s
22a40 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
22a50 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a  q(db, ENC(db), z
22a60 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66  Coll, 0);.    if
22a70 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
22a80 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
22a90 73 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  s(pParse, zColl)
22aa0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
22ab0 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29  bFree(db, zColl)
22ac0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
22ad0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
22ae0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c  3DbFree(db, zCol
22af0 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  l);.  }.  iDb = 
22b00 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
22b10 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
22b20 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a  1, pName2, &pObj
22b30 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62  Name);.  if( iDb
22b40 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  <0 ) return;.  z
22b50 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
22b60 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a  omToken(db, pObj
22b70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  Name);.  if( z==
22b80 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44  0 ) return;.  zD
22b90 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
22ba0 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d  .zName;.  pTab =
22bb0 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
22bc0 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20  e(db, z, zDb);. 
22bd0 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
22be0 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
22bf0 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a  arse, pTab, 0);.
22c00 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
22c10 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65  e(db, z);.    re
22c20 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64  turn;.  }.  pInd
22c30 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ex = sqlite3Find
22c40 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62  Index(db, z, zDb
22c50 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
22c60 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28  ee(db, z);.  if(
22c70 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73   pIndex ){.    s
22c80 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
22c90 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
22ca0 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 0, iDb);.    s
22cb0 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
22cc0 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
22cd0 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72  , -1);.    retur
22ce0 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
22cf0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
22d00 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e   "unable to iden
22d10 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20  tify the object 
22d20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 22  to be reindexed"
22d30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
22d40 2a 2a 20 52 65 74 75 72 6e 20 61 20 4b 65 79 49  ** Return a KeyI
22d50 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
22d60 61 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  at is appropriat
22d70 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  e for the given 
22d80 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Index..**.** The
22d90 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
22da0 72 65 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20  re for an index 
22db0 69 73 20 63 61 63 68 65 64 20 69 6e 20 74 68 65  is cached in the
22dc0 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 0a 2a   Index object..*
22dd0 2a 20 53 6f 20 74 68 65 72 65 20 6d 69 67 68 74  * So there might
22de0 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 72 65 66   be multiple ref
22df0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 72  erences to the r
22e00 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 2e  eturned pointer.
22e10 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20    The.** caller 
22e20 73 68 6f 75 6c 64 20 6e 6f 74 20 74 72 79 20 74  should not try t
22e30 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 4b 65 79  o modify the Key
22e40 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  Info object..**.
22e50 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68  ** The caller sh
22e60 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69  ould invoke sqli
22e70 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
22e80 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65  ) on the returne
22e90 64 20 6f 62 6a 65 63 74 0a 2a 2a 20 77 68 65 6e  d object.** when
22ea0 20 69 74 20 68 61 73 20 66 69 6e 69 73 68 65 64   it has finished
22eb0 20 75 73 69 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65   using it..*/.Ke
22ec0 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65  yInfo *sqlite3Ke
22ed0 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 50 61 72  yInfoOfIndex(Par
22ee0 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65  se *pParse, Inde
22ef0 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20  x *pIdx){.  int 
22f00 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  i;.  int nCol = 
22f10 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  pIdx->nColumn;. 
22f20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64 78   int nKey = pIdx
22f30 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 4b 65 79  ->nKeyCol;.  Key
22f40 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20 20 69 66  Info *pKey;.  if
22f50 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
22f60 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
22f70 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75   pIdx->uniqNotNu
22f80 6c 6c 20 29 7b 0a 20 20 20 20 70 4b 65 79 20 3d  ll ){.    pKey =
22f90 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
22fa0 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
22fb0 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79   nKey, nCol-nKey
22fc0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
22fd0 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65  pKey = sqlite3Ke
22fe0 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73  yInfoAlloc(pPars
22ff0 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b  e->db, nCol, 0);
23000 0a 20 20 7d 0a 20 20 69 66 28 20 70 4b 65 79 20  .  }.  if( pKey 
23010 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
23020 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
23030 72 69 74 65 61 62 6c 65 28 70 4b 65 79 29 20 29  riteable(pKey) )
23040 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
23050 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
23060 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d     char *zColl =
23070 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d   pIdx->azColl[i]
23080 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
23090 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 20 20  zColl!=0 );.    
230a0 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d    pKey->aColl[i]
230b0 20 3d 20 73 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c   = strcmp(zColl,
230c0 22 42 49 4e 41 52 59 22 29 3d 3d 30 20 3f 20 30  "BINARY")==0 ? 0
230d0 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   :.             
230e0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
230f0 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
23100 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a  pParse, zColl);.
23110 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72        pKey->aSor
23120 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 64 78  tOrder[i] = pIdx
23130 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b  ->aSortOrder[i];
23140 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
23150 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
23160 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49       sqlite3KeyI
23170 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 29 3b 0a  nfoUnref(pKey);.
23180 20 20 20 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a        pKey = 0;.
23190 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
231a0 72 6e 20 70 4b 65 79 3b 0a 7d 0a 0a 23 69 66 6e  rn pKey;.}..#ifn
231b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
231c0 43 54 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  CTE./* .** This 
231d0 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b  routine is invok
231e0 65 64 20 6f 6e 63 65 20 70 65 72 20 43 54 45 20  ed once per CTE 
231f0 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
23200 69 6c 65 20 70 61 72 73 69 6e 67 20 61 20 0a 2a  ile parsing a .*
23210 2a 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20 0a  * WITH clause. .
23220 2a 2f 0a 57 69 74 68 20 2a 73 71 6c 69 74 65 33  */.With *sqlite3
23230 57 69 74 68 41 64 64 28 0a 20 20 50 61 72 73 65  WithAdd(.  Parse
23240 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
23250 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
23260 6e 74 65 78 74 20 2a 2f 0a 20 20 57 69 74 68 20  ntext */.  With 
23270 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20 20 20  *pWith,         
23280 20 20 20 2f 2a 20 45 78 69 73 74 69 6e 67 20 57     /* Existing W
23290 49 54 48 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e  ITH clause, or N
232a0 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
232b0 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  pName,          
232c0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
232d0 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 20 2a 2f 0a  common-table */.
232e0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41 72 67    ExprList *pArg
232f0 6c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4f 70 74  list,     /* Opt
23300 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ional column nam
23310 65 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20 74  e list for the t
23320 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  able */.  Select
23330 20 2a 70 51 75 65 72 79 20 20 20 20 20 20 20 20   *pQuery        
23340 20 20 2f 2a 20 51 75 65 72 79 20 75 73 65 64 20    /* Query used 
23350 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  to initialize th
23360 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  e table */.){.  
23370 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
23380 61 72 73 65 2d 3e 64 62 3b 0a 20 20 57 69 74 68  arse->db;.  With
23390 20 2a 70 4e 65 77 3b 0a 20 20 63 68 61 72 20 2a   *pNew;.  char *
233a0 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 43 68 65  zName;..  /* Che
233b0 63 6b 20 74 68 61 74 20 74 68 65 20 43 54 45 20  ck that the CTE 
233c0 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 20 77  name is unique w
233d0 69 74 68 69 6e 20 74 68 69 73 20 57 49 54 48 20  ithin this WITH 
233e0 63 6c 61 75 73 65 2e 20 49 66 0a 20 20 2a 2a 20  clause. If.  ** 
233f0 6e 6f 74 2c 20 73 74 6f 72 65 20 61 6e 20 65 72  not, store an er
23400 72 6f 72 20 69 6e 20 74 68 65 20 50 61 72 73 65  ror in the Parse
23410 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20   structure. */. 
23420 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
23430 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
23440 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29  arse->db, pName)
23450 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26  ;.  if( zName &&
23460 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e   pWith ){.    in
23470 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
23480 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b  ; i<pWith->nCte;
23490 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
234a0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
234b0 7a 4e 61 6d 65 2c 20 70 57 69 74 68 2d 3e 61 5b  zName, pWith->a[
234c0 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
234d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
234e0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
234f0 22 64 75 70 6c 69 63 61 74 65 20 57 49 54 48 20  "duplicate WITH 
23500 74 61 62 6c 65 20 6e 61 6d 65 3a 20 25 73 22 2c  table name: %s",
23510 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
23520 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
23530 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69  ( pWith ){.    i
23540 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  nt nByte = sizeo
23550 66 28 2a 70 57 69 74 68 29 20 2b 20 28 73 69 7a  f(*pWith) + (siz
23560 65 6f 66 28 70 57 69 74 68 2d 3e 61 5b 31 5d 29  eof(pWith->a[1])
23570 20 2a 20 70 57 69 74 68 2d 3e 6e 43 74 65 29 3b   * pWith->nCte);
23580 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
23590 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
235a0 20 70 57 69 74 68 2c 20 6e 42 79 74 65 29 3b 0a   pWith, nByte);.
235b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
235c0 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
235d0 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
235e0 6f 66 28 2a 70 57 69 74 68 29 29 3b 0a 20 20 7d  of(*pWith));.  }
235f0 0a 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65  .  assert( zName
23600 21 3d 30 20 7c 7c 20 70 4e 65 77 3d 3d 30 20 29  !=0 || pNew==0 )
23610 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
23620 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
23630 7c 7c 20 70 4e 65 77 3d 3d 30 20 29 3b 0a 0a 20  || pNew==0 );.. 
23640 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
23650 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
23660 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 41  istDelete(db, pA
23670 72 67 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  rglist);.    sql
23680 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
23690 28 64 62 2c 20 70 51 75 65 72 79 29 3b 0a 20 20  (db, pQuery);.  
236a0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
236b0 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
236c0 70 4e 65 77 20 3d 20 70 57 69 74 68 3b 0a 20 20  pNew = pWith;.  
236d0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d  }else{.    pNew-
236e0 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70  >a[pNew->nCte].p
236f0 53 65 6c 65 63 74 20 3d 20 70 51 75 65 72 79 3b  Select = pQuery;
23700 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65  .    pNew->a[pNe
23710 77 2d 3e 6e 43 74 65 5d 2e 70 43 6f 6c 73 20 3d  w->nCte].pCols =
23720 20 70 41 72 67 6c 69 73 74 3b 0a 20 20 20 20 70   pArglist;.    p
23730 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74  New->a[pNew->nCt
23740 65 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  e].zName = zName
23750 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e  ;.    pNew->a[pN
23760 65 77 2d 3e 6e 43 74 65 5d 2e 7a 43 74 65 45 72  ew->nCte].zCteEr
23770 72 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  r = 0;.    pNew-
23780 3e 6e 43 74 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  >nCte++;.  }..  
23790 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
237a0 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 63  /*.** Free the c
237b0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 57  ontents of the W
237c0 69 74 68 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ith object passe
237d0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
237e0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  argument..*/.voi
237f0 64 20 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c  d sqlite3WithDel
23800 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
23810 20 57 69 74 68 20 2a 70 57 69 74 68 29 7b 0a 20   With *pWith){. 
23820 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20   if( pWith ){.  
23830 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
23840 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e  (i=0; i<pWith->n
23850 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cte; i++){.     
23860 20 73 74 72 75 63 74 20 43 74 65 20 2a 70 43 74   struct Cte *pCt
23870 65 20 3d 20 26 70 57 69 74 68 2d 3e 61 5b 69 5d  e = &pWith->a[i]
23880 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
23890 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
238a0 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 29 3b 0a  , pCte->pCols);.
238b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
238c0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43  ectDelete(db, pC
238d0 74 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  te->pSelect);.  
238e0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
238f0 65 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d  e(db, pCte->zNam
23900 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
23910 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
23920 70 57 69 74 68 29 3b 0a 20 20 7d 0a 7d 0a 23 65  pWith);.  }.}.#e
23930 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
23940 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45  (SQLITE_OMIT_CTE
23950 29 20 2a 2f 0a                                   ) */.